【问题标题】:Oubound HttpWebRequest in ASP.NET still timing out after destination server comes back up目标服务器恢复后,ASP.NET 中的出站 HttpWebRequest 仍然超时
【发布时间】:2013-04-19 05:13:11
【问题描述】:

我们有一个 ASP.NET Web 应用程序 (MVC3),它使用 HttpWebRequest 调用另一个 Web 服务器。

无论如何,当远程服务器出现故障时,我们会开始收到超时错误,这是我们所预料的。

但是,当远程服务器重新启动时,我们继续收到超时错误。刷新应用程序池可以解决问题,但我们真的不希望每次都重新启动应用程序池。

是否存在可能存储错误超时连接的池?我的期望是,如果连接抛出错误,它会被处理掉,然后我们下次会得到一个新的连接,但情况似乎并非如此。

我们的代码如下所示:

var request = (HttpWebRequest)HttpWebRequest.Create(url);
int timeout = GetTimeout();
request.ReadWriteTimeout = timeout;

WebRequest.DefaultWebProxy = null; 

var asyncResult = request.BeginGetResponse(null, null);
bool complete = asyncResult.AsyncWaitHandle.WaitOne(timeout);
if (!complete)
{
    ThrowTimeoutError(url, timeout);
}
using (var webResponse = request.EndGetResponse(asyncResult))
{
    using (var responseStream = webResponse.GetResponseStream())
    {
        using (var responseStreamReader = new StreamReader(responseStream))
        {
            responseXml = responseStreamReader.ReadToEnd();
        }
    }
}

【问题讨论】:

    标签: c# asp.net httpwebrequest


    【解决方案1】:

    你见过/试过ServicePoint classCloseConnectionGroup方法吗?

    来自 MSDN 文档:

    连接组将一组请求与特定的 连接或一组连接。此方法删除并关闭所有 属于指定连接组的连接。

    调用此方法可能会重置您的连接,而无需重新启动池。

    【讨论】:

    • 我确实在 ServicePoint 类中看到了一些东西,但我们无法对它们进行试验。我们只是不时在生产中看到这种情况,并且将代码推送到那里是一个 3 周的周期。我希望(可能过于乐观)有人会说“是的,我遇到了同样的问题,这是解决方法......”:)
    • @MikeMooney:我知道你的意思,像这样的问题很臭。是的,建议的解决方案是在黑暗中拍摄,您可能需要等待数周才能看到它是否真的“有效”......但我想在超时或任何其他 I/O 的情况下运行 CloseConnectionGroup失败将是相当无害的。 IE。即使它不能解决您的问题,也不应该引入新问题。 :-)
    • 谢谢保罗,我会试一试的。希望我能在一两周内回来并标记答案已接受! :)
    • 是的,关闭连接组似乎已经解决了这个问题。棘手的部分是确定何时需要重置。显然不是每次连接超时,因为它们可能有很多原因发生,我们不想在这种情况下破坏每个连接。最后,我编写了一个(可能是不必要的复杂)缓存,它存储了过去 X 秒内有多少超时,并在超过某个阈值时回收连接组。对于 .NET/IIS 应该自动处理的东西来说,这是 WAAAAAY 太多的工作。
    • @MikeMooney +1 感谢您对解决方案的反馈!
    猜你喜欢
    • 2011-05-01
    • 2022-11-09
    • 1970-01-01
    • 2018-12-12
    • 2013-10-03
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多