Как настроить одну службу WCF для нескольких конечных точек HTTP и HTTPS? - PullRequest
9 голосов
/ 29 сентября 2010

То, что я пытаюсь сделать, - это заставить ЕДИНСТВЕННУЮ службу WCF работать в среде разработки, которая является схемой HTTP, а также, чтобы та же служба работала в рабочей среде, которая является схемой HTTPS. Если я удалю две конечные точки Https (с суффиксом Https), это сработает в среде разработки; аналогично, если я удаляю только две конечные точки Http, то это работает в производственной среде. Я хотел бы иметь все четыре конечные точки в файле web.config, если это возможно.

Мои конечные точки определены ниже:

<endpoint address="/Web" 
        behaviorConfiguration="AjaxBehavior"
        binding="wsHttpBinding" 
        bindingConfiguration="web" 
        name="Web"
        contract="Service" />
<endpoint address="/Custom"
        binding="customBinding" 
        bindingConfiguration="custom" 
        name="Custom"   
        contract="Service" />
<endpoint 
        address="/WebHttps" 
        behaviorConfiguration="AjaxBehavior"
        binding="wsHttpBinding" 
        bindingConfiguration="webHttps" 
        name="WebHttps"
        contract="Service" />
<endpoint address="/CustomHttps"
        binding="customBinding" 
        bindingConfiguration="customHttps" 
        name="CustomHttps" 
        contract="Service" />

Отредактировано: Я редактирую свой вопрос, чтобы добавить полученную ошибку и обязательные разделы (ниже). Извините за новую длину вопроса.

Ошибка: «Не удалось найти базовый адрес, который соответствует схеме http для конечной точки с привязкой WebHttpBinding. Зарегистрированные схемы базового адреса: [https].»

Кроме того, производственный сайт настроен на «Требовать SSL». Это не может измениться.

Конфигурации привязок:

<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"  />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="AjaxBehavior">
      <enableWebScript/>
    </behavior>
  </endpointBehaviors>
</behaviors>

<bindings>
  <customBinding>
    <binding name="custom">
      <textMessageEncoding>
        <readerQuotas maxDepth="7000000" maxStringContentLength="7000000"
            maxArrayLength="7000000" maxBytesPerRead="7000000"
            maxNameTableCharCount="7000000" />
      </textMessageEncoding>

      <httpTransport maxBufferPoolSize="7000000" maxReceivedMessageSize="7000000"
          maxBufferSize="7000000" />
    </binding>
    <binding name="customHttps">
      <textMessageEncoding>
        <readerQuotas maxDepth="7000000" maxStringContentLength="7000000"
            maxArrayLength="7000000" maxBytesPerRead="7000000"
                  maxNameTableCharCount="7000000" />
      </textMessageEncoding>

      <httpsTransport maxBufferPoolSize="7000000" maxReceivedMessageSize="7000000"
          maxBufferSize="7000000" />

    </binding>
  </customBinding>

  <webHttpBinding>
    <binding name="web"  maxBufferPoolSize="70000000"
        maxReceivedMessageSize="70000000">
      <readerQuotas maxDepth="70000000" maxStringContentLength="70000000"
          maxArrayLength="70000000" maxBytesPerRead="70000000"
          maxNameTableCharCount="70000000" />
      <security mode="None" />
    </binding>

    <binding name="webHttps" maxBufferPoolSize="70000000"
        maxReceivedMessageSize="70000000">

      <readerQuotas maxDepth="70000000" maxStringContentLength="70000000"
                maxArrayLength="70000000" maxBytesPerRead="70000000"
                maxNameTableCharCount="70000000" />

      <security mode="Transport" />
    </binding>
  </webHttpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

Есть идеи?

Ответы [ 5 ]

23 голосов
/ 29 сентября 2010

Выполните следующие действия -

1) Напишите две конечные точки для службы, одна для http и другая для https.

<services>
    <service behaviorConfiguration="MyServiceBehavior" name="JK.MyService">

      <endpoint address="" behaviorConfiguration="WebBehavior" binding="webHttpBinding" bindingConfiguration="webBinding" contract="JK.IMyService">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>

      <endpoint address="" behaviorConfiguration="WebBehavior" binding="webHttpBinding" bindingConfiguration="webBindingHTTPS" contract="JK.IMyService">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>     

    </service>
  </services>

2) Включить оба httpGetEnabled = "True" httpsGetEnabled = "true" в serviceBehaviors.

<behaviors>

<serviceBehaviors>      
  <behavior name="MyServiceBehavior">
    <serviceMetadata httpGetEnabled="True" httpsGetEnabled="true"/>
    <serviceDebug includeExceptionDetailInFaults="true" />
  </behavior>      
</serviceBehaviors>

<endpointBehaviors>
  <behavior name="WebBehavior">
    <webHttp/>
  </behavior>
</endpointBehaviors>

</behaviors>

3) Напишите две конфигурации привязок для http и https. Для http введите security mode = "None", а для https укажите mode = "Transport".

<bindings>
    <webHttpBinding>

      <binding name="webBinding">
        <security mode="None">
          <transport clientCredentialType="None" />
        </security>
      </binding>

      <binding name="webBindingHTTPS">
        <security mode="Transport">
          <transport clientCredentialType="None" />
        </security>
      </binding>

    </webHttpBinding>
  </bindings>

Проверить ссылку

3 голосов
/ 13 октября 2010

Если вы используете Visual Studio 2010 и развертывание проекта веб-приложения, вы можете использовать синтаксис преобразования Web.config, чтобы указать привязку конфигурации узла конечной точки службы к конфигурации привязки с поддержкой https.

Я понял, что мне нужно заменить только два элемента в файле Web.config. Атрибут bindingConfiguration конечной точки и httpsGetEnabled serviceMetadata должны быть установлены в true.

Вот Web.config в его конфигурации по умолчанию (отладка):

<service name="Service"
            behaviorConfiguration="DefaultBehavior">
    <endpoint name="ServiceEndpoint"
                binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding"
                contract="IService" />
    </service>
    ...
    <behaviors>
    <serviceBehaviors>
        <behavior name="DefaultBehavior">
            <serviceMetadata httpGetEnabled="True" />
            <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
    </serviceBehaviors>
</behaviors>

Вот файл преобразования Web.Release.config

<behaviors>
    <serviceBehaviors>
        <behavior>
            <serviceMetadata httpsGetEnabled="True" xdt:Transform="Replace" />
            <serviceDebug includeExceptionDetailInFaults="False" xdt:Transform="SetAttributes(includeExceptionDetailInFaults)"/>
        </behavior>
    </serviceBehaviors>
</behaviors>
<services>
    <service>
        <endpoint bindingConfiguration="SecureTransportBinding"
                    xdt:Transform="SetAttributes(bindingConfiguration)"/>
    </service>
</services>

Вот как выглядят мои привязки, но они довольно стандартны. обратите внимание на имена, которые используются выше:

<basicHttpBinding>
    <binding name="SecureTransportBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647">
        <security mode="Transport"/>
        <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/>
    </binding>
    <binding name="BasicHttpBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647">
        <security mode="None"/>
        <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/>
    </binding>
</basicHttpBinding>

Вот ссылка на дополнительную информацию о преобразованиях Web.config:

http://msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx

1 голос
/ 26 августа 2015

Существует множество причин, по которым вы можете получить ошибку:

    Could not find a base address that matches scheme http for the endpoint
    with   binding WebHttpBinding. Registered base address schemes are [https].

Большинство причин - в настройках Web.config, но это может быть из IIS. У меня были те же проблемы: если вы защищали конечные точки с помощью привязок http и https, вам нужно создать привязку http и https для веб-сайта, созданного вами в IIS-> Site-> Bindings, в противном случае вы получите эту ошибку.

0 голосов
/ 01 декабря 2010

По умолчанию время ожидания приема составляет 10 минут, поэтому клиент WCF будет отключен после того, как время простоя превысит это ограничение. Что я могу сделать, если соединение нужно поддерживать живым?

Решение № 1:

Сервер предоставляет фиктивную операцию, чтобы клиент регулярно вызывал его, чтобы он не простаивал.

Решение № 2:

Включите для secureSession и установите для receiveTimeout и inactivityTimeout значение «бесконечный» как на клиенте, так и на сервере. Фрагмент конфигурации может выглядеть следующим образом:

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="WSHttpBinding" receiveTimeout="infinite">
        <reliableSession inactivityTimeout="infinite" enabled="true" />
      </binding>
    </wsHttpBinding>
  </bindings>
  <services>
  ...
  </services>
  ...
</system.serviceModel>
0 голосов
/ 29 сентября 2010

Это одна из причин, по которой вы можете настроить привязку из конфигурации: чтобы иметь возможность использовать разные настройки в разных средах.

Самое простое решение для вас - использовать makecert для создания тестового сертификата для вашей среды разработки и использовать HTTPS как на компьютере разработки, так и на рабочей машине.

Другое решение заключается в созданииустановочный пакет (msi) и позвольте администратору изменить настройку enpoint во время установки.

Редактировать:

Ваше требование иметь все 4 конечные точки на обеих машинах выполнимо, но в этом случаеваш сервис также будет доступен для HTTP в производственной среде, и каждый, кто будет иметь WSDL для сервиса, будет знать об этом.

...