C# 要使用哪个WebException状态代码?

C# 要使用哪个WebException状态代码?,c#,asp.net-mvc,system.net.webexception,C#,Asp.net Mvc,System.net.webexception,我有一个c#应用程序,它向几个API发送请求,但今天早些时候,其中一个API似乎关闭了一段时间,并在我的异常处理程序中引发了一个异常: catch (WebException e) { var statusCode = ((HttpWebResponse)e.Response).StatusCode; //Use status code and exception for reporting and handling. } 这导致了一个问题,因为当时异常没有响应,所以我试图获取

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

catch (WebException e)
{
    var statusCode = ((HttpWebResponse)e.Response).StatusCode;
    //Use status code and exception for reporting and handling.
}
这导致了一个问题,因为当时异常没有
响应
,所以我试图获取nothing的StatusCode,并引发了NullPointerException

此后,我将其更改为此,以便在没有响应时尝试获取状态代码(无论如何,除了状态代码之外,我没有使用响应)

从中可以看出,您可以尝试从响应中获取状态,也可以从异常中获取状态

我的问题是,我是应该同时尝试这两种方法,还是一种方法优于另一种方法?

例如,为了测试我现在使用的代码,我可以手动抛出一个WebException,只显示状态,没有响应

是否有任何情况下,我会得到一个没有异常状态的响应?或者,是否存在响应中的状态代码更详细或与异常本身中的状态代码直接不同的情况

我正在用一个基本的
HttpWebRequest
打电话

更新:
我无法控制与之交互的API,直到今天发生了故障,我才发现有可能在没有响应的情况下返回。我手动将其设置为500,以便在catch块中进一步处理我自己的错误,我的用户不知道我使用的是什么。我只是想问,一种检索状态码的方法是否比另一种更好/不同。或者如果我不应该依赖于一种方法而不是另一种方法,如果我应该同时尝试这两种方法以及选择哪种方法?

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

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

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


这就是错误处理的美妙之处;您可以捕获错误,尽最大努力,并可以转换为标准化的HTTP状态

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

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

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


这就是错误处理的美妙之处;您可以捕获错误,尽最大努力,并可以转换为标准化的HTTP状态

我也有同样的问题,在寻找解决方案的过程中,我意识到了一些事情

  • WebExceptionStatus
    enum
    不等同于您调用的API返回的http状态代码。相反,它是http调用期间可能发生的可能错误的枚举
  • 当您从API收到错误(400到599)时,将返回的
    WebExceptionStatus
    错误代码是
    WebExceptionStatus.ProtocolError
    aka number 7 as int
  • 当您需要获取响应正文或从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
}

我也有同样的问题,在寻找解决方案的过程中,我意识到了一些事情

  • WebExceptionStatus
    enum
    不等同于您调用的API返回的http状态代码。相反,它是http调用期间可能发生的可能错误的枚举
  • 当您从API收到错误(400到599)时,将返回的
    WebExceptionStatus
    错误代码是
    WebExceptionStatus.ProtocolError
    aka number 7 as int
  • 当您需要获取响应正文或从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
}

我无法控制与之交互的API,直到今天发生了故障,我才发现有可能在没有响应的情况下返回。我手动将其设置为500,以便在catch块中进一步处理我自己的错误,我的用户不知道我使用的是什么。我只是想问,一种检索状态码的方法是否比另一种更好/不同。或者如果我不应该依赖于一种方法而不是另一种方法,如果我应该同时尝试这两种方法,并且选择哪种方法?你所拥有的是try-catch-try,我只是不报告其他人的错误作为500,我将使用无响应,让最终用户我们无法验证…我无法控制与之交互的API,直到今天发生故障,我才发现有可能返回无响应。我手动将其设置为500,以便在catch块中进一步处理我自己的错误,我的用户不知道我使用的是什么。我只是想问,如果有一种方法