Загрузить файлы с помощью HttpClient в ASP.NET WebApi 2 - PullRequest
0 голосов
/ 26 августа 2018

У меня есть HttpClient для отправки файлов:

var content = new MultipartFormDataContent(Guid.NewGuid().ToString())
{
    new StringContent(JsonConvert.SerializeObject(parameters), Encoding.UTF8, "application/json")
};

foreach (var file in files)
{
    var byteContent = new ByteArrayContent(file.Data);

    content.Add(byteContent, file.FieldName, file.FileName);
}

return await _client.PostAsync(_apiUrl + apiRelativeUrl, content);

Но мой ASP.NET WebApi Controller выдает ошибку 500 с этим исключением:

System.IO.IOException: Unexpected end of MIME multipart stream. MIME multipart message is not complete.

Код контроллера WebApi

if (Request.Content.IsMimeMultipartContent())
{
    var multipart = await Request.Content.ReadAsMultipartAsync(); //this line throws the exception
    var fileContent = multipart.Contents.FirstOrDefault();

    if (fileContent != null)
    {
        var photo = await fileContent.ReadAsByteArrayAsync();
    }
}

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

В основном я использовал пользовательский поток для добавления новой строки, которую ожидает веб-API asp.net.

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);

и добавление следующего кода в web.config

<system.web>
    <httpRuntime maxRequestLength="30000000" />
</system.web>

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="30000000" />
      </requestFiltering>
    </security>
</system.webServer>

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

0 голосов
/ 27 августа 2018

Я создал два новых пустых проекта, один для webapi и один для httpclient.

Я попытался скопировать существующий код клиента и существующий код сервера в новые проекты.

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

Так что, если кому-то нужно загрузить данные многоэлементной формы в ASP.NET WebApi, не использовать параметры в действии, это не разрешит какую-либо модель и нарушит многоэлементный поток.

0 голосов
/ 26 августа 2018

Попробуйте добавить заголовок типа загружаемых файлов следующим образом:

 byteContent.Headers.ContentType =
            MediaTypeHeaderValue.Parse("image/jpeg");

Это прекрасно работает для меня.

...