繁体   English   中英

WCF服务命名管道故障

[英]WCF service named pipe failure

我已经进行了彻底的搜索,找到了解决此问题的几种方法,但是没有一个适用。

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

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

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

2:在本地计算机上找不到管道终结点“ net.pipe:// localhost / WCFSQLService /”。

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

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

net.pipe侦听器适配器

wcf非http激活

我们甚至尝试将服务设置为延迟启动,但没有任何乐趣。 人们可能会认为端点或配置或正常的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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM