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 служебного контракта, но это не помогло.