2017-01-19 8 views
1

Ich möchte einen WCF-Dienst entwickeln, der mehrere Verträge unterstützt. Ich habe es geschafft, dies zu tun, indem ich die Anweisung von post auf Stackoverflow befolge.Mehrere Verträge in einem Dienst können auf dem Client mit WCF Discovery nicht erkannt werden

Im Grunde erstellen Sie einen Dienst (FooBarService), um mehrere Verträge (IFooService, IBarService) zu implementieren.

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); 

Aber die herausfordernde Sache ist, dass ich mag auch auffindbar mit WCF Entdeckung, um diesen Service Client und Service von Endpunkt zu entkoppeln Bindung.

In der Service-Seite, ich habe so etwas wie dies:

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()); 

Es scheint, dass der Dienst arbeiten.

Aber auf einem der Client, die nur Vertrag IFooService verwenden möchten, bekam ich immer den folgenden Fehler, wenn ich versuche, es zu entdecken.

Der Endpunkt für contract.IFooService kann nicht gefunden werden. Entweder ist kein Service vorhanden oder die Erkennung wird nicht unterstützt.

Glauben Sie, dass es in diesem Fall möglich ist, in einem Dienst erkennbare Mehrfachverträge zu erzielen?

Wenn JA, wie kann ich das tun, basierend auf dem Code, den ich gerade habe ?.

Danke.

Antwort

2

Ich würde denken, dass es möglich wäre. Versuchen Sie, die einfachste Sache zu tun zuerst, um zu sehen, ob das funktioniert:

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()); 

Auftraggeber:

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; 
    } 
} 

auch sicher, dass Sie Kunden mit den zwei verschiedenen Verträge erstellen und die Dienste manuell aufrufen.

Verwandte Themen