【发布时间】:2018-09-20 01:00:30
【问题描述】:
我构建了一个小型 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 调用有效的证据:
这是我失败的方法。您可以看到我设置了正确的内容类型,并且我使用相同的图像在我的代码和 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; }
}
【问题讨论】:
-
如果您没有收到任何建议,您可以使用 Fiddler 将消息与 Postman 进行比较。总是一个很好的工具。
-
谢谢杰米。我发现 Fiddler 使用起来很困难/令人生畏,需要花更多时间来了解输出以及如何配置它。我还刚刚通过将来自 Google 图片搜索的已知良好 JPG url 嵌入到我的代码中进行了测试,结果相同,错误相同。
-
我运行了 Fiddler。我可以看到的第一个错误是:HTTP/1.1 415 Unsupported Media Type Content-Length: 116 Content-Type: application/json; charset=utf-8 apim-request-id:49024a98-fed4-4b1f-bcdd-efeed5535ddd 严格传输安全:max-age=31536000;包括子域;预加载 x-content-type-options: nosniff 日期: Thu, 20 Sep 2018 01:28:10 GMT {"code":"ErrorUnknown","message":"不支持请求实体的媒体类型 'text/plain'对于这个资源。”}。这很奇怪,因为正如您在我的代码中看到的那样,我指定了 application/json。
-
你还不关心响应。现在,查看之前发送的消息。它将显示您的 POST 内容。
-
这是我开始迷路的地方。在 415 之前捕获的事件只是 # Result Protocol Host URL Body Caching Content-Type Process Comments Custom 11 200 HTTP Tunnel to southcentralus.api.cognitive .microsoft.com:443 0 网络摄像头识别测试:14812
标签: c# azure computer-vision azure-cognitive-services