By default, the Optimizely Content Management System (CMS) Image Service runs in the same application domain as the CMS site. For performance and scalability reasons, you can host the CMS Image Service in another process and use Windows Communication Foundation to access it. This could be an ASP.NET Web Application, a Console Application or even a WinForms Application.
If you host using IIS and the HTTP protocol, or with Windows Activation Services (Windows Server 2008 / Windows Vista only), then you should create a file with the SVC extension somewhere in the website. The SVC file should contain the following line of code:
<%@ ServiceHost Language="C#" Debug="true" Service="EPiServer.ImageLibrary.ImageService" %>
You can configure the Windows Communication Foundation client and service from both code and configuration files. Configuration files are the most flexible because you can change endpoint addresses and binding types without having to touch the code.
The following configuration example shows an Image Service hosting application that uses the NET.TCP protocol. Place the <system.serviceModel> section in the application’s app/web.config file as a child of the 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 you want to use the IIS non-HTTP hosting on Windows Server 2003 / Windows XP option, then add the following line to the configuration file as a child of the <system.web> and <httpModules> section:
<add name="ImageServiceModule" type="EPiServer.ImageLibrary.ImageServiceModule, EPiServer.ImageLibrary" />
To use the remote Image Service on an Optimizely CMS website, you also need to configure WCF in its web.config file. Assuming that the Image Service was 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 > </bindings>
The client endpoints name MUST be
ImageServiceClientEndPointbecause this is the name that CMS looks for when deciding if the Image Service should be accessed using Windows Communication Foundation. If there is no client endpoint with the name
ImageServiceClientEndPoint, then a local version of the Image Service is instantiated by CMS in the same application domain.
In the startup code for the application, create a
System.ServiceModel.ServiceHost instance passing in the
//Create a service of for the type EPiServer.ImageLibrary.ImageService ServiceHost serviceHost = new ServiceHost(typeof(ImageService));
Open the service host to start the listening operation:
//Start the service serviceHost.Open();
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();
Microsoft does not support hosting a WCF service in IIS on Windows Server 2003 / Windows XP using a non-HTTP protocol (for example, NET.TCP, NET.PIPE), but you can do it and it works using the help of an HTTP module.
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 you must activate the web application hosting the service via a normal web request to call the HTTP module and open the service host.
- WCF Hosting Options (MSDN.com)
- How to host a WCF Service in IIS (MSDN.com)
- How to Host a WCF Service with Windows Activation Services on Windows Server 2008 / Windows Vista (WAS) (MSDN.com)
- Configure CMS describes the syntax used in the description of the configuration elements.
Updated 5 months ago