我有一个web api,我想发布一个图像文件+一些数据,以便在服务器收到它时正确处理它。
调用代码如下所示:
using(var client = new HttpClient())
using(var content = new MultipartFormDataContent())
{
client.BaseAddress = new Uri("http://localhost:8080/");
var fileContent = new ByteArrayContent(File.ReadAllBytes(fileName));
fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
{
FileName = "foo.jpg"
};
content.Add(fileContent);
FeedItemParams parameters = new FeedItemParams()
{
Id = "1234",
comment = "Some comment about this or that."
};
content.Add(new ObjectContent<FeedItemParams>(parameters, new JsonMediaTypeFormatter()), "parameters");
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("multipart/form-data");
var result = client.PostAsync("/api/ImageServices", content).Result;
web api方法签名如下所示:
public async Task<HttpResponseMessage> Post([FromBody]FeedItemParams parameters)
当我运行此操作时,我收到UnsupportedMediaType
个异常。我知道这与ObjectContent
有关,因为当我在查询字符串中传递ID
而不是正文中的对象时,此方法有效。
我在这里出错的任何想法?
答案 0 :(得分:8)
WebAPI内置格式化程序仅支持以下媒体类型:application/json
,text/json
,application/xml
,text/xml
和application/x-www-form-urlencoded
对于您要发送的multipart/form-data
,请查看Sending HTML Form Data和ASP.NET WebApi: MultipartDataMediaFormatter
示例客户端
using (var client = new HttpClient())
{
using (var content = new MultipartFormDataContent())
{
client.BaseAddress = new Uri("http://localhost:54711/");
content.Add(new StreamContent(File.OpenRead(@"d:\foo.jpg")), "foo", "foo.jpg");
var parameters = new FeedItemParams()
{
Id = "1234",
Comment = "Some comment about this or that."
};
content.Add(new ObjectContent<FeedItemParams>(parameters, new JsonMediaTypeFormatter()), "parameters");
var result = client.PostAsync("/api/Values", content).Result;
}
}
如果您按照第一篇文章
进行样本控制public async Task<HttpResponseMessage> PostFormData()
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
//use provider.FileData to get the file
//use provider.FormData to get FeedItemParams. you have to deserialize the JSON yourself
return Request.CreateResponse(HttpStatusCode.OK);
}