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

时间:2015-09-14 16:48:19

标签: c# .net system.net

假设我有以下变量:

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);

6 个答案:

答案 0 :(得分:126)

如果您正在使用HttpClient课程,那么您将获得HttpResponseMessage

此类有一个名为IsSuccessStatusCode的有用属性,可以为您进行检查。

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

如果您有好奇心,此属性为implemented

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

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:7)

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

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

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

这不完全简洁,但你可以把它作为一个扩展。

答案 3 :(得分:6)

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

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

答案 4 :(得分:3)

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

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

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

如果您正在调用自己的服务器,那么您可能应该确保在200上进行标准化。

答案 5 :(得分:0)

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

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);
}