SPRequestContext缓存SPSites导致的RPC_E_ATTEMPTED_MULTITHREAD错误的解决方案?

2023-12-02

我正在为 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))错误,但似乎没有解决方案 - “产品中的已知问题”

这篇文章已有一年多了。我找不到任何更新的内容and有帮助,但我希望也许其他人有?

我的代码是这样的

  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?

Thanks


在最终了解我实际上在那里做什么之后,我自己解决了这个问题 - 通过使用例如 new SPSite(web.Site.ID,我实际上是在使委托(似乎在一个新线程上)进入网络,这在原始线程上

所以答案是:在运行委托之前,您已将需要的所有数据(例如各种 ID、SystemAccount.UserToken 等)放入变量中,并且不要访问具有关联 SPRequest 的任何对象(网页、列表、项目、用户...)来自委托内部。当然,这同样适用于从委托中发出的数据 - 您可以返回 Web ID、列表 ID 和项目 ID,但最好不要返回 SPListItem。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SPRequestContext缓存SPSites导致的RPC_E_ATTEMPTED_MULTITHREAD错误的解决方案? 的相关文章

随机推荐