2012-10-04 90 views
0

在我的應用程序中,我使用代碼片段將內容發送到具有每個帖子之間2秒間隔的URL的Web代理。在下面的代碼中發佈的消息以靜態字符串的形式給出,但在原始應用程序代碼中將是動態的。在C#中使用Post方法HttClient時請求超時

for (ic = 0; ic < 30; ic++) 
{ 
    using(HttpClient httpClient = new HttpClient()) 
    { 
     Encoder encoder = new Encoder(); //This is a class which we created 
     AuthorizationHeaders authorizationHeaders = encoder.getAuthorization(PARTNER_ID, PARTNER_KEY, URL, "POST", "application/xml"); 

     httpClient.DefaultHeaders.Add("Accept", "*/*"); 
     httpClient.DefaultHeaders.Add("Authorization", authorizationHeaders.getAuthorizationHeader()); 
     httpClient.DefaultHeaders.Add("Expires", authorizationHeaders.getExpiresHeader()); 
     httpClient.DefaultHeaders.Add("origPartnerId", "MyWebSite"); 
     httpClient.DefaultHeaders.Add("appId", "440"); 
     httpClient.DefaultHeaders.Add("Content-Type", "application/xml"); 
     string inputUrl = ConfigurationManager.AppSettings["url"]; 
     String detailRequest = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Message><Details><Name>Bob</Name><Age>45</Age></Details></Message>"; 
     var content = HttpContent.Create(detailRequest, Encoding.UTF8, "application/xml"); 
     response = httpClient.Post(inputUrl, content).EnsureStatusIsSuccessful(); 
     Thread.Sleep(2000); 
    } 
} 

但是,當我聯繫代理時,我收到以下異常。我一直沒有得到它,這個消息確實經歷了一段時間,但最終,這個例外來了。

