SharePoint spweb.properties.update()的线程中止问题
-
16-10-2019 - |
题
我有一个自定义的Web服务,该服务在SharePoint 2007以及SharePoint 2010中运行。我目前仅在DEV环境中在SharePoint 2010中进行测试。我有一些执行以下操作的代码:
bool allowUnsafeUpdates = web.AllowUnsafeUpdates;
try
{
web.Properties[webPropertyBagKey] = value;
web.AllowUnsafeUpdates = true;
try
{
web.Properties.Update();
}
catch (Exception ex)
{
// Update failed likely due to security reasons, try with elevated privileges
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(web.Site.ID))
{
using (SPWeb elevatedWeb = elevatedSite.OpenWeb(web.ID))
{
bool elevatedAllowUnsafeUpdates = elevatedWeb.AllowUnsafeUpdates;
try
{
elevatedWeb.Properties[webPropertyBagKey] = value;
elevatedWeb.AllowUnsafeUpdates = true;
elevatedWeb.Properties.Update();
}
finally
{
elevatedWeb.AllowUnsafeUpdates = elevatedAllowUnsafeUpdates;
}
}
}
});
}
}
catch (Exception ex)
{
// log exception, but don't bubble it up...
}
finally
{
web.AllowUnsafeUpdates = allowUnsafeUpdates;
}
在获得上面的代码之前,SPWEB对象(Web)是使用一种技术来打开网站所有者,通过确定站点所有者的用户令牌并通过提供用户令牌并从那里获取SPWEB来模仿站点所有者。因此,SharePoint API电话已经具有相当高的特权。
我发现,如果我使用网站所有者对Web服务进行身份验证,我的第一个Web.properties.update()似乎可以正常工作。但是,如果我使用仅读取对Web访问的用户对Web服务进行身份验证,则我的Web.properties.update()调用失败。我曾希望,还不错,因为我只能以提高特权运行(它可以重新换取并作为应用程序池所有者运行)。该代码在代码执行后不久才能正常工作,该线程在处理其他一些说明时中断(例如,在其他代码中的另一个尝试块之后的“ {”之后。
好消息是,如果我始终始终跑步,那么我似乎还可以。基本上捕捉原始尝试仍然存在挥之不去的问题,即使我没有冒出任何东西。
知道这里发生了什么吗?我担心除了保存spweb.properties外,还有其他地方可以遇到这个地方。
解决方案
您可能需要尝试关闭SharePoint的内置处理访问的异常,默认情况下似乎取消了当前请求,并且通常会导致ThreadAbortExceptions。
spsecurity.catchaccessdeniedexception
将此属性设置为false,应允许您自己处理访问的例外。请记住,完成后要恢复其价值。
其他提示
我遇到了类似的情况 - 至少我认为可能是这样。解决的方法是了解我在打电话时真正在做什么using (SPSite elevatedSite = new SPSite(web.Site.ID))
从runwitheleveedprivileges的代表内部。
问题是,似乎代表在另一个线程上运行。因此,您需要在输入委托之前将所有所需的数据(所有ID等)存储在简单的变量中。那应该照顾螺纹中断。