一部の環境で SharePoint WebDeleting イベント レシーバーの登録中にエラーが発生しました

StackOverflow https://stackoverflow.com/questions/2429159

  •  19-09-2019
  •  | 
  •  

質問

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を再起動しました(これはイベントハンドラーを実行していると思いますが、おそらくエラーが発生しているイベント登録には関与していません)。アセンブリのキャッシュが行われていないことを確認するために再起動しても、以前は役に立ちませんでした。

私が進めなければならない唯一のことは、おそらく次のような手順に従うことです。

  1. 登録コードとイベント ハンドラー クラスを含むアセンブリの GAC をクリアします。
  2. IISRESETを実行します。
  3. WSPをアンインストールします。
  4. IISRESETを実行します。
  5. WSPをインストールします。
  6. IISRESETを実行します。

動作させるために再起動や SharePoint サービスの再起動を行ったことはありませんが、動作させる前に (コードを変更する前に) これらの操作を行っていました。

Reflector を使用してさらに掘り下げて何が見つかるかを確認することもできると思いますが、すぐに行き止まり (アンマネージ コード) に到達すると思います。何が古い DLL を保持しているのだろうか?SQL Server が何らかの形でそうなるとは想像できません。それでも、再起動すれば問題は解決します (この環境では、SQL Server を含むファーム全体が同じマシン上にあります)。

役に立ちましたか?

解決

だから、全体の問題は、GUIDを提供することで、イベントレシーバを作成していたことが表示されます。

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add(new Guid(MyEventReciverId));

今、私がやってます:

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add();

残念ながら、これは私はイベントがすでに登録されているかどうかを確認したいときに、私は以下のコードの代わりに、単一のものライナーのような何かをしなければならないことを意味します。

// Had to use the below instead of: web.EventReceivers[new Guid(MyEventReceiverId)]
private SPEventReceiverDefinition GetWebDeletingEventReceiver(SPWeb web)
{
    Type eventReceiverType = typeof(MyEventHandler);
    string eventReceiverAssembly = eventReceiverType.Assembly.FullName;
    string eventReceiverClass = eventReceiverType.FullName;

    SPEventReceiverDefinition eventReceiver = null;

    foreach (SPEventReceiverDefinition eventReceiverIter in web.EventReceivers)
    {
        if (eventReceiverIter.Type == SPEventReceiverType.WebDeleting)
        {
            if (eventReceiverIter.Assembly == eventReceiverAssembly && eventReceiverIter.Class == eventReceiverClass)
            {
                eventReceiver = eventReceiverIter;
                break;
            }
        }
    }

    return eventReceiver;
}

物事が(などiisresetと、再起動後、)いくつかのクリーンアップをぐずぐずして要求するように見えた理由はまだ明らかではありませんので、他の誰がこの問題を持っている場合は念頭に置いていることを維持します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top