こんにちは。
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 などをおこなっても削除されないので注意してください。
Categories: Uncategorized