はじめに

C#でWindows Communication Foundation (WCF)を使用する際、開発者はアプリケーションのApp.configファイルに定義された特定の構成設定にアクセスする必要があります。一般的な要件の一つは、system.serviceModelの構成にアクセスすることです。しかし、多くの人がConfigurationManagerを介してアクセスすると期待通りにセクションがnullになるという問題に直面します。このブログではこの問題を取り上げ、詳細な解決策を提供します。

問題

この課題は、WCFサービスモデルの構成の構造に起因しています。開発者は次のコードを使用してsystem.serviceModelセクションを取得しようとする際、

var serviceModelSection = ConfigurationManager.GetSection("system.serviceModel");

nullを受け取ることになります。しかし、appSettingsのような別のセクションをクエリすると、問題なく動作します:

var appSettingsSection = ConfigurationManager.GetSection("appSettings");

この問題は、WCFアプリケーションにおける構成セクションの読み込み方に関する根本的な誤解があることを示しています。

解決策

system.serviceModel構成セクションを正しく読み込むには、別のアプローチを利用する必要があります。以下のように実施できます:

構成グループの理解

構成ファイル内のsystem.serviceModel要素は、単なるセクションではなく、構成セクショングループを表しています。この区別は非常に重要で、ConfigurationManager.GetSectionを使用してアクセスしようとすると期待される結果が得られません。

正しいメソッドの使用

セクションを直接取得する代わりに、ServiceModelSectionGroupクラスを使用して全体のセクショングループを取得する必要があります:

var serviceModelGroup = System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None));
  • ステップ 1ServiceModelSectionGroupGetSectionGroup()を呼び出し、アプリケーションの現在の構成を渡します。
  • ステップ 2:返されたserviceModelGroupから特定の設定にアクセスします。

例: サービスエンドポイントへのアクセス

以下は、構成からサービスエンドポイントアドレスを抽出する方法の例です:

var serviceModelGroup = System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None));

if (serviceModelGroup != null)
{
    var endpointAddress = serviceModelGroup.Client.Endpoints[0].Address.ToString();
    Console.WriteLine($"サービスエンドポイントアドレス: {endpointAddress}");
}
else
{
    Console.WriteLine("ServiceModelSectionGroupはnullです。");
}

重要なポイント

  • system.serviceModelは単なるセクションではなく、セクショングループであることを常に意識してください。
  • WCF構成を取得するには、ServiceModelSectionGroup.GetSectionGroup()を使用してください。
  • このアプローチは、手動での構成ファイル読み込みやXPathを用いたハックを防ぎます。

結論

C# .NETアプリケーションにおけるsystem.serviceModel構成へのアクセスは、構成セクションとグループの構造を理解し、ServiceModelSectionGroupを活用すればシンプルになります。これにより、null参照に遭遇することなく、必要なWCF設定を手軽に取得できるようになります。この方法は、アプリケーション内でのWCF構成を扱うためのクリーンで堅牢なソリューションを提供します。

詳細については、公式ドキュメントを参照してください:Microsoft Docs

コーディングを楽しんでください!