私は徹底的に検索し、この問題に対するいくつかの答えを見つけましたが、それらのどれも適用されません。WCFサービスの名前付きパイプの障害が発生しました。
名前付きパイプエンドポイントを使用してWindowsサービスによってホストされる.NET 4.0 WCFサービスがあります。これは起動時に自動的に開始するように設定されています。私はサービスを消費するクライアントを持っています。
サーバーを再起動すると、サービスが正常に起動しますが、クライアントは次のエラーを取得します:
1:net.pipeで聞いて何のエンドポイントがありませんでした:// localhost /をWCFSQLService /受け入れることができることメッセージ。これは、しばしば不正なアドレスまたはSOAPアクションによって引き起こされます。詳細については、InnerException(存在する場合)を参照してください。
2:パイプエンドポイント 'net.pipe:// localhost/WCFSQLService /'がローカルマシン上に見つかりませんでした。
クライアントとサービスの両方を再起動すると、問題が解決します。他の人が指摘したように
、両方Net.Pipeリスナーアダプタが実行されていて、WCF非HTTPアクティブ化が確認されています
は、私たちも、設定しようとしましたサービスは遅れて開始するが、喜びはない。エンドポイントや設定や通常の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>
サービス側でWCF診断を有効にしましたか? –
WCFサービスをホストするクライアントとWindowsサービスが同じマシンにありますが、正しいですか? (名前付きパイプを使用しているので、私は期待していますが、決して知りません)。 – Tim
クライアントとサーバーが同じマシンにあります。また、サービスダイアグをオンにします。 –