簡體   English   中英

在多個綁定上托管WCF服務的選定方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM