2016-07-05 12 views
1

Ich habe zwei Anwendungen, WCF-Endpunkte unter Verwendung Named Pipes für die Kommunikation verfügbar macht.Consuming-Dienst über Named Pipes

Eine App ist eine WPF-Benutzeranwendung und die andere ist ein Windows-Dienst, wenn ich einen Anruf von der Benutzer-App zum Win-Service mache, aber immer wenn der Windows-Dienst den WPF-Anwendungsendpunkt aufruft, erhalte ich ein System .ServiceModel.CommunicationObjectFaultedException, das angibt, dass das Kommunikationsobjekt nicht verwendet werden kann, während es sich um eine fehlerhafte Ausnahme handelt.

Die lustige Sache ist, dass, wenn ich meinen Code kopieren und in eine Konsolenanwendung einfügen, es gut funktioniert.

Hier ist der Code Ich bin mit dem Kommunikationsobjekt

 public void CallService() 
     { 
      using (var channel = GetServiceClient()) 
      { 
       channel.Open(); 

       var service = channel.CreateChannel(); 

       service.DoFoo(); 
      } 
     } 

     private static ChannelFactory<IFooService> GetServiceClient() 
     { 
      return new ChannelFactory<IFooService>(
       new NetNamedPipeBinding 
       { 
        Security = new NetNamedPipeSecurity { Mode = NetNamedPipeSecurityMode.None } 
       }, 
       @"net.pipe://barAddress/fooService"); 
     } 

Antwort

0

Nach einigen Recherchen zu schaffen, fand ich heraus, dass NetNamedPipesBinding für die Kommunikation nicht die gleichen wie der Standard-Named Pipes verwendet wird, so dass einige Einschränkungen mit .

Was passiert ist, dass ein Windows-Dienst nicht in derselben Benutzersitzung wie eine Desktop-Anwendung ausgeführt wird und NetNamedPipes nicht vom Dienstkontext in eine Benutzersitzung wechseln kann, so wie er die Grenze zwischen zwei verschiedenen nicht überschreiten kann Benutzersitzungen.

Die Alternativen, die ich fand, ist die Verwendung eines reinen Named Pipes-Ansatzes ohne WCF oder die Änderung des Vertragstyps zu einem Duplex-Dienst und das Öffnen des Kanals für den Dienst durch die Benutzeranwendung.

+0

Ändern Sie einfach das Konto, in dem der Dienst ausgeführt wird. Keine Notwendigkeit, nicht-WCF-Named-Pipes gehen – MickyD

+0

Dank @MickyD, aber dieser Dienst wird in vielen Umgebungen bereitgestellt, wo der Benutzer minimale Berechtigungen haben, also gibt es keine Möglichkeit um beide für denselben Benutzer auszuführen. – bateloche