1

我想开发一个 WCF 服务来支持多个合同。我按照Stackoverflow 上这篇文章的说明设法完成了这项工作。

所以基本上创建一个服务(FooBarService)来实现多个合同(IFooService,IBarService)。

    string serviceAddress = "net.tcp://localhost:8088/FooBarService";

    ServiceHost selfServiceHost = new ServiceHost(typeof(FooBarService));            

    // The endpoints need to share this binding.
    var binding = new NetTcpBinding();

    selfServiceHost.AddServiceEndpoint(typeof(IFooService), binding, serviceAddress);
    selfServiceHost.AddServiceEndpoint(typeof(IBarService), binding, serviceAddress);

但具有挑战性的事情是,我还想使用 WCF Discovery 使该服务可发现,以便将客户端和服务与端点绑定分离。

在服务方面,我做了这样的事情:

    var discoveryBehavior = new ServiceDiscoveryBehavior();
    discoveryBehavior.AnnouncementEndpoints.Add(new AnnouncementEndpoint(new NetTcpBinding(SecurityMode.None), new EndpointAddress("net.tcp://localhost:8001/Announcement")));
    _serviceHost.Description.Behaviors.Add(discoveryBehavior);
    _serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());

该服务似乎可以工作。

但是在一个只想使用合同 IFooService 的客户端上,当我尝试发现它时,我总是遇到以下错误。

无法发现 contract.IFooService 的端点。要么不存在服务,要么不支持发现。

您认为在这种情况下是否有可能在一项服务中实现可发现的多个合同?

如果是,我该如何根据我现在拥有的代码来做到这一点?

谢谢。

4

1 回答 1

2

我认为这是可能的。首先尝试做最简单的事情,看看是否可行:

string serviceAddress = "net.tcp://localhost:8088/FooBarService";

ServiceHost selfServiceHost = new ServiceHost(typeof(FooBarService));            

// The endpoints need to share this binding.
var binding = new NetTcpBinding();

selfServiceHost.AddServiceEndpoint(typeof(IFooService), binding, serviceAddress);
selfServiceHost.AddServiceEndpoint(typeof(IBarService), binding, serviceAddress);

// Add ServiceDiscoveryBehavior
selfServiceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());

// Add a UdpDiscoveryEndpoint
selfServiceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());

客户:

static EndpointAddress FindCalculatorServiceAddress()
{
    // Create DiscoveryClient
    DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());

    // Find ICalculatorService endpoints            
    FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(IFooService)));
    if (findResponse.Endpoints.Count > 0)
    {
        return findResponse.Endpoints[0].Address;
    }
    else
    {
        return null;
    }
}

还要确保您可以使用两个不同的合同创建客户端并手动调用服务。

于 2017-01-19T09:59:51.920 回答