Я потратил много времени на выяснение того, как настроить мои службы 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.
Проблема в том, что: как создать один блок конфигурации, который обрабатывает ОБА?
Мне очень не хочется делать много специальных изменений в конфигурации каждый раз, когда я делаю релиз. Да, я знаю, что у меня может быть задача после сборки, которая автоматически меняет значения, но я бы хотел объединить конфиги, если это возможно.
Я пробовал что-то вроде этого:
<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 и остального интернета выяснилось, что у других были проблемы с убийством этого дракона.