Поддержка HTTP и HTTPS на службе WCF - PullRequest
0 голосов
/ 26 февраля 2019

Этот вопрос обсуждается здесь несколько раз, но даже после прочтения документации Microsoft https://docs.microsoft.com/en-us/dotnet/framework/wcf/configuring-services-using-configuration-files и Как можно объединить конфигурацию служб WCF для http и https в одном файле web.config?

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

Я могу заставить службу поддерживать HTTP или HTTPS без проблем , проблема здесь в том, чтобы служба сама выбирала правильный протокол .

Ключевым моментом является протокол привязки на первой конечной точке, любые другие изменения, подобные показанным ниже, не оказали влияния.

App.config-

<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

Привязки -

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="AccountServicePortSoap11"/>
        <security mode="None">
          <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
          <message algorithmSuite="Default" />
        </security>
      </binding>
      <binding name="AccountServicePortSoap22" />
        <security mode="Transport">
          <transport clientCredentialType="Window" proxyCredentialType="None" realm=""/>
          <message algorithmSuite="Default" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings> 

Конечные точки -

<client>
       <endpoint address="" bindingConfiguration="AccountServicePortSoap11" binding="basicHttpBinding" contract="AccountServiceRef.AccountServicePort" name="AccountServicePortSoap11" />
       <endpoint address="" bindingConfiguration="AccountServicePortSoap22" binding="basicHttpBinding" contract="AccountServiceRef.AccountServicePort" name="AccountServicePortSoap22" />
</client>

Остальная часть App.config

  <appSettings>
    <add key="defaultServer" value="http://**.**.**.**:80 " />
  </appSettings>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="DocumentFormat.OpenXml" publicKeyToken="******" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.8.1.0" newVersion="2.8.1.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>  

Изменения, которые я пробовал -

<serviceBehaviors>
          <behavior name="MyServiceBehavior">
            <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
        <protocolMapping>
    <add scheme="http"  binding="basicHttpBinding" bindingConfiguration="AccountServicePortSoap22"/>
    <add scheme="https" binding="basicHttpBinding" bindingConfiguration="AccountServicePortSoap11"/>      
  </protocolMapping>
      <services>
        <service behaviorConfiguration="MyServiceBehavior" name="com.advantage.online.store.accountservice" >
          <endpoint address="" binding="basicHttpBinding" contract="AccountServiceRef.AccountServicePort" name="AccountServicePortSoap11" />
          <endpoint address="" binding="basicHttpBinding" contract="AccountServiceRef.AccountServicePort" name="AccountServicePortSoap22" />
        </service>
      </services>

1 Ответ

0 голосов
/ 27 февраля 2019

Вообще говоря, у меня есть следующие способы размещения службы через http и https.

  <system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior>
      <webHttp />
    </behavior>
  </endpointBehaviors>
</behaviors>
<bindings>
  <webHttpBinding>
    <binding name="mybinding">
      <security mode="Transport">
        <transport clientCredentialType="None"></transport>
      </security>
    </binding>
  </webHttpBinding>
</bindings>
<protocolMapping>
  <add binding="webHttpBinding" scheme="http"/>
  <add binding="webHttpBinding" scheme="https" bindingConfiguration="mybinding"/>
</protocolMapping>    
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

Результат.enter image description here Я настраиваю две конечные точки, которые используются для поддержки https / http соответственно.Кстати, мне нужно добавить базовый адрес https в модуль привязки сайта IIS.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-configure-an-iis-hosted-wcf-service-with-ssl
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...