上传大文件的 Azure App Service 问题:MIME 多部分流意外结束

Azure App Service issue with uploading large files: Unexpected end of MIME multipart stream

我有一个基于 AngularJS 的 Web 界面,正在向我的 ApiController 发送一个 zip 文件。我收到了文件:

public async Task<UploadImportPackageResponse> Package()
{
    var provider = new MultipartMemoryStreamProvider();
    await this.Request.Content.ReadAsMultipartAsync(provider);
    var file = provider.Contents.FirstOrDefault(p => p.Headers.ContentDisposition.Name == "\"file\"");

这在我的开发机器上、在我们的本地测试服务器上工作得很好,但在我们的 Azure 应用服务暂存站点上却不行。

在 Azure 上它抛出以下错误:

Unexpected end of MIME multipart stream. MIME multipart message is not complete.

  System.IO.IOException:
  at System.Net.Http.Formatting.Parsers.MimeMultipartBodyPartParser+<ParseBuffer>d__0.MoveNext (System.Net.Http.Formatting, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
  at System.Net.Http.HttpContentMultipartExtensions+<MultipartReadAsync>d__8.MoveNext (System.Net.Http.Formatting, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Net.Http.HttpContentMultipartExtensions+<ReadAsMultipartAsync>d__0`1.MoveNext (System.Net.Http.Formatting, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at Test.Web.Areas.Admin.Controllers.ImportController+<Package>d__2.MoveNext (Test.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Threading.Tasks.TaskHelpersExtensions+<CastToObject>d__3`1.MoveNext (System.Web.Http, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Web.Http.Controllers.ApiControllerActionInvoker+<InvokeActionAsyncCore>d__0.MoveNext (System.Web.Http, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Web.Http.Controllers.ActionFilterResult+<ExecuteAsync>d__2.MoveNext (System.Web.Http, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  at System.Web.Http.Controllers.ExceptionFilterResult+<ExecuteAsync>d__0.MoveNext (System.Web.Http, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)

这是我目前所了解的:

  1. 1.5 MB 的文件可以上传,但 12 MB 的文件则不行。 (maxRequestLength="256000" & maxAllowedContentLength="262144000"
  2. 我使用 Charles Proxy 捕获了在 Azure 上导致错误的请求,并在我的本地计算机上重新执行了它,但没有导致任何错误。所以我相信这是服务器端问题。不是客户端问题。

我最好的猜测是服务器缩短了请求。但我不知道为什么,也不知道要更改什么配置来解决这个问题。

在与 Azure 支持人员交谈后,他们提到他们在生产代码中修复了这样的错误,所以我查看了所有相关的 Microsoft nuget 包,发现 MS 发布了新版本 Microsoft.AspNet.WebApi(以及相关的客户端、核心、HelpPage 和 WebHost 包)

所以 Update-Package Microsoft.AspNet.WebApi 对我有用。

所以简短的回答是:

确保安装了 5.2.3 或更高版本的 Microsoft.AspNet.WebApi