Смущает использование имени хоста в файле WSDL в C # Web Service - PullRequest
6 голосов
/ 01 июня 2011

Я создал веб-службу WCF на C #, развернутую в EXE-файле Windows Service, которая работает в основном так, как я хочу.Я использую его самостоятельно (не в IIS).

Чтобы сделать файл WSDL доступным для вызывающего веб-сервиса Java, я добавил ServiceMetadataBehavior для создания хоста.то есть:

ServiceHost host = new ServiceHost(typeof(MyService));
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.Open();

Это все работало нормально, пока я не перенес свою службу на другой сервер с другим именем хоста.Когда я подключаюсь к WSDL (http://prod -сервер: 55000 / MyService? Wsdl), я вижу, что имя хоста сервера разработки жестко закодировано в WSDL.

Вот фрагмент WSDL, видимый в браузере:

<wsdl:definitions name="MyService" targetNamespace="http://tempuri.org/">
<wsdl:import namespace="MyProject.ServiceContracts" location="http://dev-server:55000/MyService?wsdl=wsdl0"/>
<wsdl:types/>

Я проверил весь код C # в проекте, и имя сервера разработки нигде не задано жестко.

В файле App.config я определил следующее:

<system.serviceModel>
<services>
  <service name="MyService">
    <endpoint address="http://localhost:55000/MyService" binding="basicHttpBinding"
      bindingConfiguration="" contract="MyProject.ServiceContracts.IMyInterface" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:55000/MyService" />
      </baseAddresses>
    </host>
  </service>
</services>

Я ожидал бы, что это приведет к замене имени машины localhost,но оно сохраняется как имя блока разработки, на котором сервис был изначально создан / развернут.Я ошибаюсь?

Я также изучал возможность явного указания пути к моему WSDL-файлу, но из того, что я могу сделать вывод, это можно сделать только при размещении службы на IIS.

И наконец, просто из любопытства, мне интересно, действительно ли создается настоящий файл WSDL (я имею в виду физический файл на диске) или он динамически отображается с каждым запросом?

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Создается динамически не при каждом вызове IIRC, а по первому запросу к конечной точке метаданных.Я не уверен, почему вы видите имя вашего сервера DEV на компьютере, не являющемся устройством DEV, но, поскольку вы указываете localhost только в адресе конечной точки, он разрешает DNS, используя основной сетевой адрес сервера.Возможно, вы захотите добавить в свою конфигурацию поведение useRequestHeadersForMetadataAddress, чтобы вместо него фактически использовался DNS, с помощью которого осуществляется доступ к службе.

3 голосов
/ 01 июня 2011

С WCF динамически генерируется WSDL.

Я неоднократно сталкивался с этой проблемой в службе WCF 3 / 3.5, когда мне нужно было отправить WSDL кому-либо в виде файла.Обычно я сохраняю файлы (обычно их 3, wsdl для службы, xsd для ваших типов и xsd для типов .net, но пробег может отличаться), а затем вручную обновляет импорт wsdl для справки.другие два файла, относящиеся к файлу wsdl, затем отправьте все три файла.

wsdl:service, wsdl:port и soap:address по-прежнему будут ссылаться на сервер dev, но большинство клиентских библиотек ws для этогои позволить разработчику настроить конечную точку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...