我有一个 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 而不是正文中的对象时,这个方法就起作用了。
有什么我在这里出错的想法吗?
请您参考如下方法:
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;
}
}
如果您按照第一篇文章操作,则示例 Controller
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);
}
