コード内での WCF サービスの構成

Windows Communication Foundation (WCF) では、開発者が構成ファイルまたはコードを使用してサービスを構成できます。 構成ファイルは、サービスを配置した後に構成する必要がある場合に便利です。 構成ファイルを使用する場合、IT 専門家は構成ファイルを更新するだけで、再コンパイルの必要はありません。 ただし、構成ファイルの管理は複雑で難しくなる場合があります。 構成ファイルのデバッグはサポートされていません。また、構成要素は名前で参照されるため、構成ファイルの作成時にエラーが発生しやすく、構成ファイルの作成が困難になります。 WCF では、コードでサービスを構成することもできます。 WCF の以前のバージョン (4.0 以前) では、自己ホストのシナリオであれば、コードで簡単にサービスを構成できました。また、ServiceHost クラスを使用すると、ServiceHost.Open を呼び出す前にエンドポイントと動作を構成できました。 ただし、Web ホストのシナリオでは、ServiceHost クラスに直接アクセスできません。 Web ホスト サービスを構成するには、System.ServiceModel.ServiceHostFactory を作成して必要な構成を実行する ServiceHostFactory を作成する必要がありました。 .NET Framework 4.5 以降では、WCF を使用すると、自己ホスト サービスと Web ホスト サービスの両方をコードで簡単に構成できます。

Configure メソッド

サービス実装クラスで、次のシグネチャを持つ Configure という名前のパブリックな静的メソッドを定義します。

public static void Configure(ServiceConfiguration config)

Configure メソッドは、開発者がエンドポイントおよび動作を追加できるようにする ServiceConfiguration インスタンスを受け取ります。 このメソッドは、サービス ホストが開かれる前に、WCF によって呼び出されます。 app.config ファイルまたは web.config ファイルで指定されたすべてのサービスの構成設定は、定義されている場合、無視されます。

次のコード スニペットは、Configure メソッドを定義し、サービス エンドポイント、エンドポイントの動作、およびサービスの動作を追加する方法を示しています。

public class Service1 : IService1
    {
        public static void Configure(ServiceConfiguration config)
        {
            ServiceEndpoint se = new ServiceEndpoint(new ContractDescription("IService1"), new BasicHttpBinding(), new EndpointAddress("basic"));
            se.Behaviors.Add(new MyEndpointBehavior());
            config.AddServiceEndpoint(se);

            config.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
            config.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
        }

        public string GetData(int value)
        {
            return $"You entered: {value}";
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }

サービスで https などのプロトコルを有効にするには、プロトコルを使用するエンドポイントを明示的に追加するか、ServiceConfiguration.EnableProtocol(Binding) を呼び出すことによって自動的にエンドポイントを追加します。このメソッドは、プロトコルおよび定義された各サービス コントラクトと互換性がある各ベース アドレスのエンドポイントを追加します。 次のコードは、ServiceConfiguration.EnableProtocol メソッドを使用する方法を示しています。

public class Service1 : IService1
{
    public string GetData(int value);
    public static void Configure(ServiceConfiguration config)
    {
        // Enable "Add Service Reference" support
       config.Description.Behaviors.Add( new ServiceMetadataBehavior { HttpGetEnabled = true });
       // set up support for http, https, net.tcp, net.pipe
       config.EnableProtocol(new BasicHttpBinding());
       config.EnableProtocol(new BasicHttpsBinding());
       config.EnableProtocol(new NetTcpBinding());
       config.EnableProtocol(new NetNamedPipeBinding());
       // add an extra BasicHttpBinding endpoint at http:///basic
       config.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(),"basic");
    }
}

<protocolMappings> セクションの設定は、アプリケーション エンドポイントがプログラムによって ServiceConfiguration に追加されていない場合にのみ使用されます。必要に応じて、LoadFromConfiguration を呼び出して、既定のアプリケーション構成ファイルからサービス構成を読み込み、設定を変更することもできます。 LoadFromConfiguration() クラスを使って、集中化された構成から構成を読み込むこともできます。 これを実装する方法を次のコードに示します。

public class Service1 : IService1
{
    public void DoWork();
    public static void Configure(ServiceConfiguration config)
    {
          config.LoadFromConfiguration(ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = @"c:\sharedConfig\MyConfig.config" }, ConfigurationUserLevel.None));
    }
}

重要

LoadFromConfiguration では、<system.serviceModel> の <service> タグ内の <host> 設定は無視されます。 概念的には、<host> はサービス構成でなくホスト構成に関するものであり、Configure メソッドを実行する前に読み込まれます。

関連項目