【发布时间】:2013-10-02 08:18:51
【问题描述】:
当我们重定向到另一个页面(例如到另一个网站的页面)时,服务器响应带有 http 状态码。如果一切正常,返回 200。
当我调用Response.Redirect 时,如何检测从远程服务器返回的 http 状态码?
我想登录数据库重定向是否正确执行。
【问题讨论】:
标签: c# asp.net redirect response.redirect
当我们重定向到另一个页面(例如到另一个网站的页面)时,服务器响应带有 http 状态码。如果一切正常,返回 200。
当我调用Response.Redirect 时,如何检测从远程服务器返回的 http 状态码?
我想登录数据库重定向是否正确执行。
【问题讨论】:
标签: c# asp.net redirect response.redirect
你不能。您将访问者的浏览器重定向到不同的 URL。如果该 URL 未指向您控制的服务器,则您无法看到该请求是如何进行的。
【讨论】:
当您编写Response.Redirect(...) 时,这会导致您的站点将 HTTP 302(已移动)发送回客户端浏览器...就您的服务器而言,这就是故事的结尾 - 与客户端的连接已关闭,您不再与他们互动。
您根本无法检测到 客户端浏览器 然后加载了您的 302 指示的资源,除非该资源恰好位于您自己的服务器上 - 在您的情况下,它不是。
我能看到您以任何半有意义的方式检查这一点的唯一方法是,如果您首先代表客户端进行检查,在您自己的代码中发出您自己的 HTTP GET对于重定向位置...但这仍然只告诉您在您检查时远程资源对您可用。
但是您仍然不可能说基于您获得 HTTP 200 客户端也能够访问它(防火墙、连接不良、列入黑名单,撇开现在您将请求负载加倍的问题放在一边在那个远程资源上..),老实说,我什至不建议这样做,因为它不是 100% 可靠的方法。
【讨论】:
好吧,这可能不是完美的解决方案,但在我的书中它肯定是一个可以接受的解决方法。这里的想法是,您可以确定给定 URL 的预期 HttpStatusCode 应该是什么。
public HttpStatusCode GetRedirectStatusCode(string destinationUrl)
{
var request = (HttpWebRequest)WebRequest.Create(destinationUrl);
request.Method = "HEAD";
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Timeout = 180000;
using(var response = (HttpWebResponse)request.GetResponse())
{
return response.StatusCode;
}
}
【讨论】: