2013-04-07 1 views
0

У меня есть сервис и вы можете проверить с помощью «netstat -anb», что при запуске службы он прослушивает правильный порт (8040). Договор на обслуживание содержит следующий договор:WCF Прокси-вызов не регистрируется на сервере?

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

+0

Вы пробовали вести журнал сообщений: http://msdn.microsoft.com/en-us/library/ms731859.aspx –

ответ

0

Предложение Эндрю о регистрации помогло, в основном, зафиксировало, что моя операцияContracts объявила isoneway = true.

0

Вы пробовали установить ConcurrencyMode на ConcurrencyMode.Multiple?

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
class MechServiceImpl : IMechService 
{ 
    // .. 
} 

режим параллелизма по умолчанию для службы ConcurrencyMode.Single, что может привести к осложнениям с обратными вызовами.

+0

Он был настроен на Reentrant, но Multiple, похоже, не внес изменений. –

Смежные вопросы