检查MOSS资源是否存在,产生意外的401

时间:2010-01-05 11:13:56

标签: sharepoint

我有一个webdav功能,如下所示:

这种行为完全出乎意料......

当我第一次运行该函数并将URL传递给不存在的资源(sharepoint中的文件夹)时,我得到了一个预期的404。然后,我使用另一个函数来使用此方法中的THE SAME凭据创建资源。没有问题......

然而,在第二次运行时,在创建资源之后 - 当我检查资源是否存在时,现在我得到一个401.

这里需要注意的是,相同的凭据用于检查401和创建文件夹,所以凭证很清楚...

所以它必须是别的......我想要做的就是检查SharePoint中是否存在资源......任何想法如何改进这个功能?或任何理论为什么它给这个401 ......

 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;
        }

我唯一的线索是,当使用http://mysite.com/mydoclib/mytoplevelfolder时,它可以工作....任何子文件夹自动给出401 ...

1 个答案:

答案 0 :(得分:1)

问题是您无法将包含文件夹的整个URL传递给CredentialCache.Add()方法。

例如:
http://MyHost/DocumentLibrary/folder1/folder2不能用作Add()方法的Uri,但是 http://MyHost/DocumentLibrary/将有效。

我猜想SharePoint中文件夹级别缺少权限功能就是这个原因。或者SharePoint处理文件夹的方式。

您可以做的是将方法中的参数分开以接受基本URL(包括文档库/列表)和文件夹名称参数。 CredentialCache获取基本URL,请求对象获取完整URL。

另一种方法是使用

request.Credentials = System.Net.CredentialCache.DefaultCredentials;
而是凭证。如果您想使用其他帐户而不是执行帐户,请在必要时进行模拟。

第三种变体是尝试将身份验证类型设置为 Kerberos 而不是NTLM。

这是我的测试代码。如果我用你的代码替换问题,我能够重现这个问题,这个代码对我有用。

static void Main(string[] args)
{
  bool result = MossResourceExists("http://intranet/subtest/content_documents/", "testfolder/testfolder2");
}

private static bool MossResourceExists(string baseUrl, string folder)
{
  string completeUrl = baseUrl + folder;

  var request = (HttpWebRequest)WebRequest.Create(completeUrl);
  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(Domain))
  {
    myCredentialCache.Add(new Uri(baseUrl),
   "NTLM",
   new NetworkCredential(Username, Password, Domain)
   );
  }
  else
  {
    myCredentialCache.Add(new Uri(baseUrl),
   "NTLM",
   new NetworkCredential(Username, Password)
   );
  }

  request.Credentials = myCredentialCache;
  //request.Credentials = System.Net.CredentialCache.DefaultCredentials;

  try
  {
    WebResponse response = 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:" + completeUrl + ";Status Code:" + errorResponse.StatusCode + ";Error Message:" + ex.Message);
      }
  }
  return true;
}

希望这有帮助。