Ajax call to wcf windows service over ssl (https)
- by bpatrick100
I have a windows service which exposes an endpoint over http.  Again this is a windows service (not a web service hosted in iis).  I then call methods from this endpoint, using javascript/ajax.  Everything works perfectly, and this the code I'm using in my windows service to create the endpoint:
        //Create host object
        WebServiceHost webServiceHost = new WebServiceHost(svcHost.obj, new Uri("http://192.168.0.100:1213"));
        //Add Https Endpoint
        WebHttpBinding binding = new WebHttpBinding();
        webServiceHost.AddServiceEndpoint(svcHost.serviceContract, binding, string.Empty);
        //Add MEX Behaivor and EndPoint
        ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
        metadataBehavior.HttpGetEnabled = true;
        webServiceHost.Description.Behaviors.Add(metadataBehavior);
        webServiceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
        webServiceHost.Open();
Now, my goal is to get this same model working over SSL (https not http).  So, I have followed the guidance of several msdn pages, like the following:
http://msdn.microsoft.com/en-us/library/ms733791(VS.100).aspx
I have used makecert.exe to create a test cert called "bpCertTest".  I have then used netsh.exe to configure my port (1213) with the test cert I created, all with no problem.  Then, I've modified the endpoint code in my windows service to be able to work over https as follows:
        //Create host object
        WebServiceHost webServiceHost = new WebServiceHost(svcHost.obj, new Uri("https://192.168.0.100:1213"));
        //Add Https Endpoint
        WebHttpBinding binding = new WebHttpBinding();
        binding.Security.Mode = WebHttpSecurityMode.Transport;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
        webServiceHost.AddServiceEndpoint(svcHost.serviceContract, binding, string.Empty);
        webServiceHost.Credentials.ServiceCertificate.SetCertificate("CN=bpCertTest", StoreLocation.LocalMachine, StoreName.My);
        //Add MEX Behaivor and EndPoint
        ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
        metadataBehavior.HttpsGetEnabled = true;
        webServiceHost.Description.Behaviors.Add(metadataBehavior);
        webServiceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");
        webServiceHost.Open();
The service creates the endpoint successfully, recognizes my cert in the SetCertificate() call, and the service starts up and running with success.
Now, the problem is my javascript/ajax call cannot communicate with the service over https.  I simply get some generic commication error (12031).  So, as a test, I changed the port I was calling in the javascript to some other random port, and I get the same error - which tells me that I'm obviously not even reaching my service over https.
I'm at a complete loss at this point, I feel like everything is in place, and I just can't see what the problem is.  If anyone has experience in this scenario, please provide your insight and/or solution!
Thanks!