Обнаружение WCF находит конечную точку, но адрес является localhost - PullRequest
1 голос
/ 17 сентября 2010

У меня есть обнаруживаемая служба wcf под названием «GetNameService», которая размещена на ПК 10.0.0.5:8732.Он размещается с помощью wsHttpBinding и доступен для обнаружения через UdpEndpoint.У меня также есть клиент @ 10.0.0.9, который обнаруживает такие службы в той же сети.Когда я запустил клиент, я смог обнаружить сервис, но конечной точкой обнаруженного сервиса был локальный хост.Как это может произойти, пожалуйста, помогите мне в этом.

Дополнительная информация,

Используется App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

 <system.web>
  <compilation debug="true" />
 </system.web>
 <!-- When deploying the service library project, the content of the config file must be added to the host's
 app.config file. System.Configuration does not support config files for libraries. -->
 <system.serviceModel>
  <services>
   <service name="NameService.GetNameService">
    <host>
     <baseAddresses>
      <add baseAddress = "http://10.0.0.5:8732/Design_Time_Addresses/NameService/GetNameService/" />
     </baseAddresses>
    </host>
    <!-- Service Endpoints -->
    <!-- Unless fully qualified, address is relative to base address supplied above -->
    <endpoint address ="" binding="wsHttpBinding" contract="NameService.IGetNameService">
     <!--
       Upon deployment, the following identity element should be removed or replaced to reflect the
       identity under which the deployed service runs. If removed, WCF will infer an appropriate identity
       automatically.
     -->
     <identity>
      <dns value="localhost"/>
     </identity>
    </endpoint>
    <!-- Metadata Endpoints -->
    <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. -->
    <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
   </service>
  </services>
  <behaviors>
   <serviceBehaviors>
    <behavior>
     <!-- To avoid disclosing metadata information,
     set the value below to false and remove the metadata endpoint above before deployment -->
     <serviceMetadata httpGetEnabled="True"/>
     <!-- To receive exception details in faults for debugging purposes,
     set the value below to true. Set to false before deployment
     to avoid disclosing exception information -->
     <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
 </system.serviceModel>

</configuration>

Я открыл браузер на клиентском компьютере и набрал адрес службы, я вижу службустраница сведений, но ссылка wsdl указывает на localhost (показан ниже)

svcutil.exe http://localhost:8732/Design_Time_Addresses/NameService/GetNameService/?wsdl

вместо

svcutil.exe http://10.0.0.5:8732/Design_Time_Addresses/NameService/GetNameService/?wsdl

Кроме того, такое же приложение, кажется, работает на моем рабочем месте, где есть доступный DNS, и системы подключаются через коммутатор, где, поскольку это не работает в моем доме, где устройстваподключите через роутер.Может ли это что-то повлиять?!?

Обновление Оно не работает в IIS, оно размещается через обычное консольное приложение

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

Решено в коде (для соединения tcp.net) с помощью.

// Add discovery feature.
m_Host.AddServiceEndpoint(new Discovery.UdpDiscoveryEndpoint());
m_Host.Description.Behaviors.Add(new Discovery.ServiceDiscoveryBehavior());
// Add ordinary service feature
var binding = new NetTcpBinding();
binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
m_Host.AddServiceEndpoint(
        typeof(IMyServiceContract),
        new NetTcpBinding(SecurityMode.None),
        new UriBuilder { Scheme = Uri.UriSchemeNetTcp, Port = 8732, Host = "10.0.0.5" , Path = "MyServiceContractPath" }.Uri
        );

Единственная (возможно, меньшая) проблема, которая остается, - это какой IP-адрес компьютера установить в качестве хоста ...Введенный Uri - это тот, который возвращается в ответе DiscoveryClient.Find (...).

1 голос
/ 17 сентября 2010

Если вы работаете в IIS, для вашего сайта должно быть правило имени хоста по умолчанию:

  1. Открыть IIS
  2. Щелкните правой кнопкой мыши на своем веб-сайте и выберите «Свойства»
  3. Перейдите на вкладку «Веб-сайт», а затем нажмите кнопку «Дополнительно» под заголовком «Идентификация веб-сайта»
  4. У вас должен быть идентификатор по умолчанию для веб-сайта (TCP-порт 8732). Отредактируйте это и убедитесь, что значение заголовка хоста является доменным именем для вашего сайта (поэтому оно должно быть www.yourdomain.com)

Подробнее см. http://forums.asp.net/p/1096811/1659596.aspx.

0 голосов
/ 21 января 2011

Если вам все еще нужно это, оказывается, вы можете просто использовать подстановочный знак в baseAddress:

<add baseAddress = "http://*:8732/Design_Time_Addresses/NameService/GetNameService/" />
...