Служба WCF в среде https

Я создал и протестировал службу WCF, все работает нормально.

Когда я развернулся в среде TEST и попытался открыть https://my.site/myapp/EnrollmentService.svc У меня появилось сообщение об ошибке:

Не удалось найти базовый адрес, который соответствует схеме http для конечной точки с привязкой MetadataExchangeHttpBinding. Схемы зарегистрированных базовых адресов: [HTTPS].

Интернет показал мне, что мне нужно добавить еще несколько вариантов конфигурации:

http://www.codeproject.com/KB/WCF/7stepsWCF.aspx

Я добавил некоторые настройки для обслуживания файла web.config. Теперь это выглядит следующим образом:

<system.serviceModel>
<services>
  <service name="McActivationApp.EnrollmentService" behaviorConfiguration="McActivationApp.EnrollmentServicBehavior">
    <endpoint 
      address="https://my.site/myapp/EnrollmentService.svc"
      binding="basicHttpBinding"
      bindingConfiguration="TransportSecurity"
      contract="McActivationApp.IEnrollmentService"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="McActivationApp.IEnrollmentService" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="McActivationApp.EnrollmentServicBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <basicHttpBinding>
    <binding name="TransportSecurity">
      <security mode="Transport">
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

Собственно, я добавил раздел "привязки" и указал его для моей конечной точки.

Но это ничего не изменило...

Просьба сообщить, что мне нужно делать. Большое спасибо!

P.S. Существуют ли различия в потреблении WCF от https и ресурсов http?

Ответ 1

Если вы хотите показывать свою услугу только через HTTPS (сайт вообще не поддерживает HTTP), вы не можете использовать что-либо, зависящее от HTTP. Ваша текущая конфигурация предоставляет справочную страницу по HTTP, а также mex endpoing (с неправильным контрактом) по HTTP. Поэтому попробуйте следующее:

<system.serviceModel> 
  <services>   
    <service name="McActivationApp.EnrollmentService" behaviorConfiguration="McActivationApp.EnrollmentServicBehavior">     
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="TransportSecurity" contract="McActivationApp.IEnrollmentService"/>     
      <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />   
    </service> 
  </services> 
  <behaviors>   
    <serviceBehaviors>     
      <behavior name="McActivationApp.EnrollmentServicBehavior">         
        <serviceMetadata httpsGetEnabled="True"/>       
        <serviceDebug includeExceptionDetailInFaults="False" />     
      </behavior>   
    </serviceBehaviors> 
  </behaviors> 
  <bindings>   
    <basicHttpBinding>     
      <binding name="TransportSecurity">       
        <security mode="Transport">         
          <transport clientCredentialType="None" />       
        </security>     
      </binding>   
    </basicHttpBinding> 
  </bindings> 
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />      
</system.serviceModel>

Ответ 2

У вас есть конечная точка метаданных http, которая должна быть изменена на https, как показано ниже.

<serviceMetadata httpsGetEnabled="True"/>  

Также, если это не необходимо, вы должны удалить конечную точку метаданных mex и https из производства в качестве лучшей практики.

Ответ 3

Чтобы устранить проблему, разрешив HTTP, вам нужно добавить привязку http в IIS:

  • Перейдите на ваш сайт в IIS
  • Нажмите "Привязки..." на панели "Действия" справа.
  • Нажмите "Добавить"
  • Выберите "http" и "ОК".

В качестве альтернативы вы можете предотвратить проблему путем удаления строки или изменения:

<serviceMetadata httpGetEnabled="True"/>

в

<serviceMetadata httpsGetEnabled="True"/>