gpt4 book ai didi

asp.net - "An existing connection was forcibly closed by the remote host"来自 HttpWebRequest 的偶发错误

转载 作者:行者123 更新时间:2023-12-04 08:26:24 27 4
gpt4 key购买 nike

我在一个简单的测试应用程序(Visual Studio 控制台应用程序)上遇到了一个奇怪的零星问题,该应用程序通过向它发送简单的 http 请求并为响应时间计时,充当托管 aspx 网站(不是应用程序)的看门狗。过去我已经使用它很多周了,没有出现这个特殊问题。在一天中看似随机的时间,我的 http 请求开始因上述错误而失败。它们似乎是超时,因为失败的请求都需要 60 秒。经过一段时间的上述一致错误(在一种情况下从几分钟到 90 分钟的随机时间段),错误停止并且 http 响应开始以正常速度(通常大约 0.25 秒)返回而没有错误。看门狗客户端请求触发一个非常简单的数据库查找,在服务器端只需 1-2 行代码。这是托管在共享的 Windows 托管网络主机上。

我还可以通过更新我的主机站点上的任何 .cs 文件来随意触发此行为,这会导致应用程序池回收。我的看门狗应用程序立即开始再次超时并出现上述错误。

它闻起来像是某种回收连接问题,因为如果我只是重新启动看门狗应用程序,它就可以正常工作并且响应开始以正常延迟返回。

我试过设置 request.KeepAlive = false 和 request.ServicePoint.ConnectionLimit = 1,这些都没有帮助。

另一个线索,我无法使用 IIS 管理器连接到托管在该服务器上的两个不同网站中的任何一个,这一直运行良好。我在尝试通过 IIS 管理器连接时收到“底层连接已关闭”。每次。我有一段时间没有更新任何一个网站,所以这不是我的任何改变。

这是一个在 IIS7 上运行的后端 ASP.NET 4 网站,具有集成管道模式下的专用应用程序池。

此外,如果我将看门狗应用程序中的 sleeptime 变量更改为 30 秒之类的值,则问题不会出现。在我相信 10-20 秒的范围内有一些神奇的数字,如果请求暂停的时间超过这个时间,它们永远不会失败。

我认为 IIS 管理器无法连接的事实很好地证明了独立于我的测试应用程序的主机端出现问题,但我想在打开支持事件之前覆盖我的基础......特别是因为我的控制台简单重启应用程序解决了这个问题......至少有一段时间。

class Program
{
//make a simple web request and just return the status code
static string SendHttpMsg(string url, string postData)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte1 = encoding.GetBytes(postData);
request.ContentLength = byte1.Length;
//request.KeepAlive = false; //no effect
//request.ServicePoint.ConnectionLimit = 1; //no effect
Stream requestStream = request.GetRequestStream();
requestStream.Write(byte1, 0, byte1.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
response.Close();
return ((int)response.StatusCode).ToString();
}

static void Main(string[] args)
{
int sleeptime = 5000;
string result = "";
while (true)
{
DateTime start = DateTime.Now;
try
{
//this is a very simple call that results in a very simple, fast query in the database
result = SendHttpMsg("http://example.com/somepage.aspx", "command=test");
}
catch (Exception ex)
{
//fancy exception handling here, removed
}
DateTime end = DateTime.Now;
TimeSpan calltime = end - start;
Console.WriteLine(end.ToString() + ", " + calltime.TotalSeconds.ToString("F") + " seconds " + result);
Thread.Sleep(sleeptime);
}
}
}

最佳答案

您可能有悬空连接,而在 HTTP 1.1 中,您仅限于 2 个连接。

试试 changing the HTTP Protocol Version used in the request :

request.ProtocolVersion = HttpVersion.Version10;

如果这不起作用,它可能需要 long time to resolve the proxy settings ,这可以通过将以下内容添加到 .config 文件来禁用应用程序中的代理设置来修复:
<system.net>
<defaultProxy enabled="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>

如果上述任一方法解决了问题,我建议在您的请求代码周围添加一个 try...catch...finally 块,以确保每个请求都被正确关闭和处理(尝试在您的 finally 中设置 request = null方法中的语句)。

关于asp.net - "An existing connection was forcibly closed by the remote host"来自 HttpWebRequest 的偶发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17519736/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com