我正在尝试确定http://www.accreditedqualifications.org.uk上是否存在资格 形式如下:
http://www.accreditedqualifications.org.uk/qualification/50084811.seo.aspx
50084811是最终用户输入的资格目标。
如果他们输入无效的例如
http://www.accreditedqualifications.org.uk/qualification/50084911.seo.aspx
它们被重定向到错误页面(据我所知,错误的http标题)。有没有办法检测C#中的重定向。我希望能够检测到http标头中的重定向(认为它将发出2)或类似的反对必须下载整个页面。这可能会发生很多,所以我想尽量减少流量。
修改
使用它查看标题看起来像是为无效页面发布了两个:
答案 0 :(得分:13)
最简单的方法可能是使用设置Method
的HttpWebRequest
中的HEAD请求(将AllowAutoRedirect
设置为“HEAD”)来获取内容。我不记得是否会引起异常,但无论哪种方式都应该很容易处理。
答案 1 :(得分:12)
可以返回许多不同的代码。您可以检查各种代码:
response.StatusCode == HttpStatusCode.Redirect
您可以在http://msdn.microsoft.com/en-us/library/system.net.httpstatuscode.aspx
查看所有可能性或者,您可能会发现检查响应中的位置是否不同就足够了。
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "HEAD";
request.AllowAutoRedirect = false;
string location;
using (var response = request.GetResponse() as HttpWebResponse)
{
location = response.GetResponseHeader("Location");
}
return (location != uri.OriginalString);
答案 2 :(得分:0)
您只能使用服务器中的webclient执行此操作。如果您将链接提供给您的客户,那么您之后将不会参与他与认可的qualificationsweb服务器之间的通信,并且在您无法获得链接已被重定向到错误的信息之前。
就我能理解你的项目而言,我会使用Webclient(或其他任何东西)从我的服务器进行一些调用,以确保资格存在,并将结果存储在缓冲时间的数据库中。尽管如此,它仍然不会拨打太多电话并获得可靠的信息。
答案 3 :(得分:0)
尝试一下:
try
{
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(line);
myHttpWebRequest.Timeout = 20000;
myHttpWebRequest.MaximumAutomaticRedirections = 1;
myHttpWebRequest.AllowAutoRedirect = true;
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
if (myHttpWebResponse.ResponseUri.ToString() == "Some website")
{
//your logic
}
myHttpWebResponse.Close();
}
catch (WebException)
{
// record exception
}
它基于httpwebrequest的HEAD请求,并将AllowAutoRedirect设置为false。
答案 4 :(得分:0)
有两种方法可以检测页面重定向:
response.StatusCode == HttpStatusCode.Redirect
request.RequestUri
和response.ResponseUri
请注意 1) 取决于服务器的实现,并非所有服务器都设置此状态代码,因此选项 2) 可能更可靠:
HttpWebRequest request = CreateWebRequest(requestString);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
bool redirected = request.RequestUri.ToString() != response.ResponseUri.ToString();