gpt4 book ai didi

c# - HttpWebRequest 在第二次调用 Web 服务器时超时

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:43 25 4
gpt4 key购买 nike

我这里遇到一个非常奇怪的问题:

Python Paste Web 服务器上有一个 RESTfull Web 服务,WPF .net 应用程序每 2 秒向服务器发出一个 http POST 请求。问题是,在第二次调用服务器时,请求超时!有时稍后(例如第四或第五)请求再次工作,稍后我再次收到此“超时”异常!

IntelliTrace 显示 ws2_32.dll 中有一个被阻止的操作:

A blocking operation was interrupted by a call to WSACancelBlockingCall

我使用 asp.net 在 IIS 上模拟了 REST Web 服务器,问题不再存在,所以我认为可能是 Python 服务器配置的问题!但是当我从浏览器中发出请求时,Python Web 服务器可以正常工作!

但是我在 .net 客户端应用程序中尝试了不同的操作:

  • 我增加了 ServicePoint 的 DefaultConnectionLimit:

    ServicePointManager.DefaultConnectionLimit = 500;

  • 我为向服务器发出的任何新请求创建了一个新线程,并在请求完成后中止它!

  • 我在任何请求之前创建了一个新的 AppDomain,并在进程完成时显式卸载它!

  • 尝试了不同的 http 请求 header :connection=keep-alive、accept=*

以上似乎都不起作用!然而有趣的是,当我在 VS 2012 中的 GetRequestStream() 行设置断点时,请求超时并且正常工作!

使用反射调试 .net 托管代码 我发现 ws2_32.dll 的非托管 recv 方法会导致操作阻塞,从而导致 Web 请求超时!

这是 C# 代码:

static void Main(string[] args)
{
Task.Run(() =>
{
while (true)
{
Thread.Sleep(2000);
Console.WriteLine(PostData());
}
});

Console.ReadLine();
}

public static string PostData()
{
try
{
var response = "";
var httpRequest = WebRequest.CreateHttp("http://remote_address");
httpRequest.ServicePoint.ConnectionLimit = 500;
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.Timeout = 5000;

using (var writer = new StreamWriter(httpRequest.GetRequestStream()))
{
writer.Write("req=" + "[some parameters]");
}

using (WebResponse httpResponse = httpRequest.GetResponse())
{
using (var data = httpResponse.GetResponseStream())
{
StreamReader sr = new StreamReader(data, Encoding.UTF8);
response = sr.ReadToEnd();
}

httpResponse.Close();
}

return response;
}
catch (WebException ex)
{
return "time out!";
}
}

我可以做些什么来让这项工作成功吗?

最佳答案

我设法通过禁用 Expect100Continue header 解决了该问题:

ServicePointManager.Expect100Continue = false;

根据 HTTP 1.1 协议(protocol),当发送此 header 时,使用 POST 方法的客户端请求期望从服务器接收 100-Continue 响应来指示客户端应该发送要发布的数据。

将此属性设置为 true(这是 .Net 的默认行为),数据不会随初始请求一起发送。相反,此 header 会发送到 Web 服务器,如果实现正确,该服务器会响应 100-Continue。但是,并非所有 Web 服务器都能正确处理此问题,包括我尝试向其发布数据的服务器。我使用 Fiddler 嗅探了 header ,并注意到我的代码确实发送了此 header ,而 Python Paste 则没有!

关于c# - HttpWebRequest 在第二次调用 Web 服务器时超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13399947/

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