Хостинг WCF: можно получить доступ к svc файлу, но не может перейти на wsdl-ссылку

У меня есть служба WCF, размещенная в IIS 7.5. У меня два сервера, один для тестирования и один для производства.

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

Когда я обращаюсь к адресу http//..../service.svc, я вижу страницу по умолчанию, в которой говорится:


Вы создали службу.

Чтобы протестировать эту услугу, вам необходимо создать клиента и использовать его для вызова службы. Это можно сделать с помощью инструмента svcutil.exe из командной строки с помощью следующего синтаксиса:

svcutil.exe http://..../service.svc?wsdl

Это приведет к созданию файла конфигурации и файла кода, который содержит класс клиента. Добавьте два файла в клиентское приложение и используйте сгенерированный клиентский класс для вызова Сервиса.


Но когда я нажимаю ссылку wsdl, я не могу перейти на страницу wsdl. Он возвращает меня на эту веб-страницу по умолчанию без каких-либо ошибок. Я подозреваю ошибку авторизации сети/брандмауэра, но есть ли у кого-нибудь подобный опыт?

Все настройки IIS одинаковы для тестовых и производственных серверов.

Спасибо, с наилучшими пожеланиями.

Ответы

Ответ 1

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

  • поведение службы, которое позволяет метаданные службы
  • установите httpGetEnabled = True в отношении поведения метаданных службы, чтобы разрешить HTTP-просмотр этих метаданных
  • конечная точка mex на вашем сервисе

Таким образом, ваша конфигурация на стороне сервера может выглядеть примерно так (плюс немного больше):

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MetadataBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service behaviorConfiguration="MetadataBehavior" name="YourService">
        <endpoint address="" 
                  binding="basicHttpBinding" 
                  contract="IYourService" />
        <endpoint address="mex" 
                  binding="mexHttpBinding" 
                  contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

Точки 1 и 2 обрабатываются этой строкой здесь:

<serviceMetadata httpGetEnabled="true" />

Вам нужно ссылаться на это поведение службы в тэге <service>, чтобы он стал активным.

Пункт 3 (конечная точка MEX) здесь:

<endpoint address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange" />

Для http используйте mexHttpBinding и IMetadataExchange контракт - это системный контракт WCF для обмена метаданными.

Ответ 2

была та же проблема. я исправил его, добавив httpsGetEnabled для serviceBehaviors > поведение, подобное этому:

<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>

Может быть, это помогает кому-то другому. не думаю, что вам нужен этот намек после 4years =)

Ответ 3

Я знаю, что это так поздно, но у меня была та же проблема, и решение было:

Добавьте теги [ServiceContract] и [OperationContract] на интерфейс, который реализован в сервисе .svc. Visual Studio создает интерфейс при выборе WCF Service, но я удалил интерфейс, и я создал свой собственный интерфейс.

[ServiceContract]
public interface IService1
{
    [OperationContract]
    void DoWork();
}

Я надеюсь помочь кому-то.

Ответ 4

Да, проблема заключается в публикации метаданных. Просто добавьте еще несколько советов. Вы также можете добавить метаданные службы с помощью кода, например:

ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;

host.Description.Behaviors.Add(smb);

Подробнее здесь: http://msdn.microsoft.com/en-us/library/aa738489%28v=vs.110%29.aspx