Я создал проект, как описано в этом URL:
http://msdn.microsoft.com/en-us/library/ms734784.aspx
Я использовал версию app.config. Но использование кода-версии ничего не меняет (ошибка тайм-аута все еще возникает).
Для создания ServiceHost я использовал следующий код:
this.serviceHost = new ServiceHost(typeof(Calculator));
// Open the ServiceHostBase to create listeners and start
// listening for messages.
this.serviceHost.Open();
На стороне клиента я использовал следующий код:
ChannelFactory<ICalculator> factory = new ChannelFactory<ICalculator>("netTcp_ICalculator");
ICalculator communicationChannel = this.factory.CreateChannel();
string test = communicationChannel.GetData(5);
В последней строке программа ждет одну минуту, затем я получаю тайм-аут:
This request operation sent to net.tcp://localhost:8008/Calculator did not
receive a reply within the configured timeout (00:01:00).
The time allotted to this operation may have been a portion
of a longer timeout. This may be because the service is still
processing the operation or because the service was unable to
send a reply message. Please consider increasing the operation
timeout (by casting the channel/proxy to IContextChannel and
setting the OperationTimeout property) and ensure that the service
is able to connect to the client.
Класс Calculator и интерфейс существуют. Помимо этого таймаута я не получаю никакой другой ошибки. Я установил точку останова в методе GetData, но точка останова не была достигнута.
Я попытался изменить номер порта, используемый для клиента, с 8008 на 8009, но разрешил конечной точке для сервера 8008. Я хотел проверить, пытается ли клиент связаться с сервером. Затем я получаю сообщение об ошибке, что другая сторона не отвечает (EndpointNotFoundException).
При изменении клиентского порта обратно на 8008 я снова получаю сообщение об ошибке тайм-аута.
Что-то не так с моим кодом?
Как я могу убедиться, что сервер может связаться с клиентом?
Клиент и сервер находятся в одном тестовом приложении.
Спасибо за вашу помощь!
EDIT:
Я удалил настройки app.config. И попытался собрать сервер и клиент, используя исходный код. Для сборки сервера проблем не было. Но создание клиента - это проблема.
Нет возможности позвонить:
CalculatorClient cc = new CalculatorClient(myBinding, myEndpointAddress);
Компилятор не знает CalculatorClient.
Могу ли я использовать следующее?
NetTcpBinding myBinding = new NetTcpBinding();
myBinding.Security.Mode = SecurityMode.None;
// Create the address string, or get it from configuration.
string tcpUri = "net.tcp://localhost:8008/Calculator";
// Create an endpoint address with the address.
EndpointAddress myEndpointAddress = new EndpointAddress(tcpUri);
ChannelFactory<ICalculator> factory = new ChannelFactory<ICalculator>(myBinding, myEndpointAddress);
factory.Open();
ICalculator communicationChannel = this.factory.CreateChannel();
string test = communicationChannel.GetData(5);
Я снова получаю исключение в последней строке: (
РЕШИТЬ:
Хорошо, проблема решена. Мне нужно было вызвать инициализацию хоста WCF через собственный поток:
hostThread = new Thread(this.createService);
hostThread.Start();
Теперь все отлично работает!
Спасибо за вашу помощь!