.NET 中的 WebRequest 异常

4

我使用这段代码片段来验证URL中指定的文件是否存在,并在每个用户上每隔几秒钟尝试一次。有时(大多数情况下是在有大量用户使用网站时)该代码不起作用。

    [WebMethod()]
    public static string GetStatus(string URL)
    {
        bool completed = false;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            try
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    completed = true;
                }
            }
            catch (Exception)
            {
                //Just don't do anything. Retry after few seconds
            }
        }

        return completed.ToString();
    }

当我查看Windows事件日志时,发现有几个错误:

Unable to read data from the transport connection. An existing connection was forcibly closed

The Operation has timed out

The remote host closed the connection. The error code is 0x800703E3

当我重启IIS时,事情会正常工作,直到下一次发生这种情况。
1个回答

4

您正在将try/catch语句放在using语句内,而可能会抛出异常的是request.GetResponse方法:

bool completed = false;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
try
{
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        if (response.StatusCode == HttpStatusCode.OK)
        {
            completed = true;
        }
    }
}
catch (Exception)
{
    //Just don't do anything. Retry after few seconds
}
return completed.ToString();

你能解释一下为什么会抛出这个异常吗?我确实读到了需要将KeepAlive属性设置为false,但不确定在这种情况下是否需要这样做。 - DotnetDude
1
当HTTP请求超时时,可能会出现太多的情况。 - Darin Dimitrov
1
理论上,当HTTP请求超时时,我认为它应该只是关闭连接。我不确定为什么其他用户会在一个连接超时后立即受到影响。 - DotnetDude
2
因为ASP.NET使用线程池来处理请求,当该池中的所有线程都已用尽并且需要等待远程服务器响应时,Web服务将无法再接受新的请求。对于慢速请求,建议使用依赖于IOCP的异步API(例如:BeginGetResponse、EndGetResponse)。 - Darin Dimitrov
你已经在可回收对象周围有一个 using 语句,这将确保它们将被正确处理。try/catch 只是用于避免 Web 方法将异常传播到调用者,并在访问远程 URL 时抛出错误时返回 false - Darin Dimitrov
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接