为什么 HttpException.GetHttpCode() 返回 int 而不是 System.Net.HttpStatusCode?

4
我知道我可以将GetHttpCode()的结果强制转换为HttpStatusCode,但我不喜欢转换枚举类型。特别是因为MSDN文档没有明确说明枚举值始终是精确对应的HTTP状态码。
我觉得GetHttpCode()应该直接返回HttpStatusCode
我应该停止抱怨并进行强制类型转换吗?
catch(HttpException ex)
{
    switch((HttpStatusCode)ex.GetHttpCode())
    {
        case HttpStatusCode.NotFound: 
            // Do stuff...
            break;
        // More cases...
    }
}

注意,HttpWebResponse.StatusCode类型HttpStatusCode
5个回答

9
值得注意的是,HTTP允许使用自定义状态码,因此不能保证该枚举值包含响应的值。出于这个原因,API返回int值而不是尝试使用枚举是明智的选择。

嗯,我在想为什么 HttpStatusCode 是一个枚举而不是只有常量整数的静态类。这里有个人定义了自己的枚举以支持自定义值(WebDAV?):http://devio.wordpress.com/2007/11/14/http-status-codes-in-c/。`HttpWebResponse.StatusCode` 的类型确实是 HttpStatusCode。我认为它可能包含未定义的枚举值,这很容易让人感到困惑。 - Matthijs Wessels
枚举类型在大多数情况下都很有用:在.NET框架和Http的标准行为范围内,拥有一个Enum类型是很有用的。该枚举(根据MSDN)“包含在RFC 2616中定义的HTTP 1.1状态代码的值。”我想更有可能返回自定义错误值而不是自定义成功值,这就是为什么只有自定义异常类型包括整数字段的原因。尽管如此,这似乎是一个奇怪且稍微不一致的选择! - Dan Puzey

1

HTTP状态码不一定要来自固定列表,尽管它们通常是这样的。使用枚举是一种方便的方式。强制使用枚举是错误的。


看一下我对丹答案的评论。HttpWebResponse.StatusCode确实是HttpStatusCode类型。 - Matthijs Wessels
...这很奇怪。在反编译器中查看,似乎基础整数仅被强制转换为 HttpStatusCode,这意味着它可能具有枚举中未定义的值。 - Roger Lipscombe

0

响应包含一个整数值,表示错误代码。该整数是实际的错误代码。枚举允许以“友好”的方式表示错误代码。


0
我是一个专业翻译引擎,请将以下英文内容翻译为中文:
“Should I just stop complaining and typecast?”
“是的。或者使用相应的整数值进行操作。”

0

是的,你应该这样做。最重要的是,由于你自己提供的代码使你不必与任何整数值或状态数字一起工作。因此从技术上讲,枚举值是否对应状态数字并不重要。


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