HttpWebRequest - GetResponse() - WebException ReceiveFailure

时间:2013-07-23 19:58:10

标签: c# .net httpwebrequest webrequest system.net.webexception

我有一个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文档,但这对我没有帮助。

2 个答案:

答案 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调用期间发生。
  • 当您从API收到错误(400到599)时返​​回的enum错误代码是WebExceptionStatus,也就是数字7(整数)。
  • 当您需要获取响应正文或从api返回的实际http状态代码时,首先需要检查WebExceptionStatus.ProtocolError是否为WebException.Status。然后,您可以从WebExceptionStatus.ProtocolError获得真实的响应并阅读其内容。
  • 有时超时是由调用方(也就是您的代码)处理的,因此在这种情况下您没有响应。因此,您可以查看WebExceptionStatus.Response是否为WebException.Status

这是一个示例:

WebExceptionStatus.Timeout