2017-05-20 55 views
2

这里是客户不支持的媒体类型时,发布到网络API

using (var client = new HttpClient()) 
{ 

    client.BaseAddress = new Uri("http://localhost/MP.Business.Implementation.FaceAPI/"); 
    client.DefaultRequestHeaders 
      .Accept 
      .Add(new MediaTypeWithQualityHeaderValue("application/octet-stream")); 
    using (var request = new HttpRequestMessage(HttpMethod.Post, client.BaseAddress + "api/Recognition/Recognize")) 
    { 
     request.Content = new ByteArrayContent(pic); 
     request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 

     await client.PostAsync(request.RequestUri, request.Content); 

    } 
} 

服务器

[System.Web.Http.HttpPost] 
public string Recognize(byte[] img) 
{ 
    //do someth with the byte [] 

} 

我得到错误:

415 Unsupported Media Type

所有的时间 - 请求实体的媒体类型pe'application/octet-stream'不支持此资源。我能做些什么呢?我在这里找到了一些回答的线索,但它没有帮助。

回答

0

虽然byte[]是代表application/octet-stream数据的好方法,但Web API中的默认情况并非如此。

我的解决方法是在ASP.NET Core 1.1中 - 其他变体的细节可能有所不同。

在您的控制器方法中,删除img参数。相反,请参阅Request.Body,这是一个Stream。例如保存到文件:

using (var stream = new FileStream(someLocalPath, FileMode.Create)) 
{ 
    Request.Body.CopyTo(stream); 
} 

从GET控制器方法返回二进制数据的情况类似。如果你使返回类型为byte[]那么它是用base64格式化的!这使它显着变大。现代浏览器完全有能力处理原始二进制数据,因此这不再是一个明智的默认设置。

幸运的是有一个Response.Bodyhttps://github.com/danielearwicker/ByteArrayFormatters

Response.ContentType = "application/octet-stream"; 
Response.Body.Write(myArray, 0, myArray.Length); 

让你的控制器方法void的返回类型。

UPDATE

我创建了一个NuGet包,允许在控制器方法直接利用byte[]。参见:https://github.com/danielearwicker/ByteArrayFormatters

相关问题