WCF服务命名管道故障

时间:2016-04-13 20:43:28

标签: c# wcf windows-services named-pipes

我仔细搜索过,发现了这个问题的几个答案,但都没有适用。

我有一个使用命名管道端点由Windows服务托管的.NET 4.0 WCF服务。这设置为在启动时自动启动。我有一个使用该服务的客户端。

重新启动服务器时,服务将正常启动,但客户端将收到以下错误:

1:net.pipe:// localhost / WCFSQLService /没有可以接受该消息的端点监听。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。

2:在本地计算机上找不到管道端点'net.pipe:// localhost / WCFSQLService /'。

如果客户端和服务都重新启动,则问题自行解决。

正如其他人所指出的,Net.Pipe监听器适配器正在运行,并且检查了WCF非HTTP激活:

net.pipe listener adapter

wcf non-http activation

我们甚至尝试将服务设置为延迟启动,但没有快乐。可以假设端点或配置或普通WCF的东西有问题,但是当服务和客户端都重新启动时,一切正常。此外,这只发生在一台机器上。如有必要,我可以提供端点信息和代码。

客户端:

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>

1 个答案:

答案 0 :(得分:0)

也许服务器正在杀死命名管道?尝试定期重新打开客户端上的频道,直到它恢复为止。