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

本文关键字:失败 成功 表示 HttpStatusCode 是否 检查 | 更新日期: 2023-09-27 18:12:45

假设我有以下变量:

System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;

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

例如,我可以这样做:

int code = (int)status;
if(code >= 200 && code < 300) {
    //Success
}

我也可以有一些白名单:

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

这些选择都不能说服我,我希望有一个。net类或方法可以为我做这项工作,例如:

bool isSuccess = HttpUtilities.IsSuccess(status);

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

如果您使用的是HttpClient类,那么您将得到一个HttpResponseMessage

这个类有一个有用的属性叫做IsSuccessStatusCode,它会为你做检查。

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

如果你很好奇,这个属性是这样实现的:

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

所以你可以重用这个算法,如果你直接使用HttpClient

您还可以使用EnsureSuccessStatusCode在响应不成功的情况下抛出异常。

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

您可以通过使用状态码实例化HttpResponseMessage并检查是否成功来实现完全相同的结果。如果值小于0或大于999,则抛出参数异常。

if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode)
{
    // ...
}

这不是很简洁,但是你可以把它做成一个扩展。

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

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

只要您的名称空间在作用域中,用法将是statusCode.IsSuccessStatusCode()

HttpResponseMessage类有一个IsSuccessStatusCode属性,查看源代码,就像usr已经建议的200-299可能是你能做的最好的。

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

添加到@TomDoesCode答案如果你正在使用HttpWebResponse你可以添加这个扩展方法:

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

这取决于您正在调用的HTTP资源。通常,2xx范围被定义为成功状态码的范围。这显然不是每个HTTP服务器都会遵守的约定。

例如,在网站上提交表单通常会返回302重定向。

如果你想设计一个通用的方法,那么code >= 200 && code < 300的想法可能是你最好的选择。

如果你调用你的自己的服务器,那么你可能应该确保你标准化的200

这是前一个答案的扩展,避免了每次调用都创建新对象和随后的垃圾收集。

public static class StatusCodeExtensions
{
    private static readonly ConcurrentDictionary<HttpStatusCode, bool> IsSuccessStatusCode = new ConcurrentDictionary<HttpStatusCode, bool>();
    public static bool IsSuccess(this HttpStatusCode statusCode) => IsSuccessStatusCode.GetOrAdd(statusCode, c => new HttpResponseMessage(c).IsSuccessStatusCode);
}