Проблема с прерванием потока с SharePoint spweb.properties.update ()
-
16-10-2019 - |
Вопрос
У меня есть пользовательский веб -сервис, который работает в SharePoint 2007, а также SharePoint 2010. В настоящее время я тестирую только в SharePoint 2010 в своей среде Dev. У меня есть код, который делает следующее:
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) был открыт с использованием техники, чтобы выдать себя за владельца сайта путем определения токена пользователя владельца сайта и создания осмысления объекта SPSITE путем предоставления токена пользователя и получения SPWEB оттуда. Таким образом, вызовы SharePoint API уже имеют достаточно повышенные привилегии.
Я обнаружил, что мой первый web.properties.update (), кажется, работает нормально, если я аутентифицирую веб -службу с помощью владельца сайта. Однако, если я аутентифицирую в веб -службу, используя пользователя, который просто имеет доступ к Интернету, мой Web.properties.update () вызов вызов. Я надеялся, что не так уж плохо, потому что я могу просто бежать с повышенными привилегиями (которые выполняют ревертозель и бегают в качестве владельца пула приложений). Этот код работает должным образом, но вскоре после выполнения кода поток прерывает при обработке некоторых других инструкций (например, «{» после другого блока попыток в каком -то другом коде.
Хорошая новость заключается в том, что если я просто запускаю withelevatedprivileges, то я, кажется, все в порядке. В основном поймать первоначальную попытку оставляет затяжную проблему, хотя я ничего не пузыри.
Есть идеи, что здесь происходит? Я обеспокоен тем, что есть и другие места, где я мог бы столкнуться с этим, помимо того, что просто спасти Spweb.properties.
Решение
Возможно, вы захотите попытаться отключить встроенное внедрение SharePoint в обработке доступа к исключениям, которые по умолчанию, похоже, отменяют текущий запрос и часто вызывает ThinkAbortExceptions.
Spsecurity.catchaccessdeniedexception
Установка этого свойства в False должно позволить вам самостоятельно обрабатывать на исключение. Не забудьте восстановить его значение, как только вы закончите.
Другие советы
Я столкнулся с подобной ситуацией - по крайней мере, я думаю, что это может быть. Способ решить, чтобы понять, что я на самом деле делаю, например, призываюusing (SPSite elevatedSite = new SPSite(web.Site.ID))
изнутри делегата в RunWitelevatedPrivileges.
Дело в том, что, кажется, делегат работает в другом потоке. Таким образом, вместо использования web.site.id (который находится в другом потоке), вам необходимо хранить все данные, которые вам нужны (все идентификаторы и т. Д.) В простых переменных перед входом в делегат. Это должно позаботиться о теме нити.