2016-04-13 4 views
0

Ich habe gründlich gesucht und mehrere Antworten auf dieses Problem gefunden, aber keiner von ihnen gilt.WCF-Service namens Rohrfehler

Ich habe einen .NET 4.0 WCF-Dienst, der von Windows-Diensten gehostet wird, die einen Named-Pipe-Endpunkt verwenden. Dies wird beim Booten automatisch gestartet. Ich habe einen Client, der den Dienst verbraucht.

Wenn der Server neu gestartet wird, wird der Dienst normalerweise starten, aber der Client die folgende Fehlermeldung erhalten:

1: Es gibt keinen Endpunkt war bei net.pipe hören: // localhost/WCFSQLService/die könnten annehmen die Nachricht. Dies wird oft durch eine falsche Adresse oder eine falsche SOAP-Aktion verursacht. Weitere Informationen finden Sie unter InnerException, falls vorhanden.

2: Der Pipe-Endpunkt 'net.pipe: // localhost/WCFSQLService /' konnte auf Ihrem lokalen Computer nicht gefunden werden.

Wenn der Client und der Dienst beide neu gestartet werden, wird das Problem von selbst behoben.

Wie andere haben darauf hingewiesen, sowohl der Net.Pipe Listener-Adapter läuft und die WCF Nicht-HTTP-Aktivierung aktiviert ist:

net.pipe listener adapter

wcf non-http activation

Wir haben sogar versucht, die Einstellung Service zu verspäteten Start, aber keine Freude. Man würde annehmen, dass etwas mit dem Endpunkt oder der Konfiguration oder normalen WCF-Dingen nicht in Ordnung ist, aber wenn der Dienst und der Client beide neu gestartet werden, funktioniert alles. Darüber hinaus geschieht dies nur auf 1 Maschine. Bei Bedarf kann ich Endpunktinformationen und Code bereitstellen.

Auftraggeber:

NetNamedPipeBinding binding = new NetNamedPipeBinding(); 
EndpointAddress endpoint = new EndpointAddress(endpointAddress); 
ChannelFactory<IWCFSQLService> channel = new ChannelFactory<IWCFSQLService>(binding, endpoint); 
IWCFSQLService client = channel.CreateChannel(); 
// do client calls 
channel.Close(); 

Host-

class Program 
    { 
    static void Main(string[] args) 
    { 
     ServiceBase[] servicesToRun = new ServiceBase[] 
     { 
      new WinServiceHost(), 
     }; 


     ServiceBase.Run(servicesToRun); 
    } 
    } 



    public class WinServiceHost : ServiceBase 
    { 
    private readonly ServiceManager serviceManager = new ServiceManager(); 

    protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 

     serviceManager.OpenHost<MyService>(); 
    } 

    protected override void OnStop() 
    { 
     base.OnStop(); 

     serviceManager.CloseAll(); 
    } 
    } 

    public class ServiceManager 
    { 
    private readonly List<ServiceHost> serviceHosts = new List<ServiceHost>(); 

    public void CloseAll() 
    { 
     foreach (ServiceHost serviceHost in serviceHosts) 
     { 
     serviceHost.Close(); 
     } 
    } 

    public void OpenHost<T>() 
    { 
     Type type = typeof(T); 
     ServiceHost serviceHost = new ServiceHost(type); 
     serviceHost.Open(); 
     serviceHosts.Add(serviceHost); 
    } 
    } 

Config

<system.serviceModel> 
    <services> 
     <service behaviorConfiguration="behaviorConfig" name="MyService"> 
     <endpoint address="" binding="netNamedPipeBinding" bindingConfiguration="clientNamedPipeBinding" 
        contract="IMyService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.pipe://localhost/MyService" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <bindings> 
     <netNamedPipeBinding> 
     <binding name="clientNamedPipeBinding"> 
      <readerQuotas maxArrayLength="65536" maxBytesPerRead="65536" /> 
     </binding> 
     </netNamedPipeBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="behaviorConfig"> 
      <serviceMetadata httpGetEnabled="false" httpGetUrl="" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceSecurityAudit auditLogLocation="Application" suppressAuditFailure="true" serviceAuthorizationAuditLevel="Failure" messageAuthenticationAuditLevel="SuccessOrFailure" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+0

Haben Sie versucht, die WCF-Diagnose auf der Serviceseite einzuschalten? –

+0

Der Client und der Windows-Dienst, der den WCF-Dienst hostet, befinden sich auf demselben Computer, richtig? (Ich würde es erwarten, da Sie Named Pipes verwenden, aber man weiß es nie.). – Tim

+0

Korrekt, der Client und der Server befinden sich auf demselben Computer. Ich werde auch Service Diag einschalten. –

Antwort

0

Vielleicht der Server die Named Pipe tötet ? Versuchen Sie, den Kanal auf dem Client regelmäßig neu zu öffnen, bis er möglicherweise wiederhergestellt wird.

+0

Ich bin eigentlich schließen und wieder den Kanal für jeden Anruf, so keine Freude gibt es auch nicht. –