2010-01-05 30 views
1

以下是用於檢查SharePoint文檔庫中是否存在文件夾的2個代碼片段。 PROPFIND方法似乎工作,而另一種方法,使用HEAD結果爲401.C#Web Dav,爲什麼頭部請求會生成401?

有人可以告訴我爲什麼嗎?不要被憑據分心,我已經將它設置爲相同的在這兩個例子中,它工作正常....

這裏是工作的代碼:

// Create the web request object 
var oReq = (HttpWebRequest)WebRequest.Create(url); 

// Set the needed properties 
oReq.Method = "PROPFIND"; 
oReq.Credentials = this.wsLists.Credentials; // Use same credentials as wsLists. 
oReq.AllowAutoRedirect = true; 
oReq.UserAgent = "Microsoft-WebDAV-MiniRedir/6.1.7600"; 

// Enumerate through top level only, increasing the depth will find children. 
oReq.Headers["Depth"] = "0"; 
oReq.Headers["translate"] = "f"; 
var oRequest = new StreamWriter(oReq.GetRequestStream()); 
oRequest.WriteLine(); 
oRequest.Close(); 
var oResponse = new StreamReader(oReq.GetResponse().GetResponseStream()); 
string sResponse = oResponse.ReadToEnd(); 
oResponse.Close(); 

,這裏是有問題的代碼:

private bool MossResourceExists(string url) 
{ 
    var request = (HttpWebRequest)WebRequest.Create(url); 
    request.Method = "HEAD"; 

    // Create a new CredentialCache object and fill it with the network 
    // credentials required to access the server. 
    var myCredentialCache = new CredentialCache(); 
    if (!string.IsNullOrEmpty(this.Domain)) 
    { 
     myCredentialCache.Add(new Uri(url), 
     "NTLM", 
     new NetworkCredential(this.Username , this.Password , this.Domain) 
     ); 
    } 
    else 
    { 
     myCredentialCache.Add(new Uri(url), 
     "NTLM", 
     new NetworkCredential(this.Username , this.Password) 
     ); 
    } 

    request.Credentials = myCredentialCache; 

    try 
    { 
     request.GetResponse(); 
     return true; 
    } 
    catch (WebException ex) 
    { 
     var errorResponse = ex.Response as HttpWebResponse; 

     if (errorResponse != null) 
      if (errorResponse.StatusCode == HttpStatusCode.NotFound) 
       return false; 
      else 
       throw new Exception("Error checking if URL exists:" + url + ";Status Code:" + errorResponse.StatusCode + ";Error Message:" + ex.Message) ; 
    } 
    return true; 
} 

回答

1

我的兩分錢:

我認爲這與方式的WebDAV做工作:

  • 第一個請求總是被髮送匿名的,因爲WebDAV是一個「挑戰/響應」協議,沒有auth標頭的第一個請求是必要的;來自WebDAV的響應包含一個隨機數以驗證下一個請求,從而有助於抵禦重放攻擊等攻擊。 (從回答this question,請參閱答案中的鏈接瞭解更多信息)。

  • 您試圖在IE的「本地Intranet」區域訪問的網站是否?爲什麼會發生

    當您使用Internet Explorer 訪問WebDAV站點,互聯網 瀏覽器

理解:如果不是,下面可能會給您的問題一些更多的信息和可能的woraround使用Windows HTTP服務 (WinHTTP)。 WinHTTP僅在 登錄過程中發送用戶 憑據以響應在本地 Intranet站點上發生的 請求。但是,WinHTTP確實 不檢查Internet Explorer中的安全區域設置 以確定 網站是否是本地內部網 網站。相反,WinHTTP取決於 Internet Explorer中的代理設置,以 確定網站是否爲 本地Intranet站點。

如果自動檢測設置 選項未啓用,則將不處理任何 定義的 自動配置腳本。 WinHTTP 不會將WebDAV站點標識爲 本地Intranet站點。因此, WinHTTP將發出請求 沒有用戶憑據,並且您將提示 鍵入用戶憑據。

因此,您可以看到,此問題只有 似乎出現在外部網站上,而 不在Intranet網站上。不幸的是, 我的許多客戶在全國各地都運行地球物理學解決方案 ,代理之間沒有 。 從here

+0

非常好的見解,感謝科林。 – 2010-01-07 11:23:12

0

請求沒有生成401,401來自服務器。您應該查看服務器上的Windows事件日誌,IIS日誌和SharePoint日誌,以瞭解服務器返回401的原因。

+0

你與401的起源是正確的,但服務器在第二個例子中,請求過程中產生的401 ... – 2010-01-05 19:23:55

+0

問題更新,希望它現在更清楚瞭解...... – 2010-01-05 19:25:13

+0

我不在我面前有SharePoint API--它是否說它支持HEAD來處理這個請求? – 2010-01-05 20:00:41

0

我認爲響應實際上是有效的,並且401在此處是確定的。看,401意味着「未經授權」。因此,當您嘗試訪問資源時,SharePoint會首先檢查您的憑據以查看是否允許執行此操作。如果你沒有訪問權限,它將返回401,如果你這樣做,它將返回200多個你所要求的內容。現在

,正是兩者之間的區別:

  • 當你所要求的資源你沒有訪問
  • 當你所要求的資源不存在

SharePoint中的基本原理是 - 如果您無法訪問某個東西,它不會爲您存在,您也不應該知道它是否存在。

如果SharePoint允許您爲您無權訪問的資源提供HEAD,則可以嘗試查找http://sharepointsite/docs/JL_Gets_A_Salary_bonus.doc以查看是否有工資獎金。

這就是爲什麼你在無權訪問的資源和不存在的資源上都得到「訪問被拒絕」。

相關問題