在 C# 中使用 Post 方法 HttpClient 时请求超时

Posted

技术标签:

【中文标题】在 C# 中使用 Post 方法 HttpClient 时请求超时【英文标题】:Request timed out while using Post method HttClient in C# 【发布时间】:2012-10-04 13:07:56 【问题描述】:

在我的应用程序中,我正在使用一段代码将内容发送到一个带有 URL 的 Web 代理,每个帖子之间的间隔为 2 秒。在以下代码中发布的消息以静态字符串形式给出,但在原始应用程序代码中将是动态的。

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 self,IAsyncResult 结果,Func`3 getResponse) --- 内部异常堆栈跟踪结束 --- --- 内部异常堆栈跟踪结束 --- 在 Microsoft.Http.AsyncResult.End[TAsyncResult](IAsyncResult 结果,布尔 throwException) 在 Microsoft.Http.HttpWebRequestTransportStage.EndProcessRequestAndTryGetResponse(IAsyncResult 结果,HttpResponseMessage& 响应,Object& 状态) 在 Microsoft.Http.HttpWebRequestTransportStage.ProcessRequestAndTryGetResponse(HttpRequestMessage 请求,HttpResponseMessage& 响应,对象& 状态) 在 Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest(HttpStageProcessingAsyncResult 自我) --- 内部异常堆栈跟踪结束 --- 在 Microsoft.Http.HttpStageProcessingAsyncResult.Complete(HttpStage 阶段,异常 e) 在 Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest(HttpStageProcessingAsyncResult 自我) 在 Microsoft.Http.HttpClient.Send(HttpRequestMessage 请求) 在 Microsoft.Http.HttpClient.Send(HttpMethod 方法,Uri uri,RequestHeaders 标头,HttpContent 内容) 在 Microsoft.Http.HttpMethodExtensions.Method(HttpClient 客户端,HttpMethod 方法,Uri uri,HttpContent 正文) 在 Microsoft.Http.HttpMethodExtensions.Method(HttpClient 客户端,HttpMethod 方法,String uri,HttpContent 正文)

但是这个代理只是重定向到另一个代理。所以我也直接尝试了那个。在那里,我能够成功地执行此操作 2 或 3 次,但之后又产生了另一个异常。我又试了一次,但这一次,第一次尝试本身就出现了异常。我等了一段时间,然后再次尝试,令人惊讶的是,它确实经历了 2 或 3 次,然后异常再次出现。这次我得到的例外是不同的,它是......

Microsoft.Http.HttpStageProcessingException ---> System.Net.WebException ---> System.Net.WebException:底层连接已关闭:连接意外关闭。在 System.Net.HttpWebRequest.GetResponse() 在 Microsoft.Http.HttpWebRequestTransportStage.HttpTransportAsyncResult.PopulateWebResponseSync(WebRequest 请求,IAsyncResult 结果) 在 Microsoft.Http.HttpWebRequestTransportStage.HttpTransportAsyncResult.PopulateWebResponse(HttpTransportAsyncResult self,IAsyncResult 结果,Func3 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.AsyncResult1。在 Microsoft.Http.HttpWebRequestTransportStage.ProcessRequestAndTryGetResponse(HttpRequestMessage request, HttpResponseMessage& response, Object& state) 在 Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest( HttpStageProcessingAsyncResult self) --- 内部异常堆栈跟踪结束 --- 在 Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest(HttpStageProcessingAsyncResult self) 在 Mi crosoft.Http.HttpStageProcessingAsyncResult..ctor(HttpStageProcessingAsyncState state, AsyncCallback callback, Object user) at Microsoft.Http.HttpClient.Send(HttpRequestMessage request) at Microsoft.Http.HttpClient.Send(HttpMethod method, Uri uri, RequestHeaders headers, HttpContent content ) 在 Microsoft.Http.HttpClient.Send(HttpMethod 方法, Uri uri, HttpContent 内容) 在 Microsoft.Http.HttpMethodExtensions.Method(HttpClient 客户端, HttpMethod 方法, Uri uri, HttpContent body) 在 Microsoft.Http.HttpMethodExtensions.Method(HttpClient客户端,HttpMethod 方法,字符串 uri,HttpContent 正文)在 Microsoft.Http.HttpMethodExtensions.Post(HttpClient 客户端,字符串 uri,HttpContent 正文)

在这方面的任何帮助将不胜感激,因为过去几天我一直在关注此问题,并且我也阅读了 *** 中的一些文章甚至问题,但没有任何帮助。提前谢谢...

【问题讨论】:

要添加的评论:- 它发布了 2 次。不是2或3次。抱歉没有具体说明。 此代理/或远程机器是否在您的控制范围内?在那种情况下,您是否检查了该机器上设置的连接超时间隔的值?这看起来不像您的代码中的问题(除了您应该处理错误并重试这一事实) 但是我们仍然认为问题出在我们的代码上......意味着,我们应该错过一些东西 - 它与资源利用率有关。我这样说是因为,每次我们重新启动应用程序池时,它都能正常工作。如果它再次超时并且我们重新启动应用程序池,它就会工作。这迫使我们相信这个 HttpClient 应该有一些我们缺少的东西。它与服务器的超时值没有任何联系。这是因为,从服务器日志中,我们可以发现请求(超时)还没有到达服务器。 【参考方案1】:

某些公司的代理规则会导致POST请求出现问题。

GET 请求工作正常。检查您的操作系统代理设置是否已禁用。

Windows 7:控制面板 > Internet 选项 > 连接(选项卡)。

然后点击“局域网设置”按钮,然后取消选中“为您的局域网使用代理服务器”。

或者,尝试让您的网络管理员将您正在使用的连接添加到排除列表中。

【讨论】:

以上是关于在 C# 中使用 Post 方法 HttpClient 时请求超时的主要内容,如果未能解决你的问题,请参考以下文章

使用承载令牌在 C# 中构建 post HttpClient 请求

模型在使用 C# 将 POST 方法作为参数传递给 ASP.NET MVC 中同一控制器的 GET 方法时获取 NULL

WebService Get/Post/Soap 方式请求

如何使用 C# 在 POST 请求中发送 json 数据 [重复]

在 C# 中,是不是可以重构我的 Post 和 Put 方法以消除代码重复?

在 PHP 中使用“POST”通过 C# 中的 JSON 检索数据库信息