Table of Content
- Hosting with IIS HTTP / WAS
- Hosting with a Console / WinForms Application
- Hosting with IIS and a non-HTTP protocol on Windows Server 2003 / XP
The EPiServer CMS Image Service runs by default in the same application domain as the EPiServer CMS site. For performance and scalability reasons it is possible to host the EPiServer CMS Image Service in another process and use Windows Communication Foundation to access it. This article discusses the different options for hosting the Image Service outside the EPiServer CMS application. The EPiServer CMS Image Service can be hosted in a Windows Communication Foundation enabled application. This could be an ASP.NET Web Application, a Console Application or even a WinForms Application. See the article WCF Hosting Options on MSDN.com.
Refer to Configuration Syntax for a description of the syntax used when explaining the various configuration elements.
Hosting with IIS HTTP / WAS
If hosting using IIS and the HTTP protocol or with Windows Activation Services (Windows Server 2008 / Windows Vista only) then a file with the SVC extension should be created somewhere in the website. The SVC file should contain the following line of code:
<%@ ServiceHost Language="C#" Debug="true" Service="EPiServer.ImageLibrary.ImageService" %>
See the articles How to Host a WCF Service in IIS and How to Host a WCF Service with Windows Activation Services on Windows Server 2008 / Windows Vista (WAS) at MSDN.com.
Windows Communication Foundation client and service can be configured from both code and configuration files. Configuration files are the most flexible as endpoint addresses and binding types can be changed without having touch the code.
Image Service Host Application Configuration
Below is a configuration example for an Image Service hosting application which uses the NET.TCP protocol. The <system.serviceModel> section should be placed in the application’s app/web.config file as a child of the <configuration> section.
<system.serviceModel> <services> <service name="EPiServer.ImageLibrary.ImageService"> <endpoint address="net.tcp://serverxyz:8000/ImageService" binding="netTcpBinding" bindingConfiguration="ImageServiceBinding" contract="EPiServer.ImageLibrary.IImageService" /> </service> </services> <bindings> <netTcpBinding> <binding name="ImageServiceBinding" maxReceivedMessageSize="20000000"> <readerQuotas maxArrayLength="20000000" /> </binding> </netTcpBinding > </bindings>
If the IIS non-HTTP hosting on Windows Server 2003 / Windows XP option is to be used then the following line should also be added to the configuration file as a child of the <system.web> and <httpModules> section:
<add name="ImageServiceModule" type="EPiServer.ImageLibrary.ImageServiceModule, EPiServer.ImageLibrary" />
Configuring the EPiServer CMS Website
To actually use the remote Image Service on an EPiServer CMS website, you also need to configure WCF in its web.config file. Assuming that the Image Service has been configured to use the NET.TCP protocol and is listening on port 8000/ImageService on serverxyz, the following configuration is required:
<system.serviceModel> <client> <endpoint name="ImageServiceClientEndPoint" address="net.tcp://serverxyz:8000/ImageService" binding="netTcpBinding" bindingConfiguration="ImageServiceBinding" contract="EPiServer.ImageLibrary.IImageService" /> </client> <bindings> <netTcpBinding > <binding name="ImageServiceBinding" maxReceivedMessageSize="20000000"> <readerQuotas maxArrayLength="20000000" /> <security mode="None"> </security> </binding> </netTcpBinding >
Hosting with a Console / WinForms Application
In the startup code for the application, create a System.ServiceModel.ServiceHost instance passing in the ImageService type:
//Create a service of for the type EPiServer.ImageLibrary.ImageService ServiceHost serviceHost = new ServiceHost(typeof(ImageService));
The service host needs to be opened in order to start the listening operation:
//Start the service serviceHost.Open();
Note that the call to Open is non-blocking. Therefore, in a console application you should have code to stop the application exiting immediately:
Console.WriteLine("Press any key to stop the service"); Console.ReadLine();
Always close the service host before the application exits, either with an explicit call to Close() or by employing the C# using statement:
//Close the service serviceHost.Close();
Hosting with IIS and a Non-HTTP Protocol on Windows Server 2003 / XP
Hosting a WCF service in IIS on Windows Server 2003 / Windows XP using a non-HTTP protocol (for example, NET.TCP, NET.PIPE) is not a scenario Microsoft support. However, it is possible and works quite well using the help of an HTTP module.
The EPiServer.ImageLibrary assembly actually supplies such a module to support this hosting option. No user code is required for this, only configuration.
The main disadvantage with this hosting method is that the requests to the WCF service do not go through the IIS HTTP pipeline and therefore have no effect on the lifetime of the web application. This means that the web application hosting the service must be activated via a normal web request in order for the HTTP module to be called and the service host opened.