[英]Multiple contracts in one service can not be discovered on Client using WCF Discovery
我想開發一個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的端點。 服務不存在或不支持發現。
您是否認為在這種情況下是否有可能在一項服務中達成可發現的多個合同?
如果是,如何根據我現在擁有的代碼來執行此操作?
謝謝。
我認為這是有可能的。 首先嘗試做最簡單的事情,看看是否可行:
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;
}
}
另外,請確保您可以使用兩個不同的合同創建客戶端並手動調用服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.