POST到web api

时间:2017-05-20 21:04:09

标签: asp.net rest asp.net-web-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不支持的媒体类型

始终 - 此资源不支持请求实体的媒体类型“application / octet-stream”。我该怎么办?我在这里找到了一些回答的帖子,但它没有帮助。

1 个答案:

答案 0 :(得分:1)

虽然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.Body https://github.com/danielearwicker/ByteArrayFormatters

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

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

<强>更新

我创建了一个nuget包,可以在控制器方法中直接使用byte[]。请参阅:https://github.com/danielearwicker/ByteArrayFormatters