c# - HttpWebRequest异常遇到的延迟差异

时间:2011-08-17 08:20:19

标签: c# .net httpwebrequest

当处理500服务器错误时,我遇到了一些非常奇怪的HttpWebRequest行为。

在下面的代码示例中,您可以假设http://example.com/service.endpoint在调用时立即返回500服务器错误。

当我在台式PC(运行Windows 7的标准x86机器)上运行此代码时,会引发异常,我会记录它,并且该方法会立即完成。这是我想要的行为。

当我在开发服务器(运行Windows Server 2008 R2 Standard的Xeon x64上的vmware客户机)上运行此代码时,会立即引发异常,但该方法需要大约15秒才能完成(在异常之后)被抚养长大。)

我的问题是 - 可能导致两种测试之间观察到的行为差异?

(两种方法的运行条件都相同 - 即我没有在桌面上运行Visual Studio中的代码 - 两者都在相同的服务包装器中运行。)

非常感谢您提供的任何帮助。

    void MakeRequest(StringBuilder postParams)
    {
        var req = (HttpWebRequest)WebRequest.Create("http://example.com/service.endpoint");

        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        req.KeepAlive = false;

        string postData = postParams.ToString();
        req.ContentLength = postData.Length;

        req.Timeout = 10000;

        Console.WriteLine("Requested started.");

        var stOut = new StreamWriter(req.GetRequestStream(), Encoding.ASCII);
        stOut.Write(postData);
        stOut.Close();

        WebResponse response = null;
        try
        {
            response = req.GetResponse();

            Stream receiveStream = response.GetResponseStream();

            // Deal with response here

            response.Close();
            Console.WriteLine("Request completed.");
        }
        catch (Exception ex)
        {
            if (response != null) response.GetResponseStream().Close();
            req.Abort();
            Console.WriteLine("Exception with request raised: {0}", ex);
        }
        // Delay is observed between above "Exception with request.." and following line:
        Console.WriteLine("MakeRequest() has completed.");
    }

编辑:使延迟存在的地方更清楚

此调用所产生的日志的严重编辑版本如下所示。它用于显示在服务器上观察到狮子会延迟共享的位置(这在我的桌面上看不到):

2011-08-16 16:39:32,475 [STP OrderPool Thread #0] INFO   - Submitting quote to REDACTED
2011-08-16 16:39:32,490 [STP OrderPool Thread #0] INFO   - Invoking ASSEMBLY_NAME_REDACTED, Version=1.0.4245.27855, Culture=neutral, PublicKeyToken=null::REDACTED
2011-08-16 16:39:32,709 [STP OrderPool Thread #0] INFO   - Sending request to: http://example.com/service.endpoint
2011-08-16 16:39:36,334 [STP OrderPool Thread #0] ERROR  - Exception
System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
   at System.Net.HttpWebRequest.GetResponse()
   at HL.Services.Blackbird.LondonBestxHub.Reuters.Execute.MakeRequest(String serviceName, StringBuilder postParams)
2011-08-16 16:39:57,381 [STP OrderPool Thread #0] INFO  - MakeRequest call completed

1 个答案:

答案 0 :(得分:0)

这里有各种可能性 - DNS查找,代理等。

我建议您在有问题的计算机上安装WireShark,然后查看完全发生了什么 - 这应该会告诉您问题所在。

(顺便说一句,我强烈建议你对作家,流,using等使用WebResponses语句。我不认为这是问题所在,但如果发生了某些事情,那么你无法关闭WebResponse,由于连接池的原因,您最终可能会因为未来对同一主机的请求而超时。)