There are two main ways to host a WCF Service. One approach is to write a server, typically as a console app. The other is to use a managed hosting environment (e.g., Internet Information Services (IIS) or Windows Process Activation Service (WAS)).
When using the second approach, the creation of the services hosts is done automatically, based on a configuration file (Web.config), where the endpoints are defined. But, there are situations when the service hosts must be created programmatically.
In this tip, I'll explain how to customize the host creation when hosting the service in a managed hosting environment.
I spent some time searching for a way to create endpoints without using a Web.config file when hosting a service using IIS. And, all that I found was a small example (two lines!) in MSDN. So, here I will show a more complete solution.
First, we need to familiarize with some classes.
WebServiceHostFactory: "A factory that provides instances of
WebServiceHost in managed hosting environments where the host instance is created dynamically in response to incoming messages". In other words: IIS and WAS use this class to create Service Hosts.
WebServiceHost: Instances of this class are created by
Using the Code
First, we need to write a class that derives from
WebServiceHostFactory. Let's call it
MyWebServiceHostFactory. In this class, all we need to do is to override the
In this method, we create the host the way we want.
protected override ServiceHost CreateServiceHost(Type serviceType, Uri baseAddresses)
ServiceHost host = new ServiceHost(serviceType, baseAddresses);
foreach (Uri address in baseAddresses)
WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
b.Name = serviceType.Name;
host.AddServiceEndpoint(serviceType.GetInterfaces(), b, address);
Now, it's time to tell the host environment to use our
HostFactory. It's very simple. We just need to set the property
Factory in the .svc file, as shown below:
<% @ ServiceHost Language="C#" Service="WcfService1.Service1"
Well done! Now, the host environment will call the
MyWebServiceHostFactory.CreateServiceHost method to create the service hosts.
Points of interest
This approach allows you to host a service on IIS or WAS without configuring endpoints and bindings in the Web.config because you can create it programmatically with your custom
ServiceHostFactory. Now, for example, one could load the endpoints information from a database, or from a service.
The next step is to provide ASP.NET AJAX support to the Service Hosts created. To do so, I will write a factory that derives from