API Azure Custom Vision возвращает неподдерживаемый тип мультимедиа для URL-адреса изображения JPG - PullRequest
0 голосов
/ 20 сентября 2018

Я создал небольшое приложение для создания окон, чтобы поиграть с распознаванием изображений.Я обучил модель и создал приложение для форм Windows, которое принимает поток изображений с моей веб-камеры, загружает кадры в формате JPG в корзину AWS S3, а затем передает общедоступный URL-адрес в API Vision для обеспечения оценки тегов.

Если я передаю изображение через вызов 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 Ошибка неподдерживаемого типа носителя.«Content-Type» не соответствует содержимому публикации.

Для 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.Я доложу, когда попытаюсь это исправить.

РЕДАКТИРОВАТЬ2: Нет.Все еще нет игры в кости.Я подумал, что, возможно, неправильно разделил объект URL, но я проверил, и содержимое соответствует ожидаемому, просто сериализовал следующий объект:

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

1 Ответ

0 голосов
/ 20 сентября 2018

Спасибо Джейми за помощь с 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");

Тогда вы получите правильный ответ.

...