将多种内容类型发布到web api

我有一个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(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 Post([FromBody]FeedItemParams parameters) 

当我运行它时,我得到一个UnsupportedMediaTypeexception。 我知道这与ObjectContent ,因为当我在查询字符串中传递一个ID而不是正文中的对象时,此方法有效。

我在这里出错的任何想法?

WebAPI内置格式化程序仅支持以下媒体类型: application/jsontext/jsonapplication/xmltext/xmlapplication/x-www-form-urlencoded

对于您要发送的multipart/form-data ,请查看发送HTML表单数据和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(parameters, new JsonMediaTypeFormatter()), "parameters"); var result = client.PostAsync("/api/Values", content).Result; } } 

如果您按照第一篇文章进行样本控制

 public async Task 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); }