【问题标题】:How could one efficiently check for a 401 response from a URL in C#? [duplicate]如何在 C# 中有效地检查来自 URL 的 401 响应? [复制]
【发布时间】:2011-10-05 10:19:08
【问题描述】:

我想创建一个方法来确定特定 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?

【问题讨论】:

  • 只是为了确认一下,您想尽可能使用内置的 .NET 类来处理 HTTP,因此您保留自动使用 IE 代理设置等?它只是一个常规请求,没有 cookie,没有 POST 数据等吗?
  • 这只是使用当前代理设置的基本请求。请求中没有发送任何特殊内容。我要做的就是查看响应是否返回 401 与页面数据。

标签: c# httpwebrequest


【解决方案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 方法只取回响应头。

【讨论】:

  • 注意:这里使用DebuggerNonUserCode,这样如果抛出异常,调试器会在有用的地方中断,即发出请求的地方,而不是在辅助方法中
猜你喜欢
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 2016-11-29
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多