【问题标题】:Upload Files with HttpClient to ASP.NET WebApi 2使用 HttpClient 将文件上传到 ASP.NET WebApi 2
【发布时间】:2018-08-26 09:44:52
【问题描述】:

我有这个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();
    }
}

我做错了什么?

【问题讨论】:

  • 请提供完整的代码来理解问题。
  • 你需要什么代码? var 参数是通用的,文件是 IEnumerable 的自定义类,带有 byte[] 数据、字段名和文件名。
  • 你的控制器签名是什么?你从哪里得到你的文件?你的 MVC/jQuery 代码是什么?
  • @Caelan 你能访问web api方法代码吗?你能休息一下吗?哪一行出错了?
  • 这是一个 webapi 控制器,从 Request 中读取数据,文件来自手机摄像头,Xamarin 表单应用程序

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


【解决方案1】:

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

希望这会有所帮助。

【讨论】:

  • @Caelan 也检查一下,stackoverflow.com/questions/43240422/…
  • 您认为这是服务器问题而不是客户端问题吗?更新网络应用程序需要我做更多的工作,所以我正在尝试发送正确的数据。我尝试将写入行添加到文件流中,但响应没有改变。
  • @Caelan 我认为服务器端 api 有一些问题。如果你不确定,首先使用Postman测试api
  • 我尝试使用 linqpad 调试 Web 服务器以发出请求。我已经添加了您建议的代码,但没有任何改变。
【解决方案2】:

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

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

这对我来说很好。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-02-21
      • 2015-06-24
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 2019-11-14
      • 2013-06-23
      • 2021-01-14
      • 2013-11-10
      相关资源
      最近更新 更多