使用 HttpClient 将文件上传到 ASP.NET WebApi 2
Upload Files with HttpClient to ASP.NET WebApi 2
我有这个 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();
}
}
我做错了什么?
尝试添加 header 您上传的文件类型:
byteContent.Headers.ContentType =
MediaTypeHeaderValue.Parse("image/jpeg");
这对我来说很好。
基本上我使用自定义流来附加 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>
希望对您有所帮助。
我创建了两个新的空项目,一个用于 webapi,一个用于 httpclient。
我尝试将现有的客户端代码和现有的服务器代码复制到新项目中。
我发现问题出在webapi action的参数上,好像断流了。
因此,如果有人需要将多部分表单数据上传到 ASP.NET WebApi 不要在操作中使用参数,它不会解析任何模型并且会破坏多部分流。
我有这个 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();
}
}
我做错了什么?
尝试添加 header 您上传的文件类型:
byteContent.Headers.ContentType =
MediaTypeHeaderValue.Parse("image/jpeg");
这对我来说很好。
基本上我使用自定义流来附加 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>
希望对您有所帮助。
我创建了两个新的空项目,一个用于 webapi,一个用于 httpclient。
我尝试将现有的客户端代码和现有的服务器代码复制到新项目中。
我发现问题出在webapi action的参数上,好像断流了。
因此,如果有人需要将多部分表单数据上传到 ASP.NET WebApi 不要在操作中使用参数,它不会解析任何模型并且会破坏多部分流。