Windows Service hosted WCF over HTTPS

29,894

I think you are connecting two different settings. Netsh can be used to add certificate for SSL but also to allow application listening on given port without running under admin account. The exception targets second setting. I haven't seen it before but I assume that you have already registered this port for HTTP so lets try to use (and register) HTTPS on another port or replace previous registration.

Edit:

Open command prompt with elevated privileges (As Admin). First check if SSL cert is assigned to correct port:

netsh http show sslcert

Than check if HTTP listening is registered on that port by calling:

netsh http show urlacl 

If so use following command to remove that registration:

netsh http delete urlacl url=http://+:54321/MyService

Add registration again to support listening on HTTPS:

netsh http add urlacl url=https://+:54321/MyService user=domain\userName

Where user is account used to run your Windows service. If it ia a local account use only userName.

Note: Under https, it appears the wildcard must be used in the urlacl. We cannot write https://localhost:8733/... to match Visual Studios default urlacl for http. This probably makes sense since the requested hostname isn't available until after decryption.

Share:
29,894
Rob
Author by

Rob

I work in the Foreign Exchange industry, with prior experience in Telecoms. My interests are wide and varied, though primarily around the Microsoft technology stack. Outside of tech, it's cooking, cats and New Zealand Sauvignon Blanc that tend to capture my interest! ;)

Updated on June 01, 2020

Comments

  • Rob
    Rob almost 4 years

    I've created and configured an SSL certificate as per these instructions from MSDN. I'm getting the error message that this question lists, but am not sure how to map the accepted answer in that question to my App.config file. The content of the config file, and the service itself worked correctly over http, it's just over https that the problem is occuring.

    My App.config file is currently:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <bindings>
          <wsHttpBinding>
            <binding name="TransportSecurity">
              <security mode="Transport">
                <transport clientCredentialType="None"/>
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>
        <services>
          <service name="LookupServiceHost" behaviorConfiguration="serviceBehaviour">
            <host>
              <baseAddresses>
                <add baseAddress="https://localhost:54321/MyService"/>
              </baseAddresses>
            </host>
            <endpoint address="" binding="wsHttpBinding" contract="ILookupService" bindingConfiguration="TransportSecurity" />
            <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="serviceBehaviour">
              <serviceMetadata httpsGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="False"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    

    The ErrorException returned in the Windows Event Log:

    Service cannot be started. System.ServiceModel.AddressAlreadyInUseException: HTTP could not register URL https://+:54321/MyService/. Another application has already registered this URL with HTTP.SYS. ---> System.Net.HttpListenerException: Failed to listen on prefix 'https://+:54321/MyService/' because it conflicts with an existing registration on the machine.

    Could someone give me a pointer as to how to enable this?

  • Rob
    Rob over 13 years
    could you call out what changes I should make to my .config file / netsh registrations to do that?
  • Rob
    Rob over 13 years
    it was exactly that - I had the wrong port registered. Throwing myself in at the deep-end is clearly not the easiest way to deal with WCF and HTTPS, especially after a glass or two of wine! =)
  • Rob
    Rob about 6 years
    Running Visual Studio as Administrator is almost never the right answer. Running anything as Administrator is almost never the right answer. The accepted answer details the right way to do this. If you run Visual Studio as Administrator, your code will likely need to run in production as Administrator - that is not a place you should, or want to, be
  • Lavanya
    Lavanya about 6 years
    I always get this error when I am not debugging the project in admin mode, Once I close the solution and open VS in admin mode and debug the error never occurs