2017-05-20 96 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

相關問題