2016-04-12 2 views
9

Я пытаюсь использовать https & http для сайта. На веб-сайте есть файлы .svc, которые действуют как служба REST и вызывают из JavaScript.WebHttpBinding с Http и Https

Моя конфигурация:

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="AjaxBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceBehaviour"> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceMetadata httpGetEnabled="True" httpsGetEnabled="true"/>   
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    <services> 
     <service behaviorConfiguration="MyServiceBehaviour" name="MyService.Lookups"> 
     <endpoint address="" behaviorConfiguration="AjaxBehavior" 
      binding="webHttpBinding" bindingConfiguration="httpWebBinding" contract="MyService.Lookups" >   
     </endpoint> 
     <endpoint address="" behaviorConfiguration="AjaxBehavior" 
      binding="webHttpBinding" bindingConfiguration="httpsWebBinding" contract="MyService.Lookups" >   
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <bindings>  
     <webHttpBinding> 
     <binding name="httpsWebBinding"> 
      <security mode="Transport"> 
      <transport clientCredentialType="None" proxyCredentialType="None" /> 
      </security> 
     </binding> 
     <binding name="httpWebBinding"> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" /> 
      </security> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    </system.serviceModel> 

просмотр https://myserver/services/Lookups.svc/Hello дает

Не удалось найти базовый адрес, который соответствует схеме HTTP для конечной точки, с обязательным WebHttpBinding. схемы Registered базовые адреса являются [HTTPS]

просмотр http://myserver/services/Lookups.svc/Hello дает

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

Если я удаляю любую конечную точку, она работает. Пример удаления конечной точки, сконфигурированной с помощью bindingConfiguration="httpWebBinding", работает для HTTPS,

Как мне заставить работать с HTTP и HTTPS? На данный момент я могу использовать либо http, либо https, удалив одну конечную точку.

Приглашен How can I combine the WCF services config for both http and https in one web.config? и How do you setup HTTP and HTTPS WCF 4 RESTful services?

Примечание: В IIS, это два веб-сайтов, один прослушивает HTTP, а другой на HTTPS. Оба обмен и тот же код в физической папке

UPDATE: как сейчас, я удалил конечные точки, и это работает. Но мое беспокойство заключается в удалении endpoing, настроенного с помощью behaviourConfiguration, не очень отличное решение для меня.

Это работает как для HTTP & HTTPS

<services> 
     <service behaviorConfiguration="MyServiceBehaviour" name="MyService.Lookups"> 

     </service> 
    </services> 
+1

с 'httpsGetEnabled =" true "' должен быть URL-адрес 'https', но вы не определили его. –

ответ

4

Я воссоздал свой сценарий и использовать свой web.config для настройки конечных точек для моей тестовой службы. Ваша конфигурация в порядке и работает правильно. Часть, которая не работает для вас, вероятно, является вашей конфигурацией https в IIS. Убедитесь, что вы включили https-доступ к вашему сервису. Если вы проверите его с помощью IISExpress из Visual Studio, щелкните левой кнопкой мыши по проекту и в окне свойств (Вид -> Окно свойств) выберите для SSL Enabled = True.

+0

Да. На сервере мы создали привязку «https» и разместили самоподписанный сертификат. Поскольку мы не используем взаимную аутентификацию, мы не включили флаг 'RequireSSL' в настройках SSL в IIS 8.5 – Billa

0

Как отметил в своем ответе @Lesmian, проблема заключается в конфигурации IIS. Более конкретно в:

Примечание: В IIS, это два веб-сайтов, один прослушивает HTTP, а другой на протокол HTTPS. Оба обмена одним и тем же кодом в физической папке

Причина в том, что IIS не может обрабатывать конечные точки схемы, которую он не поддерживает.

У вас есть два сайта, один из которых имеет HTTP-привязку, но не имеет HTTPS, а другой - HTTPS, но не HTTP.

Так что, когда вы просматриваете в HTTP: // URL, IIS направляет вас к HTTP с поддержкой сайта, читает web.config, видит, что он регистрирует HTTPS конечную точку (которая не поддерживается (сюрприз!) сайт) и выдает исключение, указывающее, что нет https поддержка схемы на сайте http -enabled.

При просмотре на https: // URL ситуация аналогична - IIS не позволяет использовать HTTP конечной точки на HTTPS -Enabled-единственный сайт.

Для решения проблемы лучше использовать один сайт с двумя привязками.

Другой (и более сложный) вариант будет использовать различные web.configs для сайтов: созданы отдельные сайты (указали на отдельные папки) и использовать публикации и web.config преобразующие инструменты в Visual Studio

0

Если обновить свою конечную точки конфиги, как например:

 <endpoint address="http://myserver/services/Lookups.svc" behaviorConfiguration="AjaxBehavior" 
      binding="webHttpBinding" bindingConfiguration="httpWebBinding" contract="MyService.Lookups" >   
     </endpoint> 
     <endpoint address="https://myserver/services/Lookups.svc" behaviorConfiguration="AjaxBehavior" 
      binding="webHttpBinding" bindingConfiguration="httpsWebBinding" contract="MyService.Lookups" >   
     </endpoint> 

Я сделал подобный танец с системой прода, и это было моим решением. Надеюсь, это сработает и для вас.

0

Добавить этот код.

<protocolMapping> 
    <add scheme="http" binding="webHttpBinding" bindingConfiguration="httpWebBinding"/> 
    <add scheme="https" binding="webHttpBinding" bindingConfiguration="httpsWebBinding"/> 
</protocolMapping> 
Смежные вопросы