我有这个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();
}
}
我在做什么错了?
答案 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,则不要在操作中使用参数,它不会解析任何模型,并且会破坏多部分流。