Вызов 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, что может вызвать осложнения с обратными вызовами.

Другие вопросы по тегам