我仔细搜索过,发现了这个问题的几个答案,但都没有适用。
我有一个使用命名管道端点由Windows服务托管的.NET 4.0 WCF服务。这设置为在启动时自动启动。我有一个使用该服务的客户端。
重新启动服务器时,服务将正常启动,但客户端将收到以下错误:
1:net.pipe:// localhost / WCFSQLService /没有可以接受该消息的端点监听。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。
2:在本地计算机上找不到管道端点'net.pipe:// localhost / WCFSQLService /'。
如果客户端和服务都重新启动,则问题自行解决。
正如其他人所指出的,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>
答案 0 :(得分:0)
也许服务器正在杀死命名管道?尝试定期重新打开客户端上的频道,直到它恢复为止。