的GetResponse超時---> System.TimeoutException:GetResponse的超時---> System.Net.WebException ---> System.Net.WebException:操作已在System.Net.HttpWebRequest超時 .GetResponse() 在Microsoft.Http.HttpWebRequestTransportStage.HttpTransportAsyncResult.PopulateWebResponseSync(WebRequest的請求,IAsyncResult的結果) 在Microsoft.Http.HttpWebRequestTransportStage.HttpTransportAsyncResult.PopulateWebResponse(HttpTransportAsyncResult自,IAsyncResult的結果,Func`3 GETRESPONSE) ---完內部異常堆棧跟蹤--- ---內部異常堆棧跟蹤結束--- at Microsoft.Http.AsyncResult.End [TAsyncResult](IAsyncResult resu LT,布爾throwException) 在Microsoft.Http.HttpWebRequestTransportStage.EndProcessRequestAndTryGetResponse(IAsyncResult的結果,HttpResponseMessage &響應,對象&狀態) 在Microsoft.Http.HttpWebRequestTransportStage.ProcessRequestAndTryGetResponse(HttpRequestMessage請求,HttpResponseMessage &響應,對象&狀態) 在微軟.Http.HttpStageProcessingAsyncResult.NextRequest(HttpStageProcessingAsyncResult自我) ---內部異常堆棧跟蹤的結尾--- 在Microsoft.Http.HttpStageProcessingAsyncResult.Complete(HttpStage階段,例外五) 在Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest(HttpStageProcessingAsyncResult自我)在Microsoft.Http.HttpClient.Send(HttpRequestMessage請求) (在Microsoft.Http.HttpClient.Send(HttpMethod方法,Uri uri,RequestHeaders標頭,HttpContent內容)上的在Microsoft.Http.HttpMethodExtensions.Method (HttpClient client,HttpMethod method ,開放的URI,HttpContent體) 在Microsoft.Http.HttpMethodExtensions.Method(HttpClient的客戶端,列舉HTTPMethod方法,URI的字符串,HttpContent體)

但這代理僅僅是一個重定向到另一個。所以我也直接嘗試了那個。在那裏,我能夠成功完成2到3次,但之後又產生了另一個異常。我再次嘗試,但這一次,第一次嘗試的例外。我等了一段時間,然後又試了一次,出人意料的是,它經歷了兩三次,然後再次發生了異常。這次我得到的例外是不同的,這是...

Microsoft.Http.HttpStageProcessingException ---> System.Net.WebException ---> System.Net.WebException:底層連接是關閉:連接意外關閉。在Microsoft.Http.HttpWebRequestTransportStage.HttpTransportAsyncResult.PopulateWebResponse上的Microsoft.Http.HttpWebRequestTransportStage.Http.TransportAsyncResult.PopulateWebResponseSync(WebRequest請求,IAsyncResult結果)上的System.Net.HttpWebRequest.GetResponse()(HttpTransportAsyncResult self,IAsyncResult結果,Func 3 getResponse) --- End of inner exception stack trace --- at Microsoft.Http.AsyncResult.End[TAsyncResult](IAsyncResult result, Boolean throwException) at Microsoft.Http.AsyncResult.End[TAsyncResult](IAsyncResult result) at Microsoft.Http.AsyncResult 1.End IAsyncResult結果)在Microsoft.Http.HttpWebRequestTransportStage上的Microsoft.Http.HttpWebRequestTransportStage.EndProcessRequestAndTryGetResponse(IAsyncResult結果,HttpResponseMessage &響應,對象&狀態)。ProcessRequestAndTryGetResponse(HttpRequestMessage請求,HttpResponseMessage &響應,對象&狀態)在Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest(HttpStageProcessingAsyncResult自我)---內部異常堆棧跟蹤的末尾在Microsoft.Http.HttpStageProcessingAsyncResult.Complete(HttpStage階段,異常e)上Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest(HttpStageProcessingAsyncResult自我)在Microsoft.Http.HttpStageProcessingAsyncResult..ctor(HttpStageProcessingAsyncState狀態,AsyncCallback的回調,對象用戶)在Microsoft.Http.HttpClient.Send(HttpRequestMessage請求)在Microsoft.Http。 HttpClient.Send(HttpMethod方法,Uri uri,RequestHeaders標頭,HttpContent內容)在Microsoft.Http.HttpClient.Send(HttpMethod方法,Uri uri,HttpContent內容)在Microsoft.Http.HttpMethodExtensions.Method(HttpClient客戶端,HttpMethod方法,Uri uri,HttpContent body)在Microsof t.Http.HttpMethodExtensions.Method(HttpClient的客戶端,列舉HTTPMethod方法,URI的字符串,HttpContent體)在Microsoft.Http.HttpMethodExtensions.Post(HttpClient的客戶端,字符串URI,HttpContent體)

在這方面的任何幫助將是非常感謝,因爲我在這之後的幾天,我已經閱讀了一些文章,甚至在stackoverflow的問題,但沒有什麼幫助我。在此先感謝...

+0

要添加的評論: - 它張貼正確2次。不是2或3次。對不起,沒有具體。 –

+0

這是代理/或遠程機器在你的控制?在那種情況下,您是否檢查該機器上連接超時間隔的值是否設置?這看起來不像你的代碼中的問題(除了你應該處理錯誤和重試的事實) – Niyaz

+0

但是我們仍然認爲問題出在我們的代碼上......意思是,應該有一些我們錯過的東西 - 哪個連接到資源利用率等等。我這樣說是因爲,每次我們重新啓動應用程序池時,這都會運行良好。如果它再次超時,我們重新啓動應用程序池,它就會起作用。這迫使我們相信這個HttpClient應該有一些我們缺少的東西。它與服務器的超時值沒有任何關聯。這是因爲,從服務器日誌中,我們可以發現請求(已超時)未到達服務器。 –

回答

0

一些公司的代理規則將導致POST請求的問題。

GET請求正常工作。檢查您的操作系統代理設置是否被禁用。

Windows 7:控制面板> Internet選項>連接(選項卡)。

然後點擊「局域網設置」按鈕,然後取消選中「使用代理服務器爲您的局域網」。

或者,嘗試讓網絡管理員將您正在使用的連接添加到排除列表中。