2016-08-18 21 views
1

我有一個應用程序,在將文件發佈到服務器後,服務器定期向客戶端應用程序返回有關響應中升級過程的消息。定期從任務<Stream>讀取Http PostAsync響應內容返回

我曾經有過代碼,看起來像

using (HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse()) 
{ 
    using (Stream responseStream = httpResponse.GetResponseStream()) 
    { 
     using (var reader = new StreamReader(stream)) 
     { 
      while(!streamReader.EndOfStream) 
      { 
       var str = streamReader.ReadLine(); 
       // Do something with str 
      } 
     } 
    } 
} 

更新我的代碼,以利用HttpClient類,我苦苦尋找的,將做相同的代碼上面的方法後。

var response = client.PostAsync(uploadUrl, content).Result; 

var stream = response.Content.ReadAsStreamAsync().Result; 

var streamReader = new StreamReader(stream); 

// Superfluous due to the fact we are already at end of stream 
while(!streamReader.EndOfStream) 
{ 
    var str = streamReader.ReadLine(); 
    // Do something with str 
} 

如果我嘗試像上述那我們等到整個流已恢復這一切一氣呵成由於使用response.Content.ReadAsStreamAsync().Result調用之前填充。這是不合適的,因爲我希望從服務器返回時實時顯示信息。

是否有可能定期從流中讀取,如上面的示例中所示,當我們有一個Task<Stream>對象時?

回答

2

之所以ReadAsStreamAsync()只返回畢竟內容被接收,因爲PostAsync()內部使用HttpCompletionOption.ResponseContentRead。你想要的是HttpCompletionOption.ResponseHeadersRead

HttpClient上的一些方法有一個超載,接受HttpCompletionOption,它允許您覆蓋默認值。對你不幸的是,PostAsync()沒有。顯然,這是因爲responses to POST requests are not supposed to be long

,但你仍然可以做你想做的使用一般SendAsync()方法:

var response = client.SendAsync(
    new HttpRequestMessage(HttpMethod.Post, uploadUrl) { Content = content }, 
    HttpCompletionOption.ResponseHeadersRead).Result; 
+0

輝煌,這將清除了。乾杯 –

相關問題