C# HttpWebRequest.GetResponse - 如何处理非异常与 webexception 响应的 StatusCode 使用情况?

Posted

技术标签:

【中文标题】C# HttpWebRequest.GetResponse - 如何处理非异常与 webexception 响应的 StatusCode 使用情况?【英文标题】:C# HttpWebRequest.GetResponse - how is StatusCode usage handled for a non-exception vs webexception response? 【发布时间】:2010-02-02 07:51:14 【问题描述】:

有人可以帮助清除 HttpWebResponse 和 WebException 中“StatusCode”属性的用法吗?

例如,如果:

a) 没有例外,那么 HttpWebResponse 将有一个 StatusCode 可能有一些值来指示两者: - 成功(例如 OK、Accepted 等) - 失败(例如 UseProxy、RequestTimeout 等)

b) 有一个 WebExeption 抛出,它本身有一个响应对象,该对象又具有一个 StatusCode(我假设它基于相同的 HttpStatusCode 枚举。

问题 1 - 关于什么 StatusCode 将触发 WebException(并且您会在异常中获取详细信息)是否有任何一致性,而哪个会毫无例外地返回,但您会在响应的 StatusCode 中找到结果对象?

问题 2 - 或者更具体地说,尝试处理 httpWebRequest.GetResponse 调用的伪代码(或 C# 代码本身)是什么,以便您区分用户的响应类别:

代理设置/代理问题 => 所以可以告诉用户修复代理设置

连接问题/网络服务器停机 => 所以用户知道这一点

服务器端错误(例如,服务器存在,但处理请求时出现问题 - 例如内容不存在) => 所以用户可以向网站管理员提出建议

成功案例(我认为这不仅仅是 OK) => na(成功案例)

谢谢

【问题讨论】:

【参考方案1】:

根据我的经验,响应状态代码仅返回 200 或 0。其他任何内容都来自 WebException,包括 407 或 417 等代理错误。

【讨论】:

【参考方案2】:

Web 请求无法成功执行时抛出 WebException。例如 400 和 500 系列的响应。

WebExcpetion 有一个名为 Status 的属性,它将返回响应的实际状态,即 500(内部服务器错误)。

这里是所有响应代码的列表:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

================================================ =================================

一般:

1xx 系列代码 = 临时响应。这些不是错误代码。例如,100 Continue 响应告诉客户端应该继续其请求。通常 WebRequest 不会返回这样的响应,并通过发送请求的其余部分自行处理。

2xx 系列代码 = 请求已成功接收、理解并接受。这些不是错误代码。例如 200 OK

3xx 系列代码 = 需要采取进一步行动。通常这不是错误代码(通常是重定向),例如“301 Moved Permanently”,这意味着正在请求的资源被移动到新位置,因此客户端的任何进一步请求都应该在提供的新 URL 上在响应中。

或“305 使用代理”,根据您的说法,这会导致异常。

4xx 系列代码 = 客户端错误。这些可能导致异常。例如“400 Bad Request”或“401 Unauthorized”

5xx 系列代码 = 服务器错误。这些可能导致异常。例如“500 内部服务器错误”或“504 网关超时”

【讨论】:

但是当你直接得到响应时,非异常情况可能有多少个可能的返回码?例如,在 200 范围内有许多不同的响应代码。或者这里的第一个响应是否正确,因为对于非异常情况,只有 200 或 0 是可能的? 谢谢 - 所以这意味着我假设你可能会喜欢例如:成功响应(即没有例外)但状态代码为 300,总体而言它仍然是用户的问题吗?那就是要检查真正的成功,您需要检查 WebException + 检查 200 范围内的状态代码吗? 是的,您可能需要检查异常和状态码,看看您是否可以纠正问题(用于重定向)

以上是关于C# HttpWebRequest.GetResponse - 如何处理非异常与 webexception 响应的 StatusCode 使用情况?的主要内容,如果未能解决你的问题,请参考以下文章

C#进阶C# 泛型

C#进阶C# 匿名方法

C#进阶C# 多线程

C# 教程

[C#教程01]C# 简介

用 C# 编写 C# 编译器,先有鸡还是先有蛋?