使用HttpClient向IIS网页上传大型MultipartFormDataContent的问题
问题解决思路
- 首先校验配置参数数值准确性
maxAllowedContentLength单位为字节,2GB对应数值为2147483648,且multipart表单存在边界、请求头等额外编码开销,实际请求总大小会比源文件大5%~10%,建议将该值调整为2300000000(约2.2GB)留出冗余;同时补充配置httpRuntime节点的executionTimeout参数(单位为秒),建议设置为3600匹配大文件上传的耗时需求,示例配置:<httpRuntime maxRequestLength="2252800" executionTimeout="3600" /> <!-- maxRequestLength单位为KB,2.2GB对应2252800KB --> <security> <requestFiltering> <requestLimits maxAllowedContentLength="2300000000" /> </requestFiltering> </security> - 排查服务端应用层拦截逻辑
超过阈值自动重定向到主页大概率不是IIS的默认行为,而是ASP.NET应用本身的全局请求处理逻辑导致的:检查全局Application_BeginRequest方法、自定义HttpModule、全局过滤器中是否存在上传文件大小校验规则,触发阈值后执行了重定向操作。 - 修正HttpClient请求逻辑
- 关闭请求缓冲,避免大文件上传前占用过多内存触发异常,调用
PostAsync时指定HttpCompletionOption.ResponseHeadersRead参数; - 手动指定
StreamContent的内容长度,避免默认使用分块传输编码(部分ASP.NET旧服务端不支持大文件分块传输):var streamContent = new StreamContent(file); streamContent.Headers.ContentLength = file.Length; apiRequest.Add(streamContent, fileName, fileName); - 检查代码变量一致性:你代码中构造的请求内容变量名为
apiRequest,但PostAsync传入的参数为form,确认是否为实际代码的笔误。
- 关闭请求缓冲,避免大文件上传前占用过多内存触发异常,调用
- 排查应用程序池限制
检查站点对应的应用程序池的内存回收阈值,若私有内存/虚拟内存限制设置过小,大文件上传时服务端内存占用过高会触发进程回收,导致请求中断跳转到主页,可临时关闭内存回收限制测试上传是否正常。 - 调整服务端连接超时配置
除了客户端的超时设置,还需要将IIS站点高级设置中的「连接超时」调整为至少1小时,匹配大文件上传的网络耗时。
内容的提问来源于stack exchange,提问作者Rocco_STACK
相关产品推荐
相关产品推荐

