2013-09-22 19 views
0

我有一個接受URL作爲輸入,並返回該存在於該位置的文本數據下面的C#方法:C#獲取從WebRequest的不返回值的數據

public string GetWebData(string uri) 
{ 
    string response = string.Empty; 
    try 
    { 
     var request = WebRequest.Create(uri); 
     request.BeginGetResponse(result => 
     { 
      var httpRequest = (HttpWebRequest)result.AsyncState; 
      var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(result); 

      using (var reader = new StreamReader(httpResponse.GetResponseStream())) 
      { 
       response = reader.ReadToEnd(); 
      } 
     }, request); 
    } 
    catch (WebException) 
    { 
     response = string.Empty; 
    } 
    return response; 
} 

然而,reader.ReadToEnd( );方法返回一個空字符串。我不知道我是否做錯了什麼,因爲該方法在語法上似乎與我所諮詢的所有教程完全相同。我究竟做錯了什麼?

+0

喬恩指出正確。你的意思是'GetWebData'返回空字符串或'reader.ReadToEnd()'返回空字符串? –

+0

@SriramSakthivel我正在調查它。一旦我明白了,我會盡快回復你,我想我理解我的邏輯中的缺陷。 – miguelarcilla

回答

1

即時返回response - 即使將分配有用值的回調僅限於response將僅稍後觸發。你知道BeginGetResponse是如何工作的嗎?仔細研究文檔和示例是值得的。

如果您確實想在方法結束後立即返回值,爲什麼要使用異步方法?如果你有異步方法(例如你在Windows Phone上),那麼你應該堅持使用這種異步方式 - 不要嘗試使其同步。

順便說一句,吞嚥這樣的例外是一個非常糟糕的主意太 - 你應該幾乎從未繼續作爲是否一切正常,即使你要儘量忽略錯誤的用戶體驗有關,你應該幾乎肯定會記錄異常。

此外,當您獲取響應時,應使用using語句作爲WebResponse實現IDisposable

+0

我正在開發Windows Phone項目,並且我一直在尋找的所有示例都在某種程度上遵循該模板。不過,我會閱讀BeginGetResponse方法,並瞭解如何修改它。感謝關於異常的提示,我只是想在我繼續之前得到響應。 – miguelarcilla

+0

@miguelarcilla:「某種程度上」可能是關鍵部分 - 我打賭他們要麼回調,要麼試圖等待結果(這本身就是一個壞主意)。基本上Windows Phone是爲異步而設計的,您應該使用它而不是嘗試僞造同步IO。 –

+0

明白了。我不知道我有沒有答案,但我認爲我正在走上正軌。謝謝 :) – miguelarcilla