Support for HTTP and HTTPS Web.Config WCF Service

I am having a configuration issue with my WCF service when trying to support both https and https. Ideally, I would like to run http on my dev machine and then publish to azure running https.

I followed these posts to try and run the config: http://jayakrishnagudla.blogspot.com/2009/12/configuring-wcf-services-to-work-with.html

How can I configure a separate WCF service for multiple HTTP and HTTPS endpoints?

My Web.Config looks like this:

<system.serviceModel>
    <services>
      <service name="Backend.Services.UserService.UserService" behaviorConfiguration="">

        <endpoint address=""
           binding="webHttpBinding"
           contract="Backend.Services.UserService.IUserService"
           bindingConfiguration="HttpsBinding"
           behaviorConfiguration="Web">

        </endpoint>

        <endpoint address=""
                  binding="webHttpBinding"
                  contract="Backend.Services.UserService.IUserService"
                  bindingConfiguration="HttpBinding"
                  behaviorConfiguration="Web"
                  >

        </endpoint>
      </service>
    </services>
      <bindings>
        <webHttpBinding>
          <binding name ="HttpBinding">
            <security mode="None">
              <transport clientCredentialType="None"/>
            </security>
          </binding>

          <binding name="HttpsBinding">
            <security mode="Transport"/>
          </binding>
        </webHttpBinding>

    </bindings>
    <behaviors>

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

      <endpointBehaviors>
        <behavior name="Web">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

      

As far as I can tell, this configuration should be correct according to the links above. However, when I build and run this service locally via http, I get the following error:

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

      

I'm not entirely sure where the problem is, and I'm guessing it's a misconfiguration. Any help would be greatly appreciated.

+3


source to share


2 answers


I've been trying to do this for a few days (actually, but just restarted a few days ago) and the post above pointed me in the right direction with protocolMapping

, but you need to point bindingConfiguration

in the section protocolMapping

to select <security mode = None> or <mode security = Transport>:

<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  <protocolMapping>
    <add scheme="http"  binding="basicHttpBinding" bindingConfiguration="ServiceBinding"/>
    <add scheme="https" binding="basicHttpBinding" bindingConfiguration="ServiceBindingSSL"/>      
  </protocolMapping>

      

Leave the attribute bindingConfiguration

from endpoint - it will be automatically set based on the protocol. Then set up the second binding configuration in the bindings section:



        <basicHttpBinding>
            <binding name="ServiceBinding"  ...>
                <security mode="None">
                </security>
            </binding>
            <binding name="ServiceBindingSSL" ... >
                <security mode="Transport">
                </security>
            </binding>
        </basicHttpBinding>

      

This method worked for me. Hope this helps you!

+1


source


Have you looked at the wcf config section for protocol mapping?

<protocolMapping>
    <add scheme="http" binding="wsHttpBinding"/>
    <add scheme="https" binding="wsHttpBinding"/>      
</protocolMapping>

      



Edit: I'm not sure why you configured the "https" binding under the type webHttpBinding. Shouldn't you have both http webHttpBinding and wsHttpBinding defined and assigned to an endpoint?

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

<wsHttpBinding>
    <binding name="wsHttpEndpointBinding">
        <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="None" />
            <message clientCredentialType="UserName" />
        </security>
    </binding>
</wsHttpBinding>

      

0


source







All Articles