我有一个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 ...
答案 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;
}
希望这有帮助。