随机"错误读取MIME多部分主体"在Web API中

时间:2016-04-07 02:00:56

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

有时,将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配置和较大的文件,而不是那些错误输出的文件。我有什么遗失可能导致这个问题吗?它似乎只能读取身体信息一次,这是我发现的另一个可能的原因。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

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