【问题标题】:Random "error reading MIME multipart body" in Web APIWeb API 中的随机“错误读取 MIME 多部分正文”
【发布时间】:2016-04-07 02:00:55
【问题描述】:

有时,将 gzip 压缩文件从手机应用上传到 Web 服务会失败,并出现以下错误:

Error reading MIME multipart body part.

at System.Net.Http.HttpContentMultipartExtensions.<MultipartReadAsync>d__8.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Net.Http.HttpContentMultipartExtensions.<ReadAsMultipartAsync>d__0`1.MoveNext()

端点本身非常基本:

    [System.Web.Http.HttpPost]
    public async Task<HttpResponseMessage> TechAppUploadPhoto()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            return Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "The request isn't valid!");
        }

        try
        {
            var provider = new MultipartMemoryStreamProvider();
            await Request.Content.ReadAsMultipartAsync(provider);
            foreach (StreamContent file in provider.Contents)
            {
                Stream dataStream = await file.ReadAsStreamAsync();
                String fileName = file.Headers.ContentDisposition.FileName;
                fileName = [unique name];

                String filePath = Path.Combine(ConfigurationManager.AppSettings["PhotoUploadLocation"], fileName);

                using (var fileStream = File.Create(filePath))
                {
                    dataStream.Seek(0, SeekOrigin.Begin);
                    dataStream.CopyTo(fileStream);
                    fileStream.Close();
                    dataStream.Close();
                }

                // Enable overwriting with ZipArchive
                using (ZipArchive archive = ZipFile.OpenRead(filePath))
                {
                    foreach (ZipArchiveEntry entry in archive.Entries)
                    {
                        entry.ExtractToFile(Path.Combine(ConfigurationManager.AppSettings["PhotoUploadLocation"], entry.FullName), true);
                    }
                } 
                File.Delete(filePath);
            }

            return Request.CreateResponse(HttpStatusCode.Accepted);
        }
        catch (Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "PostCatchErr: " + e.Message + e.StackTrace);
        }
    }

此错误似乎非常随机且难以重现。不幸的是,我没有写任何一端并且在这里没有太多经验,但它似乎也与上​​传的大小无关 - 这是网络配置中的一个很大限制,并且可以上传更大的文件比那些出错的。有什么我遗漏的东西可能会导致这个问题吗?它似乎只读取了一次身体信息,这是我发现的另一个可能的原因。有什么想法吗?

【问题讨论】:

    标签: web-services asp.net-web-api mime-types multipart


    【解决方案1】:

    This 对类似问题的回答对我有帮助。

    maxRequestLength 的值不正确。 30MB 应该是 30000(正如答案中的一个 cmets 所指出的那样)。

    【讨论】:

      猜你喜欢
      • 2016-12-24
      • 2012-11-08
      • 2021-05-18
      • 1970-01-01
      • 2020-07-26
      • 2022-07-12
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多