SharePoint内にWebDeletingイベントレシーバーを登録しようとしています。これは私の開発環境では正常に機能しますが、いくつかのステージング環境では機能しません。返されるエラーは、「値が期待される範囲内にない」です。私が使用するコードは次のとおりです。
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(web.Site.ID))
{
using (SPWeb elevatedWeb = elevatedSite.OpenWeb(web.ID))
{
try
{
elevatedWeb.AllowUnsafeUpdates = true;
SPEventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add(new Guid(MyEventReciverId));
eventReceiver.Type = SPEventReceiverType.WebDeleting;
Type eventReceiverType = typeof(MyEventHandler);
eventReceiver.Assembly = eventReceiverType.Assembly.FullName;
eventReceiver.Class = eventReceiverType.FullName;
eventReceiver.Update();
elevatedWeb.AllowUnsafeUpdates = false;
}
catch (Exception ex)
{
// Do stuff...
}
}
}
});
これは機能要素ファイルを介して実行できることを認識しています(現在、そのアプローチを試しています)が、上記のアプローチを使用することをお勧めします。
ULSログで一貫して取得するエラーは次のとおりです。
03/11/2010 17:16:57.34 w3wp.exe (0x09FC) 0x0A88 Windows SharePoint Services Database 6f8g Unexpected Unexpected query execution failure, error code 3621. Additional error information from SQL Server is included below. "The statement has been terminated." Query text (if available): "{?=call proc_InsertEventReceiver(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"
03/11/2010 17:16:57.34 w3wp.exe (0x09FC) 0x0A88 Windows SharePoint Services General 8e2s Medium Unknown SPRequest error occurred. More information: 0x80070057
何か案は?
更新-私が学んだいくつかの興味深いこと...
次のようにコードを変更しました。
- 私が見るほとんどの例はそれを行わないので、私はGUIDなしでEventReceivers.Add()を呼び出します
- 私が見るほとんどの例はそれをしているので、イベントレシーバーに名前とシーケンス番号を与えました
この変更をULSログに移動するいくつかの追加のトレースステートメントとともに展開し、十分なiisresetsを実行してアセンブリのGACをクリアした後、ULSログに新しいトレースステートメントが表示されるようになり、エラーが発生しなくなりました。
そこで、元のコードに戻って、どのような変更が正確に役立ったかを確認し始めました。私は最終的にソース管理の元のバージョンになりましたが、それでも機能しました:-S。
したがって、答えは明らかに、それがキャッシュの問題であるということです。ただし、最初にそれを機能させようとしていたとき、IISRESETを試し、いくつかのSharePointサービスOWSTimerを再起動しました(これは、イベントハンドラーを実行すると思いますが、エラーが発生するイベント登録には関与していない可能性があります)。アセンブリのキャッシュが行われていないことを確認するための再起動でさえ、以前は役に立ちませんでした。
私が続けなければならない唯一のことは、おそらく次のような手順に従うことです。
- 登録コードとイベントハンダークラスを含むアセンブリのGACをクリアします。
- IISRESETを実行します。
- WSPをアンインストールします。
- IISRESETを実行します。
- WSPをインストールします。
- IISRESETを実行します。
それを機能させるために、SharePointサービスを再起動したり再起動したりしたことはありませんが、機能させる前に(コードを変更する前に)それらを実行しました。
Reflectorを使ってさらに掘り下げて、何が見つかるかを確認できると思いますが、行き止まり(管理されていないコード)にすぐに到達すると思います。古いDLLを何が保持できるのだろうか?SQLServerが何らかの形で存在することは想像できません。それでも、再起動するとそれが修正されます(SQL Serverを含むファーム全体がこの環境の同じマシン上にあります)。