IIS WCF Config: служба использует только поведение по умолчанию
Я узнаю о развертывании WCF в IIS и обнаружил нечто странное. В основном мой сервис использует только поведение по умолчанию, независимо от того, как я установил атрибут поведенческого конфигурирования элемента в web.config.
Итак, вот соответствующая часть моего web.config:
<system.serviceModel>
<services>
<service name="TableImport" behaviorConfiguration="MyServiceTypeBehaviors">
<endpoint address="" binding="wsHttpBinding" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="false" />
</behavior>
<behavior name="MyServiceTypeBehaviors" >
<serviceMetadata httpGetEnabled="true" policyVersion="Policy15" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Как вы видите, элемент serviceMetadata по умолчанию имеет httpGetEnabled="false", тогда как элемент serviceMetadata MyServiceTypeBehaviors имеет httpGetEnabled="true". Вы также можете видеть, что для атрибута поведение Configuration моей службы установлено значение "MyServiceTypeBehaviors".
В результате мой сервис публикует метаданные, но через браузер и функцию "Добавить ссылку на сервис" в Visual Studio я получаю тот же результат: никаких метаданных.
С другой стороны, если я включаю метаданные в поведении по умолчанию и отключаю их в "MyServiceTypeBehaviors" и продолжаю использовать мой сервис MyServiceTypeBehaviors, то я получаю метаданные как через браузер, так и через VS.
Для меня эти тесты показывают, что мой сервис использует поведение по умолчанию независимо от того, как я настроил свой конфигурационный файл... но в то же время я могу изменить поведение по умолчанию через web.config, так что мой web.config действительно может влиять как работает сервис Есть идеи?
2 ответа
Вы не указываете контракт в своей конечной точке, поэтому без контракта конечная точка не будет знать, какую службу она использует.
Если вы используете.NET 4.0 или более позднюю версию (и, исходя из описанных вами проблем, это звучит так, как вы), вы фактически подключаетесь к конечной точке по умолчанию, которая основана на адресе службы. Конечная точка по умолчанию предоставляется платформой.
Таким образом, он будет использовать поведение службы по умолчанию. Это соответствует вашему описанию проблемы:
- Когда для httpGetEnabled поведения по умолчанию установлено значение false, метаданные не отображаются. - Когда для httpGetEnabled поведения по умолчанию установлено значение true, вы получаете метаданные.
Самое простое решение в этой ситуации - просто добавить контракт к конечной точке, которую вы пытаетесь определить:
<endpoint address="" binding="wsHttpBinding" contract="FullyQualified.IContractName" />
Вам необходимо добавить конечную точку "метаданные" или "MEX". Измените раздел служб вашей конфигурации, чтобы он выглядел следующим образом:
<services>
<service name="TableImport" behaviorConfiguration="MyServiceTypeBehaviors">
<endpoint address="" binding="wsHttpBinding" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>