Azure Custom Vision API返回JPG图像URL的不受支持的媒体类型

时间:2018-09-20 01:00:30

标签: c# azure computer-vision azure-cognitive-services

我已经构建了一个小的Windows窗体应用程序,用于进行图像识别。我已经训练了一个模型,并且已经构建了一个Windows窗体应用程序,该应用程序将获取我的网络摄像头图像流,将JPG格式的帧上传到AWS S3存储桶,然后将可公开读取的URL传递给Vision API,以对标签进行评分。

如果我通过POSTMAN调用传递了图像,则可以正常工作,但是在我的代码中,会出现以下错误:

{StatusCode: 415, ReasonPhrase: 'Unsupported Media Type', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  apim-request-id: 8d5759e5-d32a-4ba2-8b54-16f3a3f1aa40
  Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
  x-content-type-options: nosniff
  Date: Thu, 20 Sep 2018 00:49:39 GMT
  Content-Length: 116
  Content-Type: application/json; charset=utf-8
}}

根据文档:

  

响应415不支持的媒体类型错误。 “内容类型”不   匹配帖子内容。

     

对于图像URL,“ Content-Type”应为application / json对于二进制文件   图片数据,“ Content-Type”应为application / octet-stream

正如您将从下面的代码中看到的那样,我正在设置正确的内容类型。我将仅发布处理发布到API的函数,因为这就是问题所在。任何帮助,将不胜感激。

首先,通过POSTMAN进行呼叫的证据有效:

enter image description here 这是我失败的方法。您可以看到我设置了正确的内容类型,并且我使用相同的图像在我的代码和POSTMAN之间进行测试。

        /// <summary>
        /// Take a provided image url and return the Vision API results
        /// </summary>
        /// <param name="url">a valid HTTP or HTTPS url containing a reference to a JPG image</param>
        /// <returns></returns>
        static async Task<string> GenerateVisionResult(string url)
        {
            string visionResult = null; 

            try
            {
                using (var client = new HttpClient())
                {
                    client.BaseAddress = new Uri("https://southcentralus.api.cognitive.microsoft.com/customvision/v2.0/Prediction/3dd9e6c3-aac4-4da1-8c74-cd2d581d4782/url?iterationId=5c1b1548-98d7-45b0-a0e7-f397f35ffcd9");
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(
                        new MediaTypeWithQualityHeaderValue("application/json"));
                    client.DefaultRequestHeaders.Add("Prediction-Key", "<redacted for post on StackOverflow>");
                    var UrlBody = new UrlBody
                    {
                        Url = url
                    };

                    var httpRequestMessage = new HttpRequestMessage
                    {
                        Content = new StringContent(JsonConvert.SerializeObject(UrlBody),Encoding.UTF8),
                        Method = HttpMethod.Post
                    };

                    HttpResponseMessage httpResponse = await client.PostAsync(client.BaseAddress, httpRequestMessage.Content);
                    if (httpResponse.IsSuccessStatusCode)
                    {
                        visionResult = await httpResponse.Content.ReadAsStringAsync();
                    }
                    else
                    {
                        visionResult = httpResponse.StatusCode.ToString(); 
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString()); 
            }

            return visionResult;
        }

编辑:我想我刚刚意识到自己的错误,因为我正在处理将URL添加到POST方法中的方式。尝试修复后,我会回报。

EDIT2:不。仍然没有骰子。我以为也许我没有正确地对URL对象进行序列化,但是我已经进行了测试并且内容符合预期,只是序列化了以下对象:

public class UrlBody
{
    public string Url { get; set; }
}

2 个答案:

答案 0 :(得分:0)

感谢Jamie对Fiddler的帮助,但我发现了问题。您无法像原始代码中那样将内容传递给POST方法。您必须将内容转换为可以作为HttpContent传递到post方法的内容,例如

            var content = JsonConvert.SerializeObject(url);
            var buffer = System.Text.Encoding.UTF8.GetBytes(content);
            var byteContent = new ByteArrayContent(buffer);
            byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

然后您将收到有效的回复。

答案 1 :(得分:0)

在URL末尾使用/ image /(例如:“ https://....//detect/iterations/Iteration37/ 图像 / nostore”)

Example postman Binary