2010-09-17 5 views
1

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

Некоторые больше информации,

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 ссылка указывает на локальном хосте (как показано ниже)

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 доступна и система подключения через»коммутатор, где, как он не работает в моем дома, где ПК подключаются через «маршрутизатор». Может ли это повлиять на что-то?!?

Update Это не работает в IIS, она прошла через»обычное приложение консоли

ответ

1

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

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

См. http://forums.asp.net/p/1096811/1659596.aspx из более подробной информации.

+0

Он не размещен на IIS, размещенных через»консольное приложение – sudarsanyes

0

Решил его в коде (для подключения 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, чтобы установить в качестве принимающей стороны ... Ури вошел тот, который возвращается в ответ DiscoveryClient.Find (...).

0

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

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

я не могу использовать это в коде при выполнении 'new ServiceHost (typeof (MyService), новый Uri ('http: // *: 8080/MyService'));'. Он говорит, что имя хоста не может быть проанализировано. Какие-либо предложения? –

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