2010-10-13 76 views
6

我正在使用System.Net.WebClient以異步模式執行一些HTTP操作。使用異步操作的原因最重要的是,我獲得了進度更改指示的事實 - 僅適用於異步操作,如the docs所述。在異步WebClient請求中獲取HTTP標頭

所以我們可以說我有我的Web客戶端設置:

this.client = new WebClient(); 
this.client.UploadStringCompleted += 
    new UploadStringCompletedEventHandler(textUploadComplete); 

和委託:

private void textUploadComplete(Object sender, UploadStringCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     // trigger UI failure notification 
     return; 
    } 

    // FIXME not checking for response code == 200 (OK) 
    // trigger UI success notification 
} 

所以你看,我假設,如果不發生異常,請求爲總是成功的(可能並非如此,因爲HTTP響應狀態碼可以是!= 2xx)。從關於UploadFileAsync的文檔中,我無法確定是否也處理了非200響應。

我是真的是新的到C#和我似乎無法找到一種方式來訪問該特定異步請求的響應頭。在我看來,每個WebClient只能在任何給定時間持有響應(或一組標題)。

儘管我不打算同時執行多個並行請求,但我仍然想知道是否有更優雅的方式來檢索特定請求的響應標頭/狀態代碼,而不是必須從WebClient獲得「最後可用」響應。

謝謝。

+0

你在.NET 4.5中嗎?如果是這樣,請嘗試使用TaskAsync重載...您仍然需要從WebClient類訪問頭文件,但使用TAP工作流程時根本不會發現這種令人反感的內容...我同意這樣做感覺有點不對普通的事件處理程序。 'await client.UploadStringTaskAsync(...); var headers = client.ResponseHeaders;' – TCC 2014-05-02 20:26:57

回答

0

你在.NET 4.5中嗎?如果是這樣,請嘗試使用TaskAsync重載...您仍然需要從WebClient實例訪問頭文件,但使用TAP工作流程時根本不會發現這種令人反感的內容...我同意在它的操作中感覺有點不對普通的事件處理程序。

await client.UploadStringTaskAsync(...); 
var headers = client.ResponseHeaders; 

最重要的是你能做到這一切的UI線程上......不會阻止......所以你的「觸發更新UI」實際上只是「更新UI」。