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

时间:2012-11-15 14:48:49

标签: c# python .net httpwebrequest

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

Python Paste Web服务器上有一个RESTfull Web服务,WPF .net应用程序每2秒向服务器发出一次http POST请求。问题是在第二次调用服务器时,请求超时!有时后来(说第四或第五)请求再次工作,之后我再次获得这个“超时”例外!

IntelliTrace显示ws2_32.dll中存在阻止的操作:

  

通过调用来中断阻塞操作   WSACancelBlockingCall

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

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

  • 我增加了ServicePoint的DefaultConnectionLimit

    ServicePointManager.DefaultConnectionLimit = 500;

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

  • 我在任何请求之前创建了一个新的AppDomain,并在处理完成后明确地将其卸载了!

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

上述所有内容似乎都无效!然而,有趣的是,当我在VS 2012中为GetRequestStream()行设置断点时,请求 dos not 超时并且正常工作!

使用反射调试.net托管代码我认为recv的非托管ws2_32.dll方法导致操作被阻止,因此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!";
    }
}

我可以做任何事情来完成这项工作吗?

1 个答案:

答案 0 :(得分:1)

我设法修复了禁用Expect100Continue标题的问题:

ServicePointManager.Expect100Continue = false;

根据HTTP 1.1协议,当发送此标头时,使用POST方法的客户端请求期望从服务器接收100-Continue响应,以指示客户端应将数据发送到发布。

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