我有一个自定义的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等)存储在简单的变量中。那应该照顾螺纹中断。

许可以下: CC-BY-SA归因
scroll top