2011-07-14 21 views
3

我想創建一個方法來確定一個特定的URL是否可匿名使用。我這樣做是爲了去除自定義搜索頁面中無法訪問的結果。最好的我可以拿出來是如何從C#中的URL有效檢查401響應?

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或不等待檢索整個頁面?
+0

只是爲了確認,你想使用內置的.NET類來處理HTTP,如果可能的話,所以你保留自動使用IE代理設置等?它只是一個普通的請求,沒有cookies,沒有POST數據等? –

+0

這只是使用當前代理設置的基本請求。請求中沒有發送任何特殊內容。我想要做的就是查看響應是否返回401與頁面數據。 – dpsla

回答

2

有關問題2的幫助,您只能執行HEAD請求。在try

request.Method = "HEAD"; 

編輯之前插入此:其實看到這個帖子了充分的討論: WebRequest "HEAD" light weight alternative

+0

任何值得排序的系統管理員都會禁用HEAD請求 –

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. 像馬克說的那樣,使用HEAD方法只返回響應頭。
+0

注意:此處使用'DebuggerNonUserCode',以便在引發異常時,調試器將在有用的地方中斷,即請求正在創建的地方,而不是輔助器方法 – configurator