Я тщательно искал и нашел несколько ответов на эту проблему, но ни одна из них не применяется.Служба WCF сбой в трубке
У меня есть служба WCF .NET 4.0, размещенная службами Windows с использованием конечной точки именованного канала. Это значит, что он запускается автоматически при загрузке. У меня есть клиент, который использует эту услугу.
Когда сервер перезагружаются, служба начнет нормально, но клиент получит следующее сообщение об ошибке:
1: Там не было конечной точки прослушивания в net.pipe: // локальный/WCFSQLService /, которые могли бы принять сообщение. Это часто вызвано неправильным адресом или действием SOAP. Дополнительную информацию см. В InnerException, если имеется.
2: Конечная точка трубы net.pipe: // localhost/WCFSQLService/'не найдена на вашем локальном компьютере.
Если клиент и служба перезапускаются, проблема сама решает.
Как уже отмечалось, как Слушатель адаптер Net.Pipe работает и 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>
Вы пытались включить диагностику WCF со стороны обслуживания? –
Клиент и служба Windows, обслуживающая службу WCF, находятся на одной машине, правильно? (Я бы ожидал, так как вы используете именованные каналы, но никто не знает.). – Tim
Правильно, клиент и сервер находятся на одной машине. Я также включу служебный диаг. –