2010-03-12 4 views
4

У нас есть служба WCF с несколькими клиентами для планирования операций между клиентами. Он отлично справился с XP. Переходя к win7, я могу подключить клиента только к серверу на одном компьютере. На данный момент, я думаю, что это связано с IPv6, но я в тупике о том, как действовать.Проблемы WCF Duplex net.tcp на win7

Клиент пытается подключиться к удаленному серверу, дает следующее исключение:

System.ServiceModel.EndpointNotFoundException: Не удалось подключиться к Net.Tcp: //10.7.11.14: 18297/Zetec/Услуги/SchedulerService/Scheduler. Попытка подключения продолжалась в течение промежутка времени 00: 00: 21.0042014. Код ошибки 10060 TCP: попытка подключения завершилась неудачно, потому что связанная сторона не ответила должным образом после определенного периода времени или установив соединение не удалось, потому что подключенный хост не смог ответить 10.7.11.14:18297. ---> System.Net.Sockets.SocketException: попытка подключения завершилась неудачно, потому что связанная сторона не ответила должным образом через какое-то время или не удалось установить соединение, потому что подключенный хост не смог ответить 10.7.11.14:18297

служба настроена таким образом:

<system.serviceModel> 
    <services> 
    <service 
     name="SchedulerService" 
     behaviorConfiguration="SchedulerServiceBehavior"> 
     <host> 
      <baseAddresses> 
       <add baseAddress="net.tcp://localhost/zetec/Service/SchedulerService"/> 
      </baseAddresses> 
     </host> 
     <endpoint address="net.tcp://localhost:18297/zetec/Service/SchedulerService/Scheduler" 
        binding="netTcpBinding" 
        bindingConfiguration = "ConfigBindingNetTcp" 
        contract="IScheduler" /> 
     <endpoint address="net.tcp://localhost:18297/zetec/Service/SchedulerService/Scheduler" 
        binding="netTcpBinding" 
        bindingConfiguration = "ConfigBindingNetTcp" 
        contract="IProcessingNodeControl" /> 
    </service> 
    </services> 
    <bindings> 
    <netTcpBinding> 
     <binding name = "ConfigBindingNetTcp" portSharingEnabled="True"> 
      <security mode="None"/> 
     </binding> 
    </netTcpBinding > 
    </bindings> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="SchedulerServiceBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceThrottling maxConcurrentSessions="100"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

клиент подключается следующим образом:

String endPoint = "net.tcp://" + GetIPV4Address(m_SchedulerHostAddress) + ":" + m_SchedulerHostPort.ToString(CultureInfo.InvariantCulture) + "/zetec/Service/SchedulerService/Scheduler"; 

NetTcpBinding binding = new NetTcpBinding(); 
binding.Security.Mode = SecurityMode.None; 

m_Channel = new DuplexChannelFactory<IProcessingNodeControl>(this, binding, endPoint); 
m_IProcessingNodeControl = m_Channel.CreateChannel(); 

Я проверил мой брандмауэр около десятка раз, но я предполагаю, что может быть что-то я м Иссингом. Пробовал отключить брандмауэр Windows. Я попытался изменить localhost на свой ipv4-адрес, чтобы попытаться держаться подальше от ipv6, я попытался удалить любой анти-ipv6-код.

Не знаю, если это означает что-нибудь, но:

Microsoft Telnet> открытая 10.7.11.14 18297
Подключение к 10.7.11.14 ... Не удалось открыть подключение к узлу, на порт 18297 : Соединиться не удалось

Тесты telnet, к сожалению, похоже, не являются ключевыми. Я успешно подключился к порту моей службы с локального хоста и удаленного компьютера, когда служба работает, но мой клиент не работал с удаленного компьютера.

Похоже, что подключение к localhost не всегда гарантируется. Рабочий стол (win7/32) работает, ноутбук (win7/64) не работает. Однако другие боксы win7/64 работают. Возможно, из-за нескольких ноутбуков на ноутбуке? Также не объясняет сбоев подключения к системам тестировщиков.

Я установил две машины win7 с полностью отключенным IPv6 (используя 0xffffffff, как в http://support.microsoft.com/kb/929852). Нет помощи.

+0

Просто у меня был модный момент лба. У потребителя контракта IScheduler нет проблем с работой на машинах. Клиенты IProcessingNodeControl не подключаются. Они используют практически идентичный код для подключения. Сейчас я думаю, что у них должны быть разные относительные URL-адреса, но это, похоже, не помогает. – Thomas

+0

Итак, я могу наблюдать, как мой клиент терпит неудачу, не удается, не удается подключиться, а затем отключить брандмауэр Windows, и это удается. У моего приложения для хостинга уже есть исключение, что еще нужно для исключения? – Thomas

+1

Net.TCP конечно! – Thomas

ответ

2

У меня нет времени вернуться и проверить, является ли это комбинацией помощи, полученной мной от лиго, или нет, но основное исправление, по-видимому, добавляет SMSvcHost.exe в исключения из брандмауэра Windows.

Большое спасибо за помощь, лиго. Я был готов отказаться, пока вы не ответили на мой вопрос.

Инструкции по добавлению Net.Tcp в брандмауэре Windows:

  1. Перейти к службам, найти службу обмена Net.Tcp порта, и дважды щелкните по нему. Проведите по пути к исполняемому файлу (не волнуйтесь, если это не все на экране, действие прокрутки должно прокрутить его) и скопируйте его (ctrl-c)
  2. Перейдите на свой брандмауэр и добавьте новую программу, позволяющую общаться через брандмауэр Windows. Вставьте путь из Сервиса и нажмите ОК.
+0

Я предполагаю, что SMSvsHost.exe - это процесс, который делает магию обмена портами Net.TCP. Рад, что он работает на вас. – ligos

2

Что-то не похоже на ваш базовый адрес хоста, а затем на адреса конечной точки. У одного есть явная ссылка на порт, а другая нет. Обычно, когда вы используете базовый адрес, вы используете относительный URL-адрес в адресе конечной точки.

Не могу понять, почему это было бы связано с IPv6, потому что ни одно из сообщений об ошибках не упоминает адреса IPv6.

Возможно, повторите попытку после отключения опции совместного использования портов net.tcp. Без совместного использования портов вы должны иметь возможность подключить соединение с помощью telnet, как и вы.

Также, как ваш сервис размещен в Win7?В IIS7 или самостоятельно размещен в службе Windows? Для его размещения в Сервисе могут потребоваться некоторые разрешения, предоставляемые вашему exe за пределами открытия портов на вашем брандмауэре (например, вам иногда приходится делать для Windows сервис в HTTP в Win XP).

Извините, я спешу и не могу найти URL-адреса для них.

+0

спасибо за отзыв, я буду играть с адресами завтра. Это самообслуживаемая служба в приложении, которое запускается пользователем, запущен как администратор. Он живет в системном трее. – Thomas

+0

Ну, вы конкретно не решили мою проблему, но переход на относительные пути действительно подчеркнул тот факт, что/Scheduler использовался для двух разных контрактов, и это казалось странным. Я изменил второй на/NodeControl и работал над моей установкой dev! Интересно, почему он работает на XP, а не на Win7. Благодаря! – Thomas

+0

Ну, развернуто для тестирования, и все хуже. Клиенты планировщика и клиенты NodeControl не могут подключаться, если сервер не находится на локальном хосте. – Thomas

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

  • Нет связанных вопросов^_^