У меня есть две службы, с которыми я хочу взаимодействовать через именованные каналы.Я попробовал это двумя способами, как путем создания двух отдельных ServiceHosts, так и путем создания нескольких конечных точек в одном сервисе.Первый сервис работает отлично, есть ли у меня второй сервис или нет.Для второго сервиса в обоих случаях я либо получаю ошибку «Не найдена конечная точка» из-за того, что не удается найти именованный канал (отдельные сервисы), либо проблема с фильтрацией адресов (которая не имеет значения для параметра Any).Я проверил и дважды проверил мои настройки, но я в тупике.
И сервер, и клиент используют одну и ту же сборку, которая имеет контракт:
[ServiceContract(CallbackContract = typeof(IServiceCallback1), SessionMode = SessionMode.Required)]
public interface IService1
{
....
}
[ServiceContract]
public interface IService2
{
...
}
Вот сторона сервера:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Reentrant, IncludeExceptionDetailInFaults = true)]
class Service1Impl : IService1
{
...
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, IncludeExceptionDetailInFaults = true)]
class IService2Impl : IService2
{
...
}
...
serviceHost1 = new ServiceHost(typeof(Service1Impl));
serviceHost2 = new ServiceHost(typeof(Service2Impl));
try
{
serviceHost2.Open();
serviceHost1.Open();
}
(Да, я открываю их в обратном порядке, поскольку клиентский процесс предполагает, что Service2 доступен, если он может подключиться к Service1)
Вот моя конфигурация для служб:
<system.serviceModel>
<services>
<service name="Service1Impl" behaviorConfiguration="myServiceBehavior">
<endpoint address="" binding="netNamedPipeBinding" contract="IService1"/>
<host>
<baseAddresses>
<add baseAddress="net.pipe://localhost/Service1"/>
</baseAddresses>
</host>
</service>
<service name="Service2Impl" behaviorConfiguration="myServiceBehavior">
<endpoint address="" binding="netNamedPipeBinding" contract="IService2"/>
<host>
<baseAddresses>
<add baseAddress="net.pipe://localhost/Service2"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="myServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
На стороне клиента Я не использую конфигурацию и использую это для обоих:
public class Service2Client: ClientBase<IService2>, IService2
{
public Service2Client()
: base(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/Service2"))
{
}
}
Есть ли что-то, что я здесь упускаю?Как я уже сказал, я могу нормально подключаться и совершать вызовы на первом сервисе, но второй получает EndpointNotFoundException, жалуясь на то, что он не может найти именованный канал.