2017-10-28 90 views
-3

我有一个客户服务。在该服务中,我有以下方法:为什么我的HttpClient调用不会返回预期的Json?

public async Task<IEnumerable<Client>> ReadAsync() 
{ 
    using (var conn = new SqlConnection(_connString)) 
    using (var cmdRead = new SqlCommand("SELECT * FROM Client", conn)) 
    { 
     conn.Open(); 
     var ret = new List<Client>(); 

     var reader = await cmdRead.ExecuteReaderAsync(); 
     while (reader.Read()) 
     { 
      var client = BuildFromDataReader(reader); 
      ret.Add(client); 
     } 

     return ret; 
    } 
} 

此方法是通过一个Web API控制器动作称为像这样:

[HttpGet] 
public async Task<IEnumerable<Client>> Get() 
{ 
    // API side. 
    IEnumerable<Client> clients = await _clients.ReadAsync(); 
    return clients; 
} 

我希望内容协商默认是JSON和这样期待这个动作返回一个JSON编码的Client列表。

我这一切的客户端尝试使用Web API看起来更像是这样的:

public async Task<IEnumerable<Client>> ReadAsync() 
{ 
    var json = await Client.GetStringAsync("api/Clients/Get"); 
    var clients = JsonConvert.DeserializeObject<IEnumerable<Client>>(json); 
    return clients; 
} 

在断点处的检查,json"value"(包括引号)的值。我试过了什么?上面的代码。我期望通过Web API操作返回的json在哪里?

PS:我忙于ASP.NET Core项目,所以我们也使用了NewtonSoft JSON。

+0

等一下我来看看。快速的问题。是web服务的web api 2还是asp.net核心? – Nkosi

+1

'Client.GetStringAsync'方法里面有什么?你说“客户”是你的业务对象,代表你的业务客户,而不是通信客户,对吗? –

+0

@ProfK问题是可挽回的是你提供[mcve]。现在需要澄清问题的问题太多了。 Brian问了一个关于'GetStringAsync'的好问题。这是一个失败点。我认为它来自HttpClient。还有web api的设计方式。 – Nkosi

回答

1

我认为反对票是因为您在未验证事实的情况下表达假设。

一个简单的三步谷歌搜索导致https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/content-negotiation详细说明什么标准webapi用于内容协商。

正如你所看到的那样,你的假设是不正确的 - 不是假设总是不正确?

只有在请求声明它将接受时才返回Json。所以你需要在请求上设置accept头来接受Json。引述的文章:

GET http://localhost.:21069/api/products/1 HTTP/1.1 Host: localhost.:21069 Accept: application/json, text/javascript, */*; q=0.01

+0

你对我的假设是正确的,我向那些认为这个问题难以理解的成员致歉。 – ProfK

0

好像失败的可能性非常小了点,但我已经遇到过很多很多次,而研究HttpClient这个问题。

它看起来像BaseAddress字符串属性必须以尾部“/”结尾。我不知道我是否无意中改变了其他的东西,但只要我添加了斜线,我就恢复了业务。例如。端口号后的斜线:

private static readonly HttpClient Client = new HttpClient {BaseAddress = new Uri("http://localhost:63675/") }; 
相关问题