2011-05-27 24 views
0

我正在使用HTTP Web請求類來調用RESTful Web服務。我需要傳遞數據並接收數據,而且這一切似乎都很好。今天我試圖配置課程超時,因爲服務器運行服務的可能性很低,我不想浪費時間等待。我把它全部配置好了,但似乎沒什麼區別。在失敗之前,電話仍然等待超過10秒鐘。爲HttpWebRequest超時問題構建解決方法

在研究它時,我發現超時只處理呼叫的處理,而且事先不包含DNS查詢。因爲這會是問題,所以爲什麼超時沒有按照我的預期工作是有意義的。

進一步閱讀建議使用異步樣式中的HttpWebRequest類來代替。我已經看過了這樣做的代碼,但不明白如何在我的代碼中檢索有效同步的回調。

我的代碼如下是這樣:

HttpWebRequest _serviceRequest = (HttpWebRequest)WebRequest.Create(new Uri("http://mywebservice.com")); 
_serviceRequest.Timeout = 3000; 

HttpWebResponse response = (HttpWebResponse)_serviceRequest.GetResponse(); 
XmlReader reader = XmlReader.Create(response.GetResponseStream(), set); 

我有異步調用與下面一行結束的代碼,但我不知道,以我應該做的得到的迴應是什麼目的。

IAsyncResult result = (IAsyncResult)req.BeginGetResponse(new AsyncCallback(RespCallback), reqState); 

我也關心這樣的一個半熟的異步解決方案。通過同步代碼段使用異步方法是一種好的做法。

任何助手贊​​賞...調用回調函數RespCallback時

回答

0

的迴應將是可用的。我不知道reqState有什麼,但我認爲它包含對原始HttpWebRequest對象的引用。如果是這樣的話,這將是一個簡單的實現RespCallback方法:

void RespCallback(IAsyncResult asyncResult) 
{ 
    ReqState reqState = (ReqState)asyncResult.AsyncState; 
    HttpWebResponse resp = (HttpWebResponse)reqState.Request.EndGetResponse(asyncResult); 
    // do what you need with the response. 
} 

更新:如要求在評論

如果你想在同一方法的響應更多信息,您並在開始通話,您可以收到回調時將設置一個事件,你可以等待該事件的例子中,開始通話後,像下面

class ReqState { 
    public HttpWebRequest Request { get; set; } 
    public HttpWebResponse Response { get; set; } 
    public AutoResetEvent Evt { get; set; } 
} 

void RespCallback(IAsyncResult asyncResult) { 
    ReqState reqState = (ReqState)asyncResult.AsyncState; 
    reqState.Response = (HttpWebResponse)reqState.Request.EndGetResponse(asyncResult); 
    reqState.Evt.Set(); 
} 

void CallMethod() { 
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(...); 
    // set properties on req 
    ReqState state = new ReqState(); 
    state.Request = req; 
    state.Evt = new ManualResetEvent(false); 
    req.BeginGetResponse(RespCallback, state); 
    state.Evt.WaitOne(TimeSpan.FromSeconds(30)); // wait for 30 seconds 
    // access response via state.Response 
} 

現在可以看到你實質上以異步方式進行同步呼叫。這可以讓你更好地控制超時,但代價複雜。另一件事,這不適用於Silverlight(和Windows Phone,IIRC)等平臺,在這些平臺中同步調用(即使是那些裝扮成異步的)也是禁止的。

+0

但我的問題是,當你在一個同步場景,如aspx頁面或在我的情況下,一個wcf服務調用時,你如何處理這個問題。如何暫停我的代碼以等待回調? – 2011-05-31 09:02:36

+0

用此評論的答案更新了回覆 – carlosfigueira 2011-05-31 15:31:22