public ValidateResult Validate( bool useHeadMethod = true, bool enableKeepAlive = false, int timeoutSeconds = 30 ){ ValidateResult result = new ValidateResult(); HttpWebRequest request = WebRequest.Create(Uri) as HttpWebRequest; if (useHeadMethod) { request.Method = "HEAD"; } else { request.Method = "GET"; } // always compress, if you get back a 404 from a HEAD // it can be quite big. request.AutomaticDecompression = DecompressionMethods.GZip; request.AllowAutoRedirect = false; request.UserAgent = UserAgentString; request.Timeout = timeoutSeconds * 1000; request.KeepAlive = enableKeepAlive; HttpWebResponse response = null; try { response = request.GetResponse() as HttpWebResponse; result.StatusCode = response.StatusCode; if (response.StatusCode == HttpStatusCode.Redirect || response.StatusCode == HttpStatusCode.MovedPermanently || response.StatusCode == HttpStatusCode.SeeOther || response.StatusCode == HttpStatusCode.TemporaryRedirect) { try { Uri targetUri = new Uri(Uri, response.Headers["Location"]); var scheme = targetUri.Scheme.ToLower(); if (scheme == "http" || scheme == "https") { result.RedirectResult = new ExternalUrl(targetUri); } else { // this little gem was born out of // http://tinyurl.com/18r // redirecting to about:blank result.StatusCode = HttpStatusCode.SwitchingProtocols; result.WebExceptionStatus = null; } } catch (UriFormatException) { // another gem ... people sometimes redirect to // http://nonsense:port/yay result.StatusCode = HttpStatusCode.SwitchingProtocols; result.WebExceptionStatus = WebExceptionStatus.NameResolutionFailure; } }
参考文章:
http://blog.jobbole.com/22288/
浙公网安备 33010602011771号