当处理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
答案 0 :(得分:0)
这里有各种可能性 - DNS查找,代理等。
我建议您在有问题的计算机上安装WireShark,然后查看完全发生了什么 - 这应该会告诉您问题所在。
(顺便说一句,我强烈建议你对作家,流,using
等使用WebResponses
语句。我不认为这是问题所在,但如果发生了某些事情,那么你无法关闭WebResponse
,由于连接池的原因,您最终可能会因为未来对同一主机的请求而超时。)