tracer8086 Ответов: 0

Endpointnotfoundexception в дуплексном клиенте WCF


Я создал для него сервис WCF и клиент. Во-первых, клиент называет Зарегистрировать() метод, который добавляет канал обратного вызова клиента к clientChannels.

Когда звонит клиент вызов sendMessage(), сервер отправляет полученные данные другим зарегистрированным клиентам с помощью ShowMessage() метод обратного вызова клиента. Свойство instancecontextmode услуги Одиночный.

Service host-это консольное приложение. Он работает нормально, но клиент блокируется после этого Зарегистрировать() звонит и ничего не выдает. Через некоторое время его бросает EndPointNotFoundException:

Там не было конечной точки прослушивания на http://localhost:8733/Design_Time_Addresses/WCFDuplexServiceTest/Service1/ это могло бы принять сообщение.

Как это исправить?

Конфигурационный файл хост-приложения:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>

  <system.serviceModel>
    <services>
      <service name="WCFDuplexServiceTest.MessageService">
        <endpoint address="" binding="wsDualHttpBinding" contract="WCFDuplexServiceTest.IMessageService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/WCFDuplexServiceTest/Service1/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  
</configuration>


Конфигурационный файл клиентского приложения:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
    <system.serviceModel>
        <bindings>
          <wsDualHttpBinding>
            <binding name="WSDualHttpBinding_IMessageService"
                     clientBaseAddress="http://localhost:8000/myClient/">
            <security mode="None" />
            </binding>
          </wsDualHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8733/Design_Time_Addresses/WCFDuplexServiceTest/Service1/"
                binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IMessageService"
                contract="MessageService.IMessageService" name="WSDualHttpBinding_IMessageService">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>


Контракты:

использование системы.Модель обслуживания;

пространство имен WCFDuplexServiceTest
{
// Серверные методы.
[ServiceContract(SessionMode = SessionMode.Разрешено, CallbackContract = typeof(IClientCallback))]
публичный интерфейс IMessageService
{
[OperationContract(IsOneWay = true)]
пустота зарегистрироваться();

[OperationContract(IsOneWay = true)]
void SendMessage(строковое сообщение);
}

// Методы клиента.
открытый интерфейс IClientCallback
{
[OperationContract(IsOneWay = true)]
void ShowMessage(строковое сообщение);
}
}

Реализация:

использование системы.Коллекции.Общий;
использование системы.Модель обслуживания;

пространство имен WCFDuplexServiceTest
{
[Поведение Servicebehavior(Свойство Instancecontextmode = Свойство Instancecontextmode.Одиночный)]
публичный класс MessageService : IMessageService
{
частный список<iclientcallback> clientChannels = новый список<iclientcallback>();
private int numberOfUsers = 0;

общественные MessageService() { }

общественного недействительными зарегистрироваться()
{
clientChannels.Добавить(OperationContext.Current.GetCallbackChannel<iclientcallback>());
numberOfUsers++;
}

public void SendMessage(строковое сообщение)
{
foreach (var-канал в клиентских каналах)
канал.ShowMessage(сообщение + строка.Формат("/nPeople online: {0}", numberOfUsers));
}
}
}

Клиент:

использование системы;
использование WCFTestServiceClient.MessageService;
использование системы.Модель обслуживания;

пространство имен WCFTestServiceClient
{
классная программа
{
static void Main(string[] args)
{
используя (MessageServiceClient клиент = новый MessageServiceClient(новый контекст instancecontext(новый MessageServiceHandler())))
{
клиент.Зарегистрировать();
клиент.SendMessage("сколько людей в сети?");
}
}
}

публичный класс MessageServiceHandler : IMessageServiceCallback
{
public void ShowMessage(строковое сообщение)
{
Приставка.WriteLine("ответ сервера:" + сообщение);
}
}
}

Что я уже пробовал:

Я пытался измениться Свойство instancecontextmode реализации услуг и SessionMode служебного контракта, но это не помогло.

0 Ответов