SharePoint spweb.properties.update()でのスレッドは問題を中止します
-
16-10-2019 - |
質問
SharePoint 2007とSharePoint 2010で実行されるカスタムWebサービスがあります。現在、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)は、サイト所有者のユーザートークンを決定し、ユーザートークンを提供してSPSITEオブジェクトをインスタンス化することにより、サイト所有者になりすましてSPSITEオブジェクトをインスタンス化することにより、サイト所有者になりすましてSPSITEオブジェクトをインスタンス化するための手法を使用して開かれました。したがって、SharePoint API呼び出しはすでにかなり高い特権を持っています。
私が見つけたのは、サイト所有者を使用してWebサービスに認証する場合、私の最初のweb.properties.update()が正常に動作するように見えることです。ただし、Webへのアクセスを読み取るユーザーを使用してWebサービスに認証すると、web.properties.update()呼び出しが失敗します。それほど悪くはない、と私は期待していた。そのコードは適切に機能しますが、コードが実行される直後に、スレッドは他の手順を処理しながら中止します(他のコードで別の試行ブロックの後の「{」など。
良いニュースは、私がいつでも燃え上がっているだけなら、私は大丈夫だと思われるということです。基本的に元の試みをキャッチすると、私は何も泡立ちませんが、長引く問題が発生します。
ここで何が起こっているのか考えてみませんか? spweb.propertiesを保存するだけでなく、これに出くわすことができる他の場所があることを心配しています。
解決
デフォルトでは現在の要求をキャンセルし、多くの場合threadabortexceptionsを引き起こすように見えるアクセス可能な例外を組み込んだSharePointの組み込みの処理をオフにしてみてください。
spsecurity.catchaccessdeniedexception
このプロパティをfalseに設定すると、アクセス可能な例外を自分で処理できるようになります。完了したら、その価値を復元することを忘れないでください。
他のヒント
私は同様の状況に遭遇しました - 少なくともこれはそうかもしれないと思います。それを解決する方法は、たとえば電話をかけるときに私が本当にしていることを理解することでしたusing (SPSite elevatedSite = new SPSite(web.Site.ID))
runwithelevatedprivilegesの代表者から。
問題は、代表者が別のスレッドで実行されているようです。したがって、web.site.id(別のスレッドにある)を使用する代わりに、デリゲートを入力する前に、必要なすべてのデータ(すべてのIDなど)を簡単な変数に保存する必要があります。それはスレッド中断の世話をするはずです。