如何在C#中有效地检查来自URL的401响应?

时间:2011-07-14 14:50:59

标签: c# httpwebrequest

我想创建一个方法来确定某个特定的URL是否可以匿名访问。我这样做是为了从自定义搜索页面中删除无法访问的结果。我能想到的最好的是

    public bool IsWebAddressAccessible(string Url)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
        try
        {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        }
        catch (System.Net.WebException)
        {
            return false;
        }
        return true;
    }

然而,由于两个原因,这不太理想。首先,据我所知,以这种方式依赖逻辑异常并不高效。其次,在页面可访问的情况下,它似乎检索整个页面,这是耗时的。所以问题是:

  1. 有没有办法在不依赖异常的情况下做到这一点?
  2. 有没有办法加快速度,所以我可以看到响应是否以401回归而不等待检索整个页面?

2 个答案:

答案 0 :(得分:2)

有关问题2的帮助,您只能执行HEAD请求。在尝试之前插入此内容

request.Method = "HEAD";

编辑:实际上请看这篇文章进行全面讨论: WebRequest "HEAD" light weight alternative

答案 1 :(得分:1)

  1. 这是HttpWebRequest设计中的vexing exception。我实际上在我的一个项目中有一些扩展方法(一个使得许多请求返回304未被修改):

    [DebuggerNonUserCode]
    public static HttpWebResponse GetHttpResponse(this HttpWebRequest request) {
        // We know the response will be a HttpWebResponse because the request is a HttpWebRequest
        return (HttpWebResponse)request.GetResponse();
    }
    
    [DebuggerNonUserCode]
    public static HttpWebResponse GetHttpResponseAvoidVexingExceptions(this HttpWebRequest request) {
        try {
            return GetHttpResponse(request);
        } catch (WebException ex) {
            HttpWebResponse response = (HttpWebResponse)ex.Response;
            switch (response.StatusCode) {
                case HttpStatusCode.NotModified:
                    return response;
    
                default:
                    // We don't catch other exceptions
                    throw;
            }
        }
    }
    

    我无法避免这种例外。

  2. 像Mark所说,使用HEAD方法只返回响应标头。