2017-10-28 93 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/") }; 
相關問題