WCF NetTcpBinding - из руководства Microsoft - получение тайм-аута - PullRequest
2 голосов
/ 01 июля 2010

Я создал проект, как описано в этом 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();

Теперь все отлично работает!

Спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 01 июля 2010

Вы не добавляете какие-либо конечные точки в сервис. Вы не включили часть примера кода, которая добавляет конечную точку службы:

Uri tcpUri = new Uri("net.tcp://localhost:8008/Calculator");
// Create the ServiceHost.
ServiceHost sh = new ServiceHost(typeof(Calculator), tcpUri);

// Create a binding that uses TCP and set the security mode to none.
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.None;

// Add an endpoint to the service.
sh.AddServiceEndpoint(typeof(ICalculator), b, "");
// Open the service and wait for calls.
sh.Open();

Редактировать: То же самое касается вашего клиента. Вы должны указать адреса конечных точек

  // Create a channel factory.
  NetTcpBinding b = new NetTcpBinding();
  b.Security.Mode = SecurityMode.None;
  Uri tcpUri = new Uri("net.tcp://localhost:8008/Calculator");

  ChannelFactory<ICalculator> myChannelFactory = new ChannelFactory<ICalculator>(b,new EndpointAddress(tcpUri));

  // Create a channel.
  ICalculator calculator = myChannelFactory.CreateChannel();

Edit2: я не могу сейчас проверить этот код ... Попробую завтра утром.

0 голосов
/ 02 июля 2010

Используете ли вы Windows 7?

Если это так, вам, вероятно, нужно запустить Visual Studio от имени администратора.UAC не позволит вам создать конечную точку службы, если вы не являетесь администратором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...