【问题标题】:Which WebException Status Code To Use?使用哪个 WebException 状态码?
【发布时间】:2017-10-19 21:07:50
【问题描述】:

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

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

这导致了一个问题,因为当时异常没有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 的方式是否比另一种方式更好/不同。或者,如果我不应该依赖一种方法而不是另一种方法,是否应该同时尝试两种方法以及更喜欢哪种方法?

【问题讨论】:

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


    【解决方案1】:

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

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

    从长远来看,捕获的 Web 异常只会被记录到 ApiError 表中,我会返回我认为最合适的响应代码,回退到 408,或者如果没有响应,我会发回非标准的“无响应”的 444 代码。

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

    【讨论】:

    • 我与之交互的 API 无法控制,直到今天发生故障,我才发现可以返回而没有响应。我将它手动设置为 500,以便在 catch 块中进一步处理我自己的错误,我的用户不知道这是我使用的。我只是在问一种检索 StatusCode 的方式是否比另一种方式更好/不同。或者如果我不应该依赖一种方法而不是另一种方法,我应该同时尝试哪种方法以及更喜欢哪一种?
    • try-catch-try 可以满足您的要求,我只是不会将其他人的错误报告为 500,我会选择 No Response 并让最终用户我们可以不验证 ....
    【解决方案2】:

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

    • 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
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2014-11-23
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多