It seems simple, hosting an AJAX WCF .svc in IIS under multiple domains with both http and https protocol. Unfortunately this turned out to be a little complex under the binding model used by WCF. You may recieve messages such as "Could not find a base address that matches scheme http for the endpoint with binding WebHttpBinding. Registered base address schemes are [https]".After some exploration I came up with the following solution:
Configuration:
<system.serviceModel> <services> <service name="MyNamespace.MyService" behaviorConfiguration="DefaultAspNet"> <endpoint address="" behaviorConfiguration="ServiceAspNetAjaxBehavior" binding="webHttpBinding" contract="MyNamespace.MyService"/> <endpoint address="" behaviorConfiguration="ServiceAspNetAjaxBehavior" bindingConfiguration="Secure" binding="webHttpBinding" contract="MyNamespace.MyService"/> </service> </services> <behaviors> <endpointBehaviors> <behavior name="ServiceAspNetAjaxBehavior"> <enableWebScript /> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="DefaultAspNet"> <serviceAuthorization impersonateCallerForAllOperations="false" /> <serviceMetadata httpGetEnabled="true" httpGetUrl="" /> <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <webHttpBinding> <binding name="Secure"> <security mode="Transport"/> </binding> </webHttpBinding> </bindings> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> </system.serviceModel>
Factory used to allow multiple host service usage:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ServiceModel.Activation; using System.ServiceModel; //Your Namespace Here public class IisServiceHostFactory : ServiceHostFactory { protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { ServiceHost result = null; if (baseAddresses != null && baseAddresses.Length > 0 && HttpContext.Current != null && HttpContext.Current.Request != null) { Uri baseAddress = baseAddresses.First(); UriBuilder httpUriBuilder = new UriBuilder(baseAddress); httpUriBuilder.Scheme = Uri.UriSchemeHttp; httpUriBuilder.Port = 80; httpUriBuilder.Host = HttpContext.Current.Request.Url.Host; UriBuilder httpsUriBuilder = new UriBuilder(baseAddress); httpsUriBuilder.Scheme = Uri.UriSchemeHttps; httpsUriBuilder.Port = 443; httpsUriBuilder.Host = HttpContext.Current.Request.Url.Host; result = new ServiceHost(serviceType, httpUriBuilder.Uri, httpsUriBuilder.Uri); } else { result = new ServiceHost(serviceType, baseAddresses); } return result; } } //Your Namespace Here