2010-01-05 31 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以查看是否有工资奖金。

这就是为什么你在无权访问的资源和不存在的资源上都得到“访问被拒绝”。

相关问题