我想开发一个WCF服务来支持多个合同。我设法通过遵循Stackoverflow上的post的指令来完成这项工作。
所以基本上创建一个服务(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的端点。要么没有服务,要么不支持发现。
您认为在这种情况下是否有可能在一项服务中实现可发现的多个合同?
如果是,我怎么能根据我现在的代码来做到这一点?
感谢。
答案 0 :(得分: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;
}
}
还要确保您可以使用两个不同的合同创建客户并手动调用服务。