Конечные точки нескольких именованных каналов WCF - PullRequest
4 голосов
/ 21 декабря 2010

У меня есть две службы, с которыми я хочу взаимодействовать через именованные каналы.Я попробовал это двумя способами, как путем создания двух отдельных 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, жалуясь на то, что он не может найти именованный канал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...