ASP.NET Web API,从Flex FileReference上载时,MIME多部分流的意外结束

hey*_*uss 25 apache-flex asp.net-mvc asp.net-web-api

按照ASP.NET上的教程,实现了一个Web API控制器方法,用于执行如下所示的异步文件上载:

public Task<HttpResponseMessage> PostFormData()
{
    // Check if the request contains multipart/form-data.
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    string root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);

    // Read the form data and return an async task.
    var task = Request.Content.ReadAsMultipartAsync(provider).
        ContinueWith<HttpResponseMessage>(t =>
        {
            if (t.IsFaulted || t.IsCanceled)
            {
                Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
            }

            return Request.CreateResponse(HttpStatusCode.OK);
        });

    return task;
}
Run Code Online (Sandbox Code Playgroud)

通过标准的多部分HTML表单上传文件非常有效.但是,当另一个开发人员尝试通过Flex的FileReference类构造的多部分表单上载文件时,会抛出错误:

MIME多部分流的意外结束.MIME多部分消息未完成.

我不知道问题出在Web API或Flex上.我找到了一些没有任何影响的相关修复程序(使用ASP.Net Web API的多部分表单POST),最近发现了这一个("多部分流.MIME多部分消息未完成"webapi上传错误).如果第二个链接成立,是否有人知道它是否在通过Nuget提供的当前版本的Web API中出现?讨论是在5月份,Nuget的最新版本是8月,所以我认为这个修补程序已经部署,并不是我的问题的根本原因.

小智 35

我有与flex相同的问题.以下是解决它的代码.基本上我使用自定义流来附加asp.net web api期望的换行符.

        Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
        MemoryStream tempStream = new MemoryStream();
        reqStream.CopyTo(tempStream);



        tempStream.Seek(0, SeekOrigin.End);
        StreamWriter writer = new StreamWriter(tempStream);
        writer.WriteLine();
        writer.Flush();
        tempStream.Position = 0;


         StreamContent streamContent = new StreamContent(tempStream);
         foreach(var header in Request.Content.Headers)
         {
             streamContent.Headers.Add(header.Key, header.Value);
         }

        // Read the form data and return an async task.
         await streamContent.ReadAsMultipartAsync(provider);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 我已经实现了这个,但仍然得到错误.有进一步的想法? (4认同)
  • 感谢您抽出宝贵时间发布此内容 (2认同)
  • 对于Flash POST,我到目前为止只看到了解决方法.如果它创建一个检测到内部流结束并附加CRLF的虚拟流,效率会更高.如果文件很大,这将很容易爆炸. (2认同)
  • @TheDumbRadish如果添加此代码后仍然遇到相同的问题,则您的流可能不会在一开始。在第一行代码后添加:reqStream.Position = 0;。 (2认同)

Gre*_*pes 34

我对MVC4有同样的问题,但是Will是正确的,为你的输入添加一个名字......

<input type="file" id="fileInput" name="fileInput"/>
Run Code Online (Sandbox Code Playgroud)

所有的魔力都恢复了工作!


Mar*_*nes 8

阅读您现有的研究并跟踪代码复合问题后,看起来其他人确认这个问题在9月仍然存在.

他们认为MVC 4无法解析上传而没有终止"\ r \n".

这个问题非常简单但很难解决.问题是Uploadify不会在MultiPartForm消息的末尾添加"\ r \n"

http://aspnetwebstack.codeplex.com/discussions/354215

可能值得检查Flex上传添加"\ r \n"


小智 8

对于那些登陆这里谷歌搜索:

MIME多部分流的意外结束.MIME多部分消息未完成.

多次读取请求流也会导致此异常.我挣扎了好几个小时,直到找到一个消息来源解释请求流只能被读取一次.

在我的例子中,我结合尝试使用a读取请求流MultipartMemoryStreamProvider,同时让ASP.NET通过为我的api方法指定参数(来自请求体)来为我做一些魔术.