首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpWebRequest - GetResponse() - WebException ReceiveFailure

HttpWebRequest - GetResponse() - WebException ReceiveFailure
EN

Stack Overflow用户
提问于 2013-07-23 19:58:09
回答 2查看 3.5K关注 0票数 2

我有一个WCF服务,它每分钟运行到外部API的频繁(1000+)出站连接。

我的代码经常抛出以下异常,但并不总是显示是一个ReceiveFailure状态属性为WebException的WebException

发出出站请求的代码如下:

代码语言:javascript
复制
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文档,但这对我没有帮助。

EN

回答 2

Stack Overflow用户

发布于 2013-07-23 20:28:58

在黑暗中射击..。

在等待响应时,有一个特殊的条件:如果系统时钟是由Windows时间服务自动设置的,或者是手动设置的,您可能会遇到一些不可预测的结果。

如果您在HTTPS上发送请求,可能您正面临一个错误抛出的常规超时( ReceiveFailure )。

有关更多信息,请查看本文:http://support.microsoft.com/kb/2007873

票数 1
EN

Stack Overflow用户

发布于 2020-07-29 17:54:07

我有一个相关的问题,在我寻找解决方案的时候,我意识到一些事情。

  • WebExceptionStatus enum不等同于您调用的API返回的http状态代码。相反,它是一个可能的错误的枚举,可能发生在一个http调用。
  • 当您从API接收到一个错误(400-599)时,将返回的WebExceptionStatus错误代码是WebExceptionStatus.ProtocolError,也就是编号7的int。
  • 当您需要获取从api返回的响应体或真正的http状态代码时,首先需要检查WebException.Status是否为WebExceptionStatus.ProtocolError。然后,您可以从WebExceptionStatus.Response获得真正的响应并阅读其内容。
  • 有时超时由调用方(也就是您的代码)处理,因此在这种情况下没有响应。所以你可以看看WebException.Status是否是WebExceptionStatus.Timeout

这就是一个例子:

代码语言:javascript
复制
try
{
    ...
}
catch (WebException webException)
{
    if (webException.Status == WebExceptionStatus.ProtocolError)
    {
        var httpResponse = (HttpWebResponse)webException.Response;
        var responseText = "";
        using (var content = new StreamReader(httpResponse.GetResponseStream()))
        {
            responseText = content.ReadToEnd(); // Get response body as text
        }
        int statusCode = (int)httpResponse.StatusCode; // Get the status code
    }
    else if (webException.Status == WebExceptionStatus.ProtocolError)
    {
       // Timeout handled by your code. You do not have a response here.
    }

    // Handle other webException.Status errors. You do not have a response here.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17819881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档