2016-04-13 2 views
0

Я тщательно искал и нашел несколько ответов на эту проблему, но ни одна из них не применяется.Служба WCF сбой в трубке

У меня есть служба WCF .NET 4.0, размещенная службами Windows с использованием конечной точки именованного канала. Это значит, что он запускается автоматически при загрузке. У меня есть клиент, который использует эту услугу.

Когда сервер перезагружаются, служба начнет нормально, но клиент получит следующее сообщение об ошибке:

1: Там не было конечной точки прослушивания в net.pipe: // локальный/WCFSQLService /, которые могли бы принять сообщение. Это часто вызвано неправильным адресом или действием SOAP. Дополнительную информацию см. В InnerException, если имеется.

2: Конечная точка трубы net.pipe: // localhost/WCFSQLService/'не найдена на вашем локальном компьютере.

Если клиент и служба перезапускаются, проблема сама решает.

Как уже отмечалось, как Слушатель адаптер Net.Pipe работает и WCF Non-HTTP Activation проверяется:

net.pipe listener adapter

wcf non-http activation

Мы даже пытались установив сервис для отсроченного начала, но без радости. Можно было бы предположить, что что-то не так с конечной точкой или конфигурацией или обычным материалом WCF, но когда служба и клиент перезапускаются, все работает. Кроме того, это происходит только на 1 машине. При необходимости я могу предоставить информацию и код конечной точки.

Клиент:

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

Хост

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

конфигурации

<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

Вы пытались включить диагностику WCF со стороны обслуживания? –

+0

Клиент и служба Windows, обслуживающая службу WCF, находятся на одной машине, правильно? (Я бы ожидал, так как вы используете именованные каналы, но никто не знает.). – Tim

+0

Правильно, клиент и сервер находятся на одной машине. Я также включу служебный диаг. –

ответ

0

Может сервер убивает именованный канал ? Попытайтесь повторно открыть канал на клиенте периодически, пока он не восстановится.

+0

Я на самом деле закрываю и снова открываю канал для каждого звонка, так что радости нет. –