2016-04-13 15 views
0

私は徹底的に検索し、この問題に対するいくつかの答えを見つけましたが、それらのどれも適用されません。WCFサービスの名前付きパイプの障害が発生しました。

名前付きパイプエンドポイントを使用して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のもので何かが間違っていると思われますが、サービスとクライアントの両方が再起動されるとすべてが動作します。さらに、これは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

WCFサービスをホストするクライアントとWindowsサービスが同じマシンにありますが、正しいですか? (名前付きパイプを使用しているので、私は期待していますが、決して知りません)。 – Tim

+0

クライアントとサーバーが同じマシンにあります。また、サービスダイアグをオンにします。 –

答えて

0

たぶん、サーバが名前付きパイプを殺しています?多分回復するまでクライアント上のチャネルを定期的に再開してみてください。

+0

私は実際にすべての通話のためにチャンネルを閉じて再開しています。 –

関連する問題