要使用哪个WebException状态代码?

时间:2017-05-19 16:41:04

标签: c# asp.net-mvc system.net.webexception

我有一个c#应用程序向多个API发送请求,但是今天早些时候其中一个似乎停机了一段时间并在我的异常处理程序中引发异常:

catch (WebException e)
{
    var statusCode = ((HttpWebResponse)e.Response).StatusCode;
    //Use status code and exception for reporting and handling.
}

这导致了一个问题,因为当时,Exception没有Response,因此我试图获取StatusCode,并抛出NullPointerException。

我已将其更改为此,以便在没有响应的情况下尝试获取状态代码(除了状态代码之外,我没有使用响应)。

catch (WebException e)
{
    //Try to get the status code from the exception, can fail somehow.
    HttpStatusCode statusCode;
    try
    {
        statusCode = (HttpStatusCode)e.Status;
    }
    catch(Exception innerE)
    {
        //Capture exceptions for logging
        //...
        //Set a default code to continue.
        statusCode = HttpStatusCode.InternalServerError;
    }
    //Use status code and exception for reporting and handling.
}

this answer看起来您可以尝试响应中的状态和异常中的状态。

我的问题是,我是否应该尝试两者,或者是否会将其设置为另一个?

例如,为了测试我现在使用的代码,我能够手动抛出只有状态且没有响应的WebException。

是否有任何实例可以获得没有异常状态的响应?或者,如果可能存在响应中的状态代码直接来自异常本身的状态代码更详细或不同的情况?

我正在使用基本HttpWebRequest进行通话。

更新

我与之互动的API无法控制,直到今天发生故障,才发现有可能无法回复。我手动将它设置为500以便我自己在catch块中进行错误处理,我的用户不知道我使用的是什么。我只是问一种检索StatusCode的方法是否比另一种方式更好/不同。或者,如果我不应该依赖一种方法而不是另一种方法,如果我应该尝试两种方法,哪种方式更喜欢?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,在寻找解决方案时我意识到了一些事情。

  • WebExceptionStatus enum不等同于您调用的API返回的http状态代码。相反,它是一个可能的错误枚举,可能在http调用期间发生。
  • 当您从API收到错误(400到599)时返​​回的WebExceptionStatus错误代码是WebExceptionStatus.ProtocolError,也就是数字7(整数)。
  • 当您需要获取响应正文或从api返回的实际http状态代码时,首先需要检查WebExceptionStatus.Status是否为WebExceptionStatus.ProtocolError。然后,您可以从WebExceptionStatus.Response获得真实的响应并阅读其内容。

这是一个示例:

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
    }

    // Handle other webException.Status errors
}

答案 1 :(得分:0)

我对类似情况的处理是尽可能尝试从远程服务器获取尽可能多的数据。如果没有响应,catch将手动分配状态代码。

当您开始发回各种代码时会出现问题,尤其是5xx系列服务器错误。我不喜欢将他们的500作为我的问题归还。

从长远来看,捕获的Web Exceptions只会登录到ApiError表,我会返回我觉得最合适的响应代码,回到408或者如果没有响应我会发回非标准444“无响应”代码。

这就是错误处理的美妙之处;你发现错误,尽你所能,并可以转换为标准化的HTTP状态。