System.Net的HttpStatusCode类没有422错误代码。

47

有没有一种优雅地处理http状态码422的方法。 我在寻找最佳实践。 我知道HttpStatusCode是一个枚举,所以我尝试了这个:

HttpStatusCode Unprocessable = (HttpStatusCode)422;
if (Response == (HttpStatusCode)422)

但是不允许我进行比较。这里我做错了什么吗?

在运行时添加此状态代码的最佳方法是什么。


只需查看此链接,没有422状态码。 - Peyman
1
这就是我想问的……如果我想使用422,我可以扩展这个枚举吗? - golldy
不,你不能这样做,为什么要扩展ResponseCode枚举。那是使用标准响应代码。https://dev59.com/oHRA5IYBdhLWcg3w_DAw - Peyman
“Respose” 真的是一个 “HttpStatusCode” 吗? - CodesInChaos
1
@codesinchaos。暂且假设是这样的,这不是问题所在。 - golldy
@golldy 在这种情况下,我需要将其标记为“无法重现”并关闭。请提供一个能够展示问题的可工作示例。至少在使用完整框架时,(HttpStatusCode)422 对我来说非常有效。 - CodesInChaos
3个回答

41

我一直在使用RestSharp,该库将服务器响应状态码作为HttStatusCode类型的属性返回,但我需要自己检查是否有422响应,但是这种类型并不包括422。幸运的是,我仍然可以使用以下方法进行测试:

if(response.StatusCode == (HttpStatusCode)422)
{
    // Do my stuff..
}

很酷,很高兴听到它能正常工作。这很有道理,因为enum实际上就是int。 - Matt

6

.NET 的旧版本没有这个 HTTP 状态码,但一些新版本有(请参阅微软文档)。


如果您正在使用旧版框架,则可以获取响应并像下面这样检查 StatusCode(就像 Nick 所说的那样):

var httpResponseCode = Response as HttpWebResponse;
if (httpResponseCode.StatusCode == (HttpStatusCode)422)
{
    //your code here
}

1
如果您的API中有多个操作可能会返回422,您可以考虑将检查封装在扩展方法中,如下所示:

如果您的API中有多个操作可能会返回422,您可以考虑将检查封装在扩展方法中,如下所示:

    public static bool IsUnprocessableEntityResponse(this HttpResponseMessage message)
    {
        Requires.NotNull(message, nameof(message));

        return (int) message.StatusCode == StatusCodes.Status422UnprocessableEntity;
    }

然后你可以在客户端中这样使用它:
    if (response.IsUnprocessableEntityResponse())
        return Response.UnprocessableEntity<Resource>();

同时避免在源代码中使用422这个神奇数字。

2
如果有人阅读此内容并想知道StatusCodes.Status422UnprocessableEntity在哪里,它是Microsoft.AspNetCore.Http.Abstractions的一部分。 - Darrell
@Darrell,发现的不错。但对我来说,这似乎不足以证明添加对附加程序集的引用是必要的。 - Chris W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接