Хостинг 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