我有一个WCF服务,每分钟为外部API运行频繁(1000+)出站连接。
我的代码经常抛出以下异常,但并不总是显示WebException,其WebException状态属性为 ReceiveFailure
发出出站请求的代码如下:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(paramBuilder.ToString());
request.ServicePoint.ConnectionLeaseTimeout = 0;
request.Method = "GET";
request.Timeout = 33000; //33 Second Timeout Is By Design
Stream stream = default(Stream);
HttpWebResponse response = default(HttpWebResponse);
try
{
response = (HttpWebResponse) request.GetResponse();
stream = response.GetResponseStream();
reader = new StreamReader(stream,Encoding.UTF8);
string str = reader.ReadToEnd();
return str;
}
catch (WebException exception)
{
//Handle WebException
}
catch (Exception exception)
{
//Handle Exception
}
finally
{
if (reader != null)
reader.Dispose();
if (response != null)
response.Close();
if (stream != null)
stream.Dispose();
}
异常堆栈跟踪显示异常是由GetResponse()引起的。
偶然发生WebException -ReceiveFailure会导致这种情况发生。
我已经参考了这个状态的MSDN文档,但这对我没有帮助。
答案 0 :(得分:0)
在黑暗中拍摄......
在等待响应时有一个特殊情况:如果系统时钟由Windows时间服务自动设置或手动设置,则可能会遇到一些不可预测的结果。
如果你是通过HTTPS发送请求,也许你正面临一个被错误地抛弃为ReceiveFailure的常规超时。
查看此文章以获取更多信息:http://support.microsoft.com/kb/2007873
答案 1 :(得分:0)
我有一个相关的问题,在寻找解决方案时我意识到了一些事情。
PUT _index_template/template_1
{
"index_patterns": [
"my_template*"
],
"template": {
"mappings": {
"properties": {
"user_id" : {
"type" : "keyword"
}
}
}
},
"priority": 1
}
WebExceptionStatus
不等同于您调用的API返回的http状态代码。相反,它是一个可能的错误枚举,可能在http调用期间发生。enum
错误代码是WebExceptionStatus
,也就是数字7(整数)。WebExceptionStatus.ProtocolError
是否为WebException.Status
。然后,您可以从WebExceptionStatus.ProtocolError
获得真实的响应并阅读其内容。WebExceptionStatus.Response
是否为WebException.Status
这是一个示例:
WebExceptionStatus.Timeout