Skip to main content
 首页 » 编程设计

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

2024年01月22日29EasonJim

我有一个 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); 
}