通过进行以下更改,我能够使用 Web API 和 IIS 最多上传 4 GB。在 web api 项目中,在 web.config 中进行以下 2 处更改以设置最大长度。
<requestFiltering>
<requestLimits maxAllowedContentLength="4294967295"/>
</requestFiltering>
<httpRuntime targetFramework="4.5.2" executionTimeout="2400" maxRequestLength="2147483647"/>
在调用 web api 时在客户端添加分块标头,如下所示,这会阻止 IIS 通过流式传输文件来限制超过 2 GB 的文件-
HttpClient.DefaultRequestHeaders.Add("Transfer-Encoding", "chunked");
在服务器端(Web API 控制器)读取流之前添加以下代码,以使用重载方法 GetBufferlessInputStream(disableMaxLength) 忽略最大请求长度 2 GB-
var content = new StreamContent(HttpContext.Current.Request.GetBufferlessInputStream(true));
foreach(var header in Request.Content.Headers) {
content.Headers.TryAddWithoutValidation(header.Key, header.Value);
}
await content.ReadAsMultipartAsync(streamProvider);
更改服务器端的策略选择器,以便禁用缓冲并改为流式传输文件。添加下面的类以覆盖您的控制器的 WebHostBufferPolicySelector(例如,下面片段中的“文件”控制器)-
public class NoBufferPolicySelector: WebHostBufferPolicySelector {
public override bool UseBufferedInputStream(object hostContext) {
var context = hostContext as HttpContextBase;
if (context != null && context.Request.RequestContext.RouteData.Values["controller"] != null) {
if (string.Equals(context.Request.RequestContext.RouteData.Values["controller"].ToString(), "File", StringComparison.InvariantCultureIgnoreCase))
return false;
}
return true;
}
public override bool UseBufferedOutputStream(HttpResponseMessage response) {
return base.UseBufferedOutputStream(response);
}
}
在注册方法中添加以下内容-
GlobalConfiguration.Configuration.Services.Replace(typeof(IHostBufferPolicySelector), new NoBufferPolicySelector());
希望这可以帮助那里的任何人。