Вызов WCF-прокси не регистрируется на сервере?
У меня есть служба, и я с помощью команды netstat -anb проверил, что во время работы службы она прослушивает правильный порт (8040). Договор на обслуживание содержит следующий договор:
[OperationContract]
bool RegisterPlayer();
Сам класс обслуживания реализует контракт явно:
bool IMechService.RegisterPlayer()
{
if (P1 != null)
{
P1 = OperationContext.Current.GetCallbackChannel<IMechServiceCallback>();
return true;
}
else if (P2 != null)
{
P2 = OperationContext.Current.GetCallbackChannel<IMechServiceCallback>();
return true;
}
return false;
}
И сгенерированный svcutil прокси создает следующий метод:
public bool RegisterPlayer()
{
return base.Channel.RegisterPlayer();
}
Этот код пытается сгенерировать прокси и вызвать метод. Я попытался использовать DuplexChannelFactory и прокси-класс, сгенерированный svcutil, и оба дали одинаковые результаты:
client = new MechServiceClient(new InstanceContext(this));
//client = DuplexChannelFactory<IMechService>.CreateChannel(this, new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8040/MechService"));
client.RegisterPlayer();
Выполнение кода достигает RegisterPlayer в прокси-классе, но переходит к тайм-ауту, никогда не запуская RegisterPlayer в службе. К сожалению, поскольку время просто истекло, я не получаю никаких исключений или ошибок, чтобы указать, где искать проблемы. До сих пор я проверял, что служба запущена и, по-видимому, прослушивает порт 8040 с помощью "netstat -anb", и я установил, что конечная точка mex работает так, как задумано, и публикует метаданные. Я выключил брандмауэр Windows. Я также создал отдельный тестовый проект с гораздо более простыми реализациями, чтобы проверить, правильно ли я выполняю шаги, и более простой тестовый проект работает нормально. У меня нет идей, по какой причине это не сработает, и любые советы будут оценены.
2 ответа
Предложение Эндрю для ведения журнала помогло, в основном то, что исправило это, объявив мои OperationContracts в isoneway=true.
Вы пытались установить ConcurrencyMode
в ConcurrencyMode.Multiple
?
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
class MechServiceImpl : IMechService
{
// ..
}
Режим параллелизма по умолчанию для службы ConcurrencyMode.Single
, что может вызвать осложнения с обратными вызовами.