Подтвердить что ты не робот

ASP.NET Web API, неожиданный конец многочастного потока MIME при загрузке из Flex FileReference

Следуя руководству, найденному в ASP.NET, был реализован метод контроллера 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;
}

Загрузка файла через стандартную многостраничную HTML-форму отлично работает. Однако, когда другой разработчик пытается загрузить файл через многострочную форму, созданную классом Flex FileReference, возникает ошибка:

Неожиданный конец многопоточного потока MIME. Сообщение MIME не завершено.

Я понятия не имею, существует ли проблема в веб-API или Flex. Я нашел некоторые связанные исправления, которые не повлияли (Многопользовательская форма POST с использованием ASP.Net Web API), а в последнее время этот (MIME multipart stream. MIME multipart message не является полной ошибкой при загрузке webapi). Если вторая ссылка имеет значение true, знает ли кто-нибудь ее в текущем выпуске веб-API, доступного через Nuget? Обсуждение было в мае, последний выпуск от Nuget - август, поэтому я предполагаю, что это исправление уже развернуто и не является основной причиной моей проблемы.

4b9b3361

Ответ 1

Просматривая ваши существующие исследования и следуя за вопросом о кодексе, похоже, что кто-то еще подтвердил, что этот вопрос все еще существует в сентябре.

Они считают, что MVC 4 не удается разобрать загрузки без завершающего "\ r\n" .

Проблема очень проста, но очень сложно исправить. Проблема в том, что Uploadify не добавляет "\ r\n" в конце сообщения MultiPartForm

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

Возможно, стоит проверить, что загрузка Flex добавляет "\ r\n"

Ответ 2

У меня была такая же проблема с 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);

Надеюсь, что это поможет.

Ответ 3

У меня была такая же проблема с MVC4, но Will правильно, добавьте имя на ваш вход.....

<input type="file" id="fileInput" name="fileInput"/>

и все волшебство возвращается и работает!

Ответ 4

Для тех, кто приземляется здесь, в Google:

Неожиданный конец многопоточного потока MIME. Сообщение MIME не завершено.

Чтение потока запросов более одного раза также приведет к этому исключению. Я боролся с ним в течение нескольких часов, пока не нашел источник, объясняющий, что поток запросов можно прочитать только один раз.

В моем случае я попытался прочитать поток запросов с помощью MultipartMemoryStreamProvider и в то же время позволить ASP.NET сделать для меня волшебство, указав параметры (исходящие из тела запроса) для моего метода api.

Ответ 5

Убедитесь, что виртуальный каталог (каталог "~/App_Data", как показано ниже), где сначала загружаются файлы изображений, физически. Когда вы публикуете проект, это может быть не в выходных файлах.

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

Ответ 6

Я только что удалил свои заголовки, которые я устанавливал на моем методе сообщения, который закончил тем, что решил эту проблему.

Ответ 7

Проблема в этой строке:

string root = HttpContext.Current.Server.MapPath("~/App_Data");

Он будет работать только на локальном хосте. Вместо этого вы можете использовать HostingEnvironment.MapPath в любом контексте, где недоступны объекты System.Web, такие как HttpContext.Current (например, также из статического метода).

var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath");

См. Также Какова разница между Server.MapPath и HostingEnvironment.MapPath?

Ссылка на этот ответ Как сделать Путь к карте сервера.