2016-05-12 27 views
1

ich in einer Situation bin, wo ich will WCF verwenden, um zwei verschiedene Schnittstellen zu belichten:Verschiedene Dienste auf verschiedenen Ports in WCF

  • Internal (IPC Kommunikation)
  • Extern (Http REST) ​​

Die externe Schnittstelle sollte nicht in der Lage sein, die interne Schnittstelle zu sehen oder zu verwenden. Ich dachte also darüber nach, die beiden Dienste auf verschiedenen Ports zu hosten (8000 für intern und 8001 für extern) und dann die gesamte externe Kommunikation an Port 8000 blockieren.

Außerdem habe ich versucht, mit Named Pipes für die IPC-Kommunikation herumzuspielen, und ich stieß auf ein Problem. Wenn die unerwartete Situation eintritt, dass der Dienst abstürzt oder offline geht, müsste der Client auch neu gestartet werden, um die Kommunikation mit dem Dienst über die Named Pipes herstellen zu können. Ist das normales Verhalten und kann es vermieden werden?

Ich habe den folgenden Code so weit:

// Service Host 
var host = new ServiceHost(serviceContract, new Uri(_address)); 
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true }); 
var behaviour = host.Description.Behaviors.Find<ServiceBehaviorAttribute>(); 
behaviour.InstanceContextMode = InstanceContextMode.Single; 

// Local Endpoint 
host.AddServiceEndpoint(typeof(ILocalServiceContract), new BasicHttpBinding(), "Local"); 
host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); 

// External Endpoint 
var webHttpBidning = new WebHttpBinding { TransferMode = TransferMode.Streamed }; 
var externalEndPoint = host.AddServiceEndpoint(typeof(IExternalServiceContract), webHttpBidning, "External"); 
externalEndPoint.Behaviors.Add(new WebHttpBehavior()); 

Sie sind derzeit beide auf dem gleichen Port gehostet, die ich vermeiden wollen, bin ich ziemlich neu in WCF und ich konnte wirklich eine Anleitung für die besten nutzen üben und was ich falsch mache. Wie bereits erwähnt, könnte 'BasicHttpBinding' möglicherweise durch eine Named Pipe ersetzt werden, wenn mein Problem gelöst werden kann.

Wir freuen uns auf die Experten zu hören und wenn Sie irgendeine clearification brauchen fühlen Sie sich frei :)

+0

', dass die Service-Abstürze oder offline geht der Kunde würde auch die Kommunikation mit dem Dienst über die in der Lage sein werden, neu gestartet haben, um zu etablieren Named Pipes. Das bedeutet, dass Sie Fehler nicht korrekt behandeln. Sie müssen den Proxy zerstören und einen neuen erstellen, um die Verbindung wiederherzustellen. Deshalb wird der Client neu gestartet, da es eine neue Instanz des Proxys ist. Sobald ein Proxy fehlerhaft ist, kann er nie wieder verwendet werden. –

+0

Danke für die Antwort. Wenn ich die Named Pipe-Bindung über MEX entlarve, wie zerstöre ich den Proxy und muss ich es jedes Mal machen? Ein Codebeispiel oder Link wäre wirklich nett :) – SOK

+0

https://github.com/rmandvikar/WcfServiceClientHelper ist ideal für die Verwaltung der Proxy Instanziierung für Sie –

Antwort

1

ich mit dem folgenden Code auf dem Server, das Problem gelöst zu fragen. Auf den Clients, die über Named Pipes mit dem Server kommunizieren, habe ich die Bibliothek "WcfClientProxyGenerator" verwendet, um fehlertolerante Client-Proxys zu generieren.

_namedPipeAddress = "net.pipe://localhost/"; 
_httpAddress = "http://localhost:8000"; 

var host = new ServiceHost(serviceContract, new Uri(_namedPipeAddress), new Uri(_httpAddress)); 

host.Description.Behaviors.Add(new ServiceMetadataBehavior { }); 

var behaviour = host.Description.Behaviors.Find<ServiceBehaviorAttribute>(); 
behaviour.InstanceContextMode = InstanceContextMode.Single; 
behaviour.IncludeExceptionDetailInFaults = true; 

// Local Endpoint 
host.AddServiceEndpoint(typeof(ILocalServiceContract), new NetNamedPipeBinding(), "Local"); 
host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexNamedPipeBinding(), "mex"); 

//// External Endpoint 
var webHttpBidning = new WebHttpBinding { TransferMode = TransferMode.Streamed }; 
var externalEndPoint = host.AddServiceEndpoint(typeof(IExternalServiceContract), webHttpBidning, new Uri(_httpAddress)); 
externalEndPoint.Behaviors.Add(new WebHttpBehavior()); 

Für weitere Verbesserungen zu dieser Lösung das Gefühl, frei zu äußern :)