[英]Hosting selected methods of a wcf service on multiple binding
面試中有人問我這個問題,但我不知道答案。
問題是我們在一項服務中有5個運營合同。 我們希望將它們全部托管在一個綁定中,比如說http,而其中只有兩個托管在另一個綁定中。 因此,這兩種方法必須同時托管在綁定上,並且必須沒有任何重復。
我們如何做到這一點? 可能嗎
是的,有可能。 我們可以如下構造接口協定,以分離出我們希望僅在一個端點上可用的方法:
[ServiceContract]
interface ILimitedAvailabilityOp
{
[OperationContract]
string OpB();
}
[ServiceContract]
interface IAllOfMyOps : ILimitedAvailabilityOp
{
[OperationContract]
string OpA();
}
因此,總共我們有兩種方法都可以通過繼承在IAllOfMyOps
使用,而ILimitedAvailabilityOp
具有僅在一個綁定上可用的操作。 對於我們的服務實施,我們執行以下所有操作:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class MyService : IAllOfMyOps
{
public string OpA()
{
return "A";
}
public string OpB()
{
return "B";
}
}
創建服務實例時,可以對具有兩個不同綁定的兩個不同端點執行以下操作。 在網絡tcp端點上,我們使操作A和B都可用,在僅綁定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();
}
因此,我們沒有在任何地方重復任何代碼,並且在一個綁定上有兩個操作可用,而在另一個綁定上只有一個可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.