如何避免 403 禁止响应的 WebException?

Posted

技术标签:

【中文标题】如何避免 403 禁止响应的 WebException?【英文标题】:How to avoid WebException for 403 Forbidden response? 【发布时间】:2010-12-05 04:25:33 【问题描述】:

我有一个应用程序,它有时必须向服务器发出一些请求,以查看这些请求是否被正确阻止。换句话说,预期的服务器回答是 403 Forbidden。

用这样的一段代码:

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(protectedPage);
httpRequest.Method = WebRequestMethods.Http.Head;
WebResponse response = HttpRequest.GetResponse();

WebException 在最后一行抛出。

在分析代码时,try/catch 块中的这个异常会产生我想要避免的性能影响。

有没有办法检查服务器响应,期待 403,而不必捕获异常(但避免直接使用套接字)?

【问题讨论】:

我完全看不出捕获该异常会如何影响性能。我的意思是,与接收网页所需的时间相比,它不需要任何时间。 【参考方案1】:

不幸的是,这是框架中的vexing exception,没有办法避免它(同时仍在使用HttpWebRequest 类)。但是,正如 High 所指出的,这种异常处理将花费纳秒,而 Web 请求本身将花费毫秒(最多),所以不用担心。

WebException 对象有一个包含响应的Response 属性;当您处理异常时,处理该 WebResponse 对象(以避免泄漏连接)很重要。

【讨论】:

@Tergiver,我认为这是一个用例的令人烦恼的异常是另一个用例的外生异常的情况。如果您没有读取文件的权限,File.Open 抛出,HttpWebRequest 在这里做类似的事情。【参考方案2】:

分析中花费时间的可能不是异常捕获部分,而是来自网站的实际响应。

WebException.Status 属性将为您提供 HTTP 响应的状态代码,您可以在此基础上进行进一步处理。

【讨论】:

WebException.Status 只是表示协议错误。它没有给出状态码。 您必须将 exception.Response 转换为 HttpWebResponse 并检查 response.StatusCode 属性。 谢谢,((HttpWebResponse)(we.Response)).StatusCode 给出了你所说的值。

以上是关于如何避免 403 禁止响应的 WebException?的主要内容,如果未能解决你的问题,请参考以下文章

被禁止的页面是不是应该总是以 403 代码响应?

Python请求响应403被禁止

禁止预检 403 响应

403 禁止响应 JSONP 请求

服务器响应状态403(禁止)

列表订阅操作:403 禁止