SharePoint イベント レシーバーを使用した Web.config の書き換え時の注意点


こんにちは。

SharePoint では、SharePoint Server 2007 の頃より、フィーチャー (feature) やパッケージ (wsp) の配置 (インストール) やアクティベートの際に、イベント レシーバー (Event Receiver) を使用してさまざまなカスタムな処理が作成可能でした。この中で、よく利用されるのが、web.config の書き換えです。
Visual Studio 2010 (SharePoint Server 2010) では、ご存知の通り、こうしたイベントレシーバーの開発も非常に容易に組み込むことが可能になり (下図は、フィーチャーのレシーバーを実装するためのメニューです)、今後こうした web.config の書き換え処理は、より頻繁におこなわれることになるでしょう。

そこで、今回は、この SharePoint の Web.confiig の書き換え時の注意点を記載します。

まず、SharePoint の web.config の書き換えをおこなう場合、起動中の SharePoint Server がどの web.config を使っているのか知る必要があります。通常は、%systemdrive%\inetpub\wwwroot\wss\<ポート番号> ですが、このディレクトリは変更することができるため、常にここに入っているとは限りません。

まず、SharePoint では、こうした web.config の操作のために、専用のクラスが提供されていますので、これを使用して書き換えをおこないましょう。
SPWebConfigModification オブジェクトを作成して作成 / 変更 / 削除するタグの情報を設定し、SPWebService.WebConfigModifications の Add メソッド、Remove メソッドなどを使用して書き換えをおこないます (引数に、SPWebConfigModification オブジェクトを設定します)。

以下は、フィーチャーのインストール時に、web.config の <configuration><SharePoint><WorkflowServices> の中に <WorkflowService Assembly=. . . Class=. . . /> を登録するサンプルです。(SPWebService でなく、SPWebApplication を取得しても同様の処理が記述できます。)

public override void FeatureInstalled(SPFeatureReceiverProperties properties)
{
    // 現在使用中の SPWebService を取得 (SPWebApplication でも良い)
    SPWebService srv = SPWebService.ContentService;

    // SPWebConfigModification オブジェクトの設定
    SPWebConfigModification confMod = new SPWebConfigModification();
    confMod.Name = @"WorkflowService[@Assembly=""LocalServicesSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0556781a53cda1fa""][@Class=""LocalServicesSample.CustomExternalClass""]";
    confMod.Path = @"configuration/SharePoint/WorkflowServices";
    confMod.Owner = "MyTestApp";
    confMod.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
    confMod.Value = @"<WorkflowService Assembly=""LocalServicesSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0556781a53cda1fa"" Class=""LocalServicesSample.CustomExternalClass""/>";

    // 追加実行
    srv.WebConfigModifications.Add(confMod);
    srv.ApplyWebConfigModifications();
}

つぎの注意点として、Add されたあとで、Remove など更新処理をおこなう際には、いったん iisreset などをおこなってから実施する必要があるという点です。
イベントレシーバーとして挿入する位置を間違えたり、事前にコンソールアプリケーションなどで実験をしている場合などでは、Add 後に iisreset やアプリケーションプールのリサイクルがおこなわれず、Remove などをおこなっても削除されないので注意してください。

 

Comments (0)

Skip to main content