2012年9月28日 (金)

Web.Config ファイル編集 - SPWebConfigMofification クラスの利用

Visual Studio 2010 によるSharePoint Web パーツ開発といったソリューション開発では SharePoint  サイトをホストする IIS サイト内の Web.Config を書き換える必要があります。Web.Config は SPWebCOnfigModification クラスを利用することで、コードから編集できます。通常はフィーチャー レシーバーを用いて、フィーチャーがアクティブ化された際に実行します。

 このオブジェクトはSPWebApplication オブジェクトまたは SPWebService オブジェクトのWebConfigModifications プロパティ経由で取得します。MSDN のサンプルコードを例を下記に転機します。

SPWebService myService = SPWebService.ContentService; SPWebConfigModification myModification = new SPWebConfigModification(); myModification.Path = "configuration/SharePoint/SafeControls"; myModification.Name = "SafeControl[@Assembly='MyCustomAssembly'][@Namespace='MyCustomNamespace'][@TypeName='*'][@Safe='True']"; myModification.Sequence = 0; myModification.Owner = WebConfigModificationFeatureReceiver.OwnerId; myModification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode; myModification.Value = ""; myService.WebConfigModifications.Add(myModification); myService.Update(); myService.ApplyWebConfigModifications();

SPWebConfigModification オブジェクトに指定するプロパティは次の通りです。

  • Path プロパティ … 編集対象となるWeb.Config 内の親ノードを指定します。この例では SafeControlエントリーを追加する親ノードを示しています。
  • Type プロパティ … 追加するのが、子ノードなのか(EnsureChildNode)、属性なのか(EnsureAttribute)、セクションなのか(EnsureSection)を指定します。SafeControlsノードに追加したいのは子ノードなので、この例ではEnsureChildNode を指定しています。
  • Name プロパティ … Type で指定しているのが EnsureChildNode の場合はXPathで指定する必要があります。この例では、"SafeContorl[@Assembly=...." は対象となる子ノードを指定しています。
  • Value プロパティ …  Type で指定しているのが EnsureChildNode の場合は、指定した親ノードに追加する子ノードを表すXML文字列を指定します。TypeがEnsureSection の場合はセクション名を、EnsureAttributeの場合は属性に設定したい値を指定します。
  • Ownerプロパティ … どのコードで追加した変更内容なのかを追跡するための目印として使用します。
  • Sequrence プロパティ…変更内容を示す連番です。0から65536までを指定します。同じノードまたは同じ属性の型を編集する場合にのみ使用します。重複して適用される場合は、低い値の番号のものが先に適用されます。

この内容を最終的にはWebConfigModificationsコレクションオブジェクトに追加し、Update()メソッドとApplyWebConfigModifications()を呼び出して適用します。

なお、NameプロパティやValueプロパティには.NETアセンブリのFullNameと名前空間を指定する必要がありますが、コードから取得する場合は次のように記述することもできます。

... string assemblyValue = typeof(<クラス名>).Assembly.FullName; //アセンブリの完全名 string namespaceValue = typeof(<クラス名>).Namespace; //アセンブリの名前空間名 ...

上記のコードを実際に展開する際にたとえば Pathプロパティを間違ってしまっている場合には次のようなエラーメッセージが表示されます。

  SPWebConfigModificationError

エラーに従ってPathを正しく設定しなおして、再度このソリューションを展開しますが、場合よっては同じエラーが表示され Web.Config が編集されません。

WebConfigModificationsコレクションオブジェクトには、Addメソッドが呼ばれるたびにSPWebConfigModificationオブジェクトが追加されていきます。自動的に削除されることはありません。そのため、不正なPathを記載したままの状態でオブジェクトが追加されてしまっているため、何度ソースコードを修正してもエラーが修正されないということが起こりえます。

そのため、適切なタイミングでオブジェクトを削除するコードを実装しておく必要があります。削除時に活躍するのが Owner プロパティです。特定のコードから追加したエントリーのみを削除するために、Ownerプロパティで判定するとよいです。

... SPWebService contentService = SPWebService.ContentService; List modifications = new List(); foreach (SPWebConfigModification mod in contentService.WebConfigModifications) { if (mod.Owner == owner) { modifications.Add(mod); } } foreach (SPWebConfigModification delmod in modifications) { contentService.WebConfigModifications.Remove(delmod); } contentService.Update(); ...

SPWebConfigModification の利用については次のブログ記事が参考になりますので、一度目を通しておくと良いですよ。

http://didierdanse.net/blogs/dev_en/archive/2009/09/11/sharepoint-how-to-use-spwebconfigmodification-class.aspx

トラックバック

このページのトラックバックURL: http://bb.lekumo.jp/t/trackback/718613/34255594

Web.Config ファイル編集 - SPWebConfigMofification クラスの利用を参照しているブログ:

コメント