Я потратил много времени на то, как настроить мои службы WCF, чтобы они работали на https в рабочей среде.
В принципе, мне нужно было сделать это:
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
<service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior">
<endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="HttpsBinding">
<security mode="Transport">
<transport clientCredentialType="None"></transport>
</security>
</binding>
</basicHttpBinding>
</bindings>
Добавление атрибута bindingNamespace
к конечной точке - последнее, что заставило его работать.
Но эта конфигурация не работает в моей локальной среде, где я работаю под обычным http. Итак, моя конфигурация:
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
<service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior">
<endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/>
</service>
</services>
Различия здесь в том, что я установил атрибут httpsGetEnabled
в значение false, и я удалил bindingConfiguration и bindingNamespace.
Проблема заключается в следующем: как создать один блок конфигурации, который обрабатывает BOTH?
Мне очень жаль, что каждый раз, когда я делаю релиз, приходится делать много специальных изменений в конфиге. Да, я знаю, что у меня может быть задача пост-сборки, которая автоматически изменяет значения, но я хотел бы объединить конфигурации, если это возможно.
Я пробовал что-то вроде этого:
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
<service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior">
<endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/>
<endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="HttpsBinding">
<security mode="Transport">
<transport clientCredentialType="None"></transport>
</security>
</binding>
</basicHttpBinding>
</bindings>
Я полагал, что включение обеих конечных точек даст ему два варианта поиска при активации службы. Однако это не работает. Я получаю эту ошибку:
Не удалось найти базовый адрес, соответствующий схеме https для конечной точки со связыванием BasicHttpBinding. Схемы зарегистрированных базовых адресов: [http].
От взгляда вокруг SO и остальной части Интернета, похоже, что у других были проблемы с убийством этого дракона.