我尝试打开SPFolder时遇到“拒绝访问”错误,尽管我在SPSecurity.RunWithElevatedPrivileges
中运行了代码。我找到了几个关于这个主题的帖子,我发现的解决方案是:
SPContext.Current
RunWithElevatedPrivileges
SPSecurity.CatchAccessDeniedException
对我来说没有任何作用。按照我的代码,错误发生在:
SPFolder DocumentLibrary = web.Folders[Library];
我的代码:
bool originalCatchValue = SPSecurity.CatchAccessDeniedException;
SPSecurity.CatchAccessDeniedException = false;
try
{
string[] ArrayId = Request["arrayId"].ToString().Split('|');
string company = Request["company"].ToString();
string NewSPContext = company == "XXX" ? siteCollectionUrl.Replace("XXX", "") : siteCollectionUrl + "XXX";
SPUserToken userToken = SPContext.Current.Web.CurrentUser.UserToken;
foreach (string id in ArrayId)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPSite oSite = new SPSite(siteCollectionUrl, userToken);
SPWeb oWeb = oSite.OpenWeb();
SPFile itemFile = FindListByName(oWeb, Library).GetItemById(int.Parse(id)).File;
using (SPSite site = new SPSite(NewSPContext, userToken))
using (SPWeb web = site.OpenWeb())
{
var test = web.CurrentUser;
web.AllowUnsafeUpdates = true;
SPFolder DocumentLibrary = web.Folders[Library];
DocumentLibrary.Files.Add(itemFile.Item.Name, itemFile.OpenBinary(), itemFile.Properties, true);
DocumentLibrary.Update();
}
});
}
Response.Write("OK");
}
finally
{
SPSecurity.CatchAccessDeniedException = originalCatchValue;
}
答案 0 :(得分:0)
当您向SPSite类的构造函数提供用户标记时,创建的实例将在指定用户的上下文中运行。意思是,在您的情况下,您在oSite对象上执行的每个操作都将被执行,就像它被CurrentUser调用一样。
只需从实例化SPSite对象的行中删除用户令牌参数,您就可以开始使用,因为您的代码会提升权限。
话虽如此,您的代码存在多个问题。至少可以说,这是非常低效的,它不会通过代码审查。以下是一些提示:
避免对RunWithElevatedPrivileges函数进行递归调用,这是一个非常昂贵的函数。
尝试重新实例化SPSite和SPWeb对象,而不是在循环中递归地重新创建它们。它们构建起来非常昂贵。
您必须处理SPSite和SPWeb对象的所有实例,否则最终会出现内存泄漏,这会导致应用程序性能随着时间的推移而恶化,最有可能导致最终崩溃。
< / LI>