Добавление ссылки на службу WCF с помощью конечной точки https - PullRequest
22 голосов
/ 07 ноября 2011

Мое приложение службы WCF работает через http и https, однако, когда я добавляю ссылку на службу (с URL-адресом https) в мой клиент, Visual Studio 2010 устанавливает конечную точку в файле конфигурации на http.Это не так просто, как изменить конечную точку конфигурации на https, поскольку за кулисами есть несколько файлов, которые делают что-то с xsd и ссылаются на конечную точку http.Как я могу настроить мой сервис / клиент для принудительной установки https, чтобы он правильно установил конечную точку?

Когда я пытаюсь вручную изменить конечную точку в файле конфигурации и установить режим безопасности на «Транспорт», я получаю эту ошибку:

Сообщение об исключении: не было прослушивания конечной точки на https://myservice/AvailabilityService.svc, которая могла бы принять сообщение.Это часто вызвано неправильным адресом или действием SOAP.См. InnerException, если имеется, для получения более подробной информации.

Однако я могу увидеть эту конечную точку в IE, и я отлаживаю локально.После того, как я добавляю свою ссылку на сервис с помощью https и выполняю поиск решения по его эквиваленту http, он находит файл wsdl, ссылающийся на http, конфигурацию.svcinfo и конфигурацию91.svcinfo, который использует URL-адрес http вместо https

Вотмоя конфигурация на стороне сервера:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

.. А конфигурация на стороне клиента:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IAvailabilityService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="Transport">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://myservice/AvailabilityService.svc"
          binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAvailabilityService"
          contract="PaymentAvailabilityService.IAvailabilityService"
          name="BasicHttpBinding_IAvailabilityService" />
    </client>
  </system.serviceModel>

Возможно, мне лучше вручную использовать службы в коде?

1 Ответ

31 голосов
/ 07 ноября 2011

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

Транспортная безопасность

Ваша привязка на стороне сервера должна быть настроена как для https, так и для клиента:

<bindings>
  <basicHttpBinding>
    <binding name="httpsBinding" allowCookies="true" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="Transport">
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service name="yourNamespace.YourService" behaviorConfiguration="yourBehaviors">
    <endpoint contract="yourNamespace.YourService" binding="basicHttpBinding" bindingConfiguration="httpsBinding" />
  </service>
</services>
...