2

我打電話給第三方Web API來更新我們的一些數據。我一直在快速連續提交大約五份工作,而且無疑,前兩項請求正常工作。但最後三個從未更新。應用程序似乎表明請求已超時,但我想確保我不會搞亂任何事情。WebRequest.GetResponse()幾個請求後超時

我打電話給下面的函數Action<string, Dictionary<string,object>> Delegate,我用BeginInvoke異步調用API。我真的不在意這個迴應。我誤解了一些關於WebRequest.GetResponse()的東西,或者這是端點的問題嗎?

private void UpdateJobInfo(string jobId, Dictionary<string, object> updates) 
    { 
     var postData = GetJsonEncodedValues(updates); 
     var request = WebRequest.Create(string.Format(JobResultEndpoint, _username, jobId)); 

     request.ContentType = "application/json; charset=utf-8"; 
     request.Method = WebRequestMethods.Http.Put; 
     request.Headers[HttpRequestHeader.Authorization] = GetAuthenticationCredentials(); 
     request.GetRequestStream().Write(Encoding.ASCII.GetBytes(postData), 0, Encoding.ASCII.GetBytes(postData).Length); 

     request.GetResponse(); 
    } 
+0

出於興趣,你能指望什麼,如果拋出一個異常的情況發生? – 2013-04-05 19:37:31

+0

我正在執行我的'try ... catch'來調用這個塊,但我想如果我異步地調用這個方法,我永遠不會真的得到這個信息。接得好。 – elucid8 2013-04-05 19:47:07

回答

4

你沒有處置響應(或確實請求流,儘管這是一個稍微不同的問題)。這意味着你將服務器的連接斷開,直到終結者注意到響應可以完成。這些連接與(默認情況下)每個URL連接兩個連接。因此,您稍後的請求正在等待先前的響應在可以獲得連接之前完成。

更好的代碼:

// Is this definitely what you want? What about non-ASCII data? 
byte[] binaryPostData = Encoding.ASCII.GetBytes(postData); 
using (var requestStream = request.GetRequestStream()) 
{ 
    requestStream.Write(binaryPostData, 0, binaryPostData.Length); 
} 

using (var response = request.GetResponse()) 
{ 
    // We don't care about the response, but we have to fetch it 
    // and dispose it. 
}