2017-01-22 48 views
1

我正在尝试编写一个关于读取图像列表的代码,并使用Cognitive Service MVC.NET从它获取信息。获取图像信息Cognitve服务 - 错误请求ASP.NET MVC c#

我写了这个代码:

 public async Task<ActionResult> Index() 
     { 
      List<string> list = await ReadImages(); 
      return View(list); 
     } 
     private async Task<List<string>> ReadImages() 
     { 
      List<string> list = new List<string>(); 
      string[] photoEntries = Directory.GetFiles(_photoFolder); 
      foreach (string photo in photoEntries) 
      { 
       list.Add(await GetCaptionAsync(photo)); 
      } 
      return list; 
     } 

     private async Task<string> GetCaptionAsync(string photo) 
     { 

      using (var client = new HttpClient()) 
      { 
       var queryString = HttpUtility.ParseQueryString(string.Empty); 
       //setup HttpClient 
       client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", _apiKey);     
       queryString["visualFeatures"] = "Categories"; 
       queryString["details"] = "Celebrities"; 
       queryString["language"] = "en"; 
       var uri = "https://westus.api.cognitive.microsoft.com/vision/v1.0/analyze?" + queryString; 

       HttpResponseMessage response; 
       byte[] byteData = Encoding.UTF8.GetBytes(photo); 

       using (var content = new ByteArrayContent(byteData)) 
       { 
        content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
        response = await client.PostAsync(uri, content); 
       } 

       return response.Content.ToString(); 
      } 
     } 

的观点是:

@model List<string> 
@foreach (var item in Model) 
{ 
    @item 
} 

我收到了一个错误:在该行400错误请求:

response = await client.PostAsync(uri, content);

我不知道这段代码有什么问题,请有人帮我解释一下这个问题? 谢谢

+0

你要发送的文件名不是实际的文件。 – Crowcoder

+0

如何解决这个问题? –

+1

File.ReadAllBytes(照片)应该工作。 – Crowcoder

回答

1

如果你使用的是c#,你会发现一个节省时间的官方客户SDK,在NuGet中也可以使用。除了现成的代码来调用服务,它会给你具体的类型,所以你不必自己解析响应JSON。

无论如何,你的代码大部分是正确的,但有效载荷需要是二进制文件内容。所以你要改为:

byte[] byteData = File.ReadAllBytes(photo); 

还要注意的是你要等待这样的回应内容:

return await response.Content.ReadAsStringAsync();