WCF использует имя компьютера вместо IP-адреса и не может быть разрешено - PullRequest
8 голосов
/ 28 июля 2011

У меня есть служба WCF, которая отлично работает в локальной сети, но при попытке доступа к ней извне ссылка на службу завершается неудачно.

Моя служба WCF размещена на коробке win2k3, которая использует статический IP без домена.

Ответы [ 5 ]

15 голосов
/ 26 января 2012

Вот что у меня сработало.В конфигурационном файле

< serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
< / system.serviceModel >

Если для него установлено значение false, я получаю эту сумасшедшую замену имени компьютера.

multipleSiteBindingsEnabled="true", кажется, все, что мне нужно сделать, чтобы это работало как надо.

4 голосов
/ 11 ноября 2013

Я искал подход к повторному использованию заголовка Host из HTTP-запроса. На мой взгляд, это должно работать как в разработке, так и в производстве.

Получается так же просто, как:

<behaviors>
    <serviceBehaviors>
       <behavior name="...">
         ...
         <useRequestHeadersForMetadataAddress />
       </behavior>
    </serviceBehaviors>
</behaviors>

Таким образом, если конечная точка WSDL доступна клиенту, это гарантирует, что все связанные ресурсы wsdl / xsd будут доступны с одинаковым базовым URL.

3 голосов
/ 02 августа 2011

Я нашел ответ на это после некоторого копания - вот то, что я нашел, надеюсь, это может сэкономить кому-то еще время и беспокоить.

1.) Добавьте IP к адресу конечной точки и добавьте хостимя с базовым IP-адресом, например, так:

<endpoint
  address="http://xx.xx.xx.xx/ServiceApp/Service.svc"
  binding="basicHttpBinding" contract="IService">
</endpoint>
<host>
  <baseAddresses>
    <add baseAddress="http://xx.xx.xx.xx/ServiceApp/" />
  </baseAddresses>
</host>

Этого было достаточно, чтобы заставить мою справочную службу работать, но диско-файл начал возвращаться с именем компьютера вместо ip (думаю, это было послеобновление до .NET 4.0).

2.) Если у вас есть доменное имя (www.myDomain.com), добавьте его в заголовок узла в IIS.

3.) ДобавьтеIP-адрес и имя компьютера для файла хостов клиентов (однако, не всегда легко заставить всех ваших клиентов добавить это в свой файл хоста)

4.) НАИЛУЧШЕЕ РЕШЕНИЕ, которое я нашел, заключалось в реализации ServiceHostsАтрибут фабрики в соответствии с постом «Timetheos» здесь: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c7fd51a2-773e-41d4-95a0-244e925597fe

Это хорошо сработало для меня, так как я мог тестировать разработку и отладку своей сервисной библиотеки локально, а затем использовать сервисное приложение для развертывания сервиса вy dev server и ему не нужно было менять какие-либо конфигурационные файлы после публикации.

Весь этот процесс был полным кошмаром, и я бы никому этого не пожелал, так что если вы находитесь в такой же ситуации и вам нужна дополнительная информацияПо указанным выше пунктам просто свяжитесь!

2 голосов
/ 11 октября 2014

Вы можете использовать звездочку * (подстановочный знак) вместо LocalHost или имя машины в базовом URL следующим образом:

<add baseAddress="net.tcp://*:4502/WxWcfService_01" />
0 голосов
/ 22 октября 2013

Установите конечную точку службы и httpgeturl следующим образом.

<services>
    <service behaviorConfiguration="serviceBehaviour" name="Demo.Service.MultiEndPointsService">
        <endpoint address="http://192.168.1.2/Demo.Service/MultiEndPointsService.svc/basic" binding="basicHttpBinding" bindingConfiguration="basicBinding"      contract="Demo.Service.MultiEndPointsService" />
    </service>
</services>
<behaviors>
    <serviceBehaviors>
        <behavior name="serviceBehaviour">
            <serviceMetadata httpGetEnabled="true" httpGetUrl="http://192.168.1.2/Demo.Service/MultiEndPointsService.svc/basic"/>     
            <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
    </serviceBehaviors>
</behaviors>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...