私はインタビューでこの質問をされました、そして私はまだ答えを知りません。
質問は、サービスに5つの運用契約があるということです。1つのバインディングでそれらすべてをホストしたいと思います。たとえば、httpと、別のバインディングで2つだけをホストします。したがって、これら2つのメソッドは、バインディングと重複なしの両方でホストする必要があります。
これをどのように行うのですか?それも可能ですか?
はい、可能です。インターフェイスコントラクトを次のように構成して、1つのエンドポイントでのみ使用できるようにするメソッドを分離できます。
[ServiceContract]
interface ILimitedAvailabilityOp
{
[OperationContract]
string OpB();
}
[ServiceContract]
interface IAllOfMyOps : ILimitedAvailabilityOp
{
[OperationContract]
string OpA();
}
したがって、合計で2つのメソッドがあり、どちらもIAllOfMyOps
継承を介しILimitedAvailabilityOp
て使用でき、1つのバインディングでのみ使用できるようにする操作があります。サービスの実装では、すべての操作を次のように実装します。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class MyService : IAllOfMyOps
{
public string OpA()
{
return "A";
}
public string OpB()
{
return "B";
}
}
サービスインスタンスを作成するとき、2つの異なるバインディングを持つ2つの異なるエンドポイントを使用して次のように実行できます。ネットtcpエンドポイントでは、Bだけをバインドする名前付きパイプで、opsAとBの両方を使用できるようにします。
static void CreateService()
{
var myService = new MyService();
var serviceHost = new ServiceHost(myService);
serviceHost.AddServiceEndpoint(typeof(IAllOfMyOps), new NetTcpBinding(), "net.tcp://localhost:61234/MyService/IAllOfMyOps");
serviceHost.AddServiceEndpoint(typeof(ILimitedAvailabilityOp), new NetNamedPipeBinding(), "net.pipe://localhost/MyService/ILimitedAvailabilityOp");
serviceHost.Open();
}
接続するクライアントは次のようになります。
class MyClient : ClientBase<IAllOfMyOps>, IAllOfMyOps
{
public MyClient(Binding binding, EndpointAddress endpoint) : base(binding, endpoint) { }
public string OpA()
{
return base.Channel.OpA();
}
public string OpB()
{
return base.Channel.OpB();
}
}
そして、次のように接続します。
static void Connect()
{
var tcpClient = new MyClient(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:61234/MyService/IAllOfMyOps"));
Console.WriteLine(tcpClient.OpA());
Console.WriteLine(tcpClient.OpB());
tcpClient.Close();
var namedPipeClient = new MyClient(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/MyService/ILimitedAvailabilityOp"));
Console.WriteLine(namedPipeClient.OpB());
Console.WriteLine(namedPipeClient.OpA()); // this would fail
namedPipeClient.Close();
}
したがって、コードをどこにも繰り返さず、1つのバインディングで2つの操作を使用でき、別のバインドで1つだけ使用できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加