HttpWebRequest在第二次调用Web时超时

2024-09-27 00:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个很奇怪的问题:

Python Pasteweb服务器上有一个RESTfull web服务,WPF.net应用程序每2秒向服务器发出一个httppost请求。问题是第二次调用服务器时,请求超时!有时稍后(比如第四或第五次)请求一次又一次地工作,我得到这个“超时”异常!在

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

A blocking operation was interrupted by a call to WSACancelBlockingCall

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

不过,我在.net客户端应用程序中尝试了不同的方法:

  • 我增加了服务点的DefaultConnectionLimit

    ServicePointManager.DefaultConnectionLimit = 500;

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

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

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

以上这些似乎都不管用!然而有趣的是,当我在VS2012中为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!";
    }
}

我能做些什么使这项工作成功吗?在


Tags: 方法服务器web应用程序httpnetresponsevar
1条回答
网友
1楼 · 发布于 2024-09-27 00:23:10

我设法解决了禁用Expect100Continue头的问题:

ServicePointManager.Expect100Continue = false;

根据HTTP 1.1协议,当这个头被发送时,使用POST方法的客户机请求期望从服务器接收100-Continue响应,以指示客户机应该发送要发布的数据。在

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

相关问题 更多 >

    热门问题