使用HttpClient将文件上传到ASP.NET WebApi 2

时间:2018-08-26 09:44:52

标签: c# asp.net asp.net-web-api2 multipartform-data dotnet-httpclient

我有这个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 :(得分:2)

基本上,我使用自定义流来附加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);

并在web.config中添加以下代码

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

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

希望这会有所帮助。

答案 1 :(得分:1)

尝试添加您上传的文件类型的标题,如下所示:

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

这对我来说很好。

答案 2 :(得分:1)

我创建了两个新的空项目,一个用于webapi,一个用于httpclient。

我尝试将现有的客户端代码和现有的服务器代码复制到新项目中。

我发现问题出在webapi动作的参数上,似乎中断了流。

因此,如果有人需要将多部分表单数据上传到ASP.NET WebApi,则不要在操作中使用参数,它不会解析任何模型,并且会破坏多部分流。