Браузер подключается к службе WCF, но не к моему клиенту WCF. В чем может быть причина?
На рабочем сервере (Windows Server 2003 с пакетом обновления 2) я могу подключиться к удаленной службе WCF с помощью Internet Explorer 8: при переходе по URL-адресу http://www.domain.com/Service.svc (где прослушивает моя служба) я получаю ожидаемая информационная страница сервиса отображается. В настройках подключения в Internet Explorer указывается только "автоопределение", настройки прокси отключены.
Если я запускаю консольное приложение (созданное с WCF в.NET 4.0) на том же сервере, который также пытается подключиться к той же службе WCF, то мне не удается сообщить, что конечная точка недоступна для прослушивания на http://www.domain.com/Service.svc.
Конфигурация клиента WCF:
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IMyService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false"
hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://www.domain.com/Service.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMyService"
contract="Service.IMyService" name="WSHttpBinding_IMyService" />
</client>
</system.serviceModel>
<configuration>
С этими настройками я могу успешно обмениваться данными с удаленным сервисом с моей машины разработки.
Просматривая другие варианты, я обнаружил, что могу указать, использовать ли параметры прокси-сервера Internet Explorer с:
<system.net>
<defaultProxy>
<proxy usesystemdefault="true" />
</defaultProxy>
</system.net>
Это не сработало, и я не уверен, правильно ли я понял этот параметр. (Я надеялся, что клиент WCF примет настройку "автоопределение" Internet Explorer, а затем подключится к службе таким же образом, как установленный IE.)
Я также должен был переключить useDefaultWebProxy
установка в конфигурации привязки между истиной и ложью без успеха.
Теперь я прошу помощи, что я могу сделать? Какие настройки могут быть неправильными или отсутствующими? Что я могу проверить и как получить более подробные сообщения об ошибках, чтобы лучше определить проблему?
Заранее спасибо!
Редактировать:
Стек в Innerexception
говорит:
- System.Net.WebException: не удалось установить соединение с удаленным сервером
- System.Net.Sockets.SocketException: не удалось установить соединение, так как хост не ответил через определенный промежуток времени или соединение было прервано, так как подключенный хост не ответил.
4 ответа
Хотя Internet Explorer может подключаться к службе без указания прокси-адреса, но только с включенной функцией "автоопределение", это не работает с моим клиентом WCF при настройке <proxy usesystemdefault="true" />
, (Документация гласит: это подберет настройки Internet Explorer. Но это не работает.) Наконец, клиент дал мне конкретный прокси-адрес, и я изменил привязку в своей конфигурации клиента следующим образом:
- Изменен:
useDefaultWebProxy="false"
(вместоtrue
) - Добавлено:
proxyAddress="http://10.20.30.40:8080"
(Edit2: не только IP-адрес! Префикс сhttp://
это важно! В противном случае будут возникать новые исключения, см. Следующий вопрос ниже.)
При этом WebException и SocketConnection исчезли, и клиент, похоже, подключился к службе, но у меня возникла следующая проблема при вызове первой операции службы. Я поставлю это в новом вопросе.
Изменить: Вот следующий вопрос:
Странное исключение при подключении к службе WCF через прокси-сервер
Edit2: в соответствии с ответом в последующем вопросе важно поставить префикс proxyAddress
с http
, (изменил мой ответ сейчас)
Проблема здесь, возможно, была так же проста, как и в случае истинного против истинного
<proxy usesystemdefault="True" />
Возможно, вы просто ввели опечатку в свой адрес на клиенте?
address="http://www.domain.com/Service.scv"
Разве это не должно быть
address="http://www.domain.com/Service.svc"
(.svc вместо.scv в конце) (подтверждено, что в действительности это не опечатка)
Кроме того, этот адрес будет означать, что ваш файл *.svc находится в корне этой машины - так ли это на самом деле? Обычно в IIS ваш адрес будет состоять из имени машины, виртуального каталога, в котором находится файл *.svc, и самого файла *.svc, поэтому что-то вроде:
http://www.domain.com/ServiceDirectory/Service.svc
Я не уверен, как вы размещаете свой сервис, IIS?
Я не видел ничего плохого на самом деле в конфигурации, кроме
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"/>
</security>
Если вы говорите, что когда вы вводите адрес в IE, вы видите сервис, то это наводит меня на мысль, что неправильные настройки безопасности. Попробуйте снять блокировку безопасности с конфигурационного файла клиента или там, где он у вас есть, и посмотрите, работает ли он....
Если это произойдет, мы могли бы сузить это...