решение для ошибки RPC_E_ATTEMPTED_MULTITHREAD, вызванной SPRequestContext кэширования SPSites? - PullRequest
1 голос
/ 09 июня 2010

Я разрабатываю решение для SharePoint 2007 и много использую SPSecurity.RunWithElevatedPrivileges, передавая UserToken из SystemAccount.

После прочтения 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 забыть о кэшированных SPS-сайтах и ​​использовать вместо этого новый?

Спасибо

1 Ответ

4 голосов
/ 11 июня 2010

Решил это сам, наконец, поняв, что я на самом деле там делаю - используя, например, новый SPSite (web.Site.ID, я фактически заставляю делегата, который, похоже, находится в новом потоке, добраться доweb, который находится в исходном потоке

Итак, ответ таков: вы поместили все необходимые данные (например, различные идентификаторы, SystemAccount.UserToken и т. д.) в переменные перед запуском делегата, и неt доступ к любым объектам со связанным SPRequest (веб-сайтам, спискам, элементам, пользователям ...) внутри делегата, и, конечно, то же самое относится и к данным, выходящим из делегата - вы можете вернуть веб-идентификатор, идентификатор списка иID товара, но лучше не возвращать SPListItem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...