自己ホストの場合、ServiceHost のインスタンスを生成してから Open するまでの間に、任意の処理を挟めます。
ServiceHost host = new ServiceHost(typeof(MyService)); // サービスのメタデータを取得できるようにする ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; host.Description.Behaviors.Add(smb); host.Open();
上記の場合、Behavior を追加する部分は汎用的な処理なので、再利用したいところです。
カスタム ServiceHost は、この汎用的な処理を再利用するための手段として作成します。
public class MyServiceHost : ServiceHost { public MyServiceHost(Type serviceType, params uri[] baseaddresses) : base(serviceType, baseAddresses) { } protected override void OnOpening() { // ホストしたサービスのメタデータを取得できるようにする ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; this.Description.Behaviors.Add(smb); base.OnOpening(); } }
こうしてカプセル化しておけば、いろんなホストアプリケーションで再利用できます。
なお、作成したカスタム ServiceHost を IIS で利用する場合は、カスタム ServiceHostFactory を作成しなければいけません。