これを行うには、独自のサービス ファクトリを作成し、アクティブ化プロセスの一部をオーバーライドします。
このような 2 つのサービス契約があるとします。
public interface IService1
{
[OperationContract]
string GetData(int value);
}
[ServiceContract]
public interface IService2
{
[OperationContract]
string Foobar();
}
これらがこのような単一のクラスで実装されていると仮定します。
public class Service1 : IService1, IService2
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public string Foobar()
{
return "foobar";
}
}
ここで、2 番目のサービス コントラクトだけのエンドポイントを変更する場合は、.svc ファイルに Factory プロパティを追加して、カスタム サービス ファクトリの実装をポイントします。
<%@ ServiceHost Language="C#" Debug="true" Factory="SimpleWCF2.MyServiceFactory" Service="SimpleWCF2.Service1" CodeBehind="Service1.svc.cs" %>
次に、カスタム サービス ホストをインスタンス化するカスタム サービス ファクトリを作成します。カスタム サービス ホストで、ApplyConfiguration をオーバーライドし、コントラクト 2 の既定のエンドポイントを削除して、カスタム エンドポイント構成に置き換えます。たとえば、ここでは、デフォルトの「basicHttpBinding」をコントラクト 2 のみの「WsHttpBinding」に置き換えています。もちろん、必要に応じてバインディングを構成できます (ストリーミングについて言及しました)。これは単なる例です。
public class MyServiceFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new MyServiceHost(serviceType, baseAddresses);
}
}
public class MyServiceHost : ServiceHost
{
public MyServiceHost(Type serviceType, params Uri[] baseAddresses) :
base (serviceType, baseAddresses)
{ }
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
AddDefaultEndpoints();
// Remove the default endpoint for IService2
var defaultEp = this.Description.Endpoints.FirstOrDefault(e => e.Contract.ContractType == typeof(IService2));
this.Description.Endpoints.Remove(defaultEp);
// Add a new custom endpoint for IService2
this.AddServiceEndpoint(typeof(IService2), new WSHttpBinding(), "test");
}
}
それでおしまい。簡素化された構成を変更する必要はありません。
これで、クライアントは新しいサービス エンドポイントを介して 2 番目のコントラクトを検出します。たとえば、サンプルの WCF テスト クライアントを次に示します。