检查HttpStatusCode是否表示成功或失败

Mat*_*ero 80 .net c# system.net

假设我有以下变量:

System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;
Run Code Online (Sandbox Code Playgroud)

如何检查这是成功状态代码还是失败状态代码?

例如,我可以执行以下操作:

int code = (int)status;
if(code >= 200 && code < 300) {
    //Success
}
Run Code Online (Sandbox Code Playgroud)

我也可以有一些白名单:

HttpStatusCode[] successStatus = new HttpStatusCode[] {
     HttpStatusCode.OK,
     HttpStatusCode.Created,
     HttpStatusCode.Accepted,
     HttpStatusCode.NonAuthoritativeInformation,
     HttpStatusCode.NoContent,
     HttpStatusCode.ResetContent,
     HttpStatusCode.PartialContent
};
if(successStatus.Contains(status)) //LINQ
{
    //Success
}
Run Code Online (Sandbox Code Playgroud)

这些替代方案都没有说服我,我希望有一个.NET类或方法可以为我做这项工作,例如:

bool isSuccess = HttpUtilities.IsSuccess(status);
Run Code Online (Sandbox Code Playgroud)

dca*_*tro 150

如果你正在使用这HttpClient门课,那么你会得到一个HttpResponseMessage回来.

这个类有一个有用的属性IsSuccessStatusCode,可以为你做检查.

using (var client = new HttpClient())
{
    var response = await client.PostAsync(uri, content);
    if (response.IsSuccessStatusCode)
    {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你很好奇,这个属性实现为:

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您HttpClient直接使用,则可以重复使用此算法.

如果EnsureSuccessStatusCode响应不成功,您还可以使用抛出异常.

  • 仅供参考:对我来说是“response.IsSuccessful”。 (3认同)

Tom*_*ode 10

HttpResponseMessage类有一个IsSuccessStatusCode属性,查看它是这样的源代码,因为usr已经建议200-299可能是你能做的最好的.

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}
Run Code Online (Sandbox Code Playgroud)


use*_*548 10

接受的答案让我感到困扰,因为它包含了神奇的数字,(尽管它们是标准的)在它的第二部分.并且第一部分不是普通整数状态代码的通用部分,尽管它接近我的答案.

通过使用状态代码实例化HttpResponseMessage并检查是否成功,可以获得完全相同的结果.如果值小于零或大于999,它会抛出一个参数异常.

if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这不是很简洁,但你可以把它作为一个扩展.

  • "接受的答案让我感到困扰,因为它包含了神奇的数字,(尽管它们是标准的)" - 如果它们标准化,易于理解,并且永远不会改变,它们就不是"魔术".直接使用代码绝对没有错.如果你有'IsSuccessStatusCode`然后很好,请使用它(正如接受的答案所说的那样).否则,除非你在整个地方执行此检查,否则不要使用抽象添加自己的残骸. (3认同)
  • 请记住,实例化“HttpResponseMessage”以使用其属性之一比使用“int”检查两个逻辑条件花费更多时间。 (3认同)

boj*_*ngo 9

我偏爱扩展方法的可发现性。

public static class HttpStatusCodeExtensions
{
    public static bool IsSuccessStatusCode(this HttpStatusCode statusCode)
    {
        var asInt = (int)statusCode;
        return asInt >= 200 && asInt <= 299;
    }
}
Run Code Online (Sandbox Code Playgroud)

只要您的命名空间在范围内,用法就是statusCode.IsSuccessStatusCode().

  • @sfors,是的,但是如果范围内只有“HttpStatusCode”怎么办?有很多库不使用或公开“HttpResponseMessage”,但确实为您提供状态代码。 (4认同)

ozb*_*zba 8

添加到@TomDoesCode回答如果您正在使用HttpWebResponse,您可以添加此扩展方法:

public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse)
{
    return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299);
}
Run Code Online (Sandbox Code Playgroud)