我有一个接受文件上传的Web API 2项目。上传小文件效果很好,但是当涉及到大文件时,它们根本就不会写入磁盘。在我看来,这发生在大约2 GB的文件。大约1 GB的文件上传得很好。
这些是我的web.config的相关部分:
<system.web>
<compilation debug="true" targetFramework="4.6.1" />
<httpRuntime targetFramework="4.6.1" maxRequestLength="2147483647" />
</system.web>
...
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="4294967295" />
</requestFiltering>
</security>
</system.webServer>
我从this answer获得了maxAllowedContentLength和maxRequestLength的值。
由于我运行的是IIS 8,我希望能够满足maxAllowedContentLength值。
这是负责处理上传的行动,基于菲利普W的this blog post:
[HttpPost]
public async Task<HttpResponseMessage> Post()
{
//Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string uploadPath = @"C:\temp\upload"; // in reality this is retrieved from DB
try
{
var provider = new MultipartFormDataStreamProvider(uploadPath);
var content = new StreamContent(HttpContext.Current.Request.GetBufferlessInputStream(true));
foreach (var header in Request.Content.Headers)
{
content.Headers.TryAddWithoutValidation(header.Key, header.Value);
}
var result = await content.ReadAsMultipartAsync(provider);
return Request.CreateResponse(HttpStatusCode.Accepted);
}
catch(Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}
上传小文件有效。我看到它们被写入c:\ temp \ upload。但是大文件没有保存,虽然我看到它们进来(通过观看任务管理器&gt;性能:
有没有人知道为什么我没有看到保存到磁盘的大量请求,而较小的文件会被保存?