我正在为SharePoint 2007开发一个解决方案,我正在使用SPSecurity.RunWithElevatedPrivileges,传入SystemAccount的UserToken。
阅读http://hristopavlov.wordpress.com/2009/01/19/understanding-sharepoint-sprequest/后,我终于明白为什么我会得到这些 System.Runtime.InteropServices.COMException(0x80010102):尝试在单线程模式下对多个线程进行调用。 (来自HRESULT的异常:0x80010102(RPC_E_ATTEMPTED_MULTITHREAD))错误,但似乎没有解决方案 - “产品中的已知问题”
这篇文章已经有一年多了。我无法找到更新的和有用的东西,但我希望也许其他人有?
我的代码就像这样
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(web.Site.ID, web.Site.SystemAccount.UserToken))
{
using (SPWeb elevatedWeb = elevatedSite.OpenWeb(web.ID))
{
// some operations on lists and items obtained through elevatedWeb
}
}
}
在使用这种提升代码的地方出现错误,更常见的是当有更多用户使用这些功能时,我猜也许升级后的SPSite会被缓存并重用。
有什么方法可以解决这个问题吗?如果我的理解是正确的,如何让Sharepoint忘记缓存的SPSites,并使用一个新的SPSites?
由于
答案 0 :(得分:4)
在我最终理解了我实际在做什么之后解决了这个问题 - 通过使用例如新的SPSite(web.Site.ID,我实际上正在制作委托,这似乎是在一个新线程,进入web,在原始帖子上
所以答案是:在运行委托之前,已将所需的所有数据(如各种ID,SystemAccount.UserToken等)放入变量中,并且不访问具有关联SPRequest的任何对象(Web,列表) ,代表内部的项目,用户......)。当然,同样适用于委托之外的数据 - 您可以返回Web ID,列表ID和项ID,但最好不要返回SPListItem。