Month: July 2016

Configuration based activation of WCF service – without SVC files

Prior to .net 4.0, while creating and hosting a WCF service it was mandatory to provide a .svc file. This .svc file is a text file which contains name of the service and other required information for ServiceHost class.

Microsoft introduced a config based activation from .net 4.0. i.e you can configure it from web.config file or application files if hosted in other applications. This feature lets you register your service under a relative virtual path. You have to also specify the name of the class which would be served as a service using the relative virtual path.

Advantage of config based activation is that you don’t have to maintain .svc files separately. Configuration to be done is minimal. This does not make much difference for small projects but it surely makes a significant impact on large and scalable projects wherein you have to deal with hundreds of services.

Lets us create a project to demonstrate this concept.

Create a WCF Service Application project. Name it as ConfigBasedService.

Delete Service1.svc and IService1.cs files from project.

Add a new Interface IMessageListenerService.cs as follows

namespace ConfigBasedService
{
    public interface IMessageListenerService
    {
        bool ReceiveMessage(string message);
    }
}

Add a new class MessageListenerService.cs and implement IMessageListenerService. Also decorate MessageListenerService class with ServiceContract attribute and methods with OperationContract attribute

namespace ConfigBasedService
{
    [ServiceContract]
    public class MessageListenerService : IMessageListenerService
    {
        [OperationContract]
        public bool ReceiveMessage(string message)
        {
            if (string.IsNullOrEmpty(message))
                return false;

            return true;
        }
    }
}

Since we are going to activate our service using configuration to get rid of the .svc files, we have to add activation related information in configuration file.
We will add serviceHostingEnvironment element in system.serviceModel.

Now comes the interesting part. configuration for all the services which are to be hosted are to be added in serviceActivations element. For our MessageListenerService we will have to add a configuration as shown below.

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
    <serviceActivations>
       <add relativeAddress="MessageListenerService.svc" service="ConfigBasedService.MessageListenerService"/>
    </serviceActivations>
</serviceHostingEnvironment>

In above code relative address specified is relative to the root application. Service attribute value denotes the class of the service.

Our service is ready. You can host the service on IIS and test it. You can also debug the service and concatenate the URL in browser with relative address to see the running service. This service can be tested using wcftestclient by adding the concatenated path.

Below is the result of successful invocation of MessageListenerService from WcfTestClient

WcfTestClient

WcfTestClient


Entire code sample can be downloaded from Git

Enjoy Coding!!!!!!

How to install a window service

In my last post I had shown you how to create a self hosted windows service.
In this post I am going to walk through the process of adding an installer in a window service and how to use it for installation of window service.

  1. Right click on SelfHostService project and add an installer class named as WindowServiceInstaller.cs
  2. A class with following code snippet will be generated by default
  3. namespace SelfHostService
    {
        [RunInstaller(true)]
        public partial class WindowServiceInstaller : System.Configuration.Install.Installer
        {
            public WindowServiceInstaller()
            {
                InitializeComponent();
            }
        }
    }
    
  4. To install this SelfHostService executable, which contains a class that extend ServiceBase, we will require a ServiceProcessInstaller
  5. MSDN description of the ServiceProcessInstaller class is
  6. Installs an executable containing classes that extend ServiceBase. This class is called by installation utilities, such as InstallUtil.exe, when installing a service application.

  7. Also we will require ServiceInstaller class. MSDN description of the ServiceInstaller class is
  8. Installs a class that extends ServiceBase to implement a service. This class is called by the install utility when installing a service application.

  9. Let us finish our tiny installer. A complete code would look like this
  10. namespace SelfHostService
    {
        [RunInstaller(true)]
        public partial class WindowServiceInstaller : System.Configuration.Install.Installer
        {
            private ServiceProcessInstaller process;
            private ServiceInstaller service;
    
            public WindowServiceInstaller()
            {
                process = new ServiceProcessInstaller();
                process.Account = ServiceAccount.LocalService;
                service = new ServiceInstaller();
                service.ServiceName = "Self Hosted Windows Service";
                service.Description = "This is a self hosted windows service and can accept messages on port 8082 through HTTP";
                Installers.Add(process);
                Installers.Add(service);
            }
        }
    }
    
  11. [RunInstaller(true)] attributes is used by installutil.exe to identify the correct installer
  12. Compile the project. From command prompt, navigate to the path on your machine where InstallUtil.exe is located.
  13. Run command >installutil SelfHostService.exe
  14. Above command will install a window service. Now open Service Control Manager and start the service.

Thats all for this post. In next post I will show you how to create a MSI Installer file using a set up project.

How to self host a WCF service in a windows service

Today I am going to show you how to host a WCF service in a managed environment such as windows service. Let us see how to achieve this through C#.
Here, I will first show you how to create a simple windows service and then how to host a WCF service in it.
I will also show you how to pass the external messages received on this service, to a host. I am going to use a singleton pattern to avoid the race condition while receiving messages concurrently.

  1. Create a “Console Application” project named as “SelfHostService” using installed templates in Visual Studio
  2. Delete Program.cs file from project
  3. Add a new class named as SelfHostService.cs
  4. Click Add Reference menu to open a Add Reference Dialog Box
  5. Select System.ServiceProcess namespace to refer
  6. ServiceBase class resides in this newly added namespace, which is required to create a service application. Derive SerivceBase class in SelfHostService class
  7. Also add a reference to System.ServiceModel namespace
  8. Now let us put some code in SelfHostService class
  9.     public class SelfHostService : ServiceBase
        {
            public ServiceHost serviceHost = null;
            private bool startProcessing;        
            private static SelfHostService instance = null;
            private static readonly object padlock = new object();
    
            //a private constructor
            SelfHostService()
            {
                ServiceName = "Self Hosted Service";
            }
    
            //public static property to access the instance of the SelfHostService class
            public static SelfHostService Instance
            {
                get
                {
                    lock (padlock)
                    {
                        if (instance == null)
                            instance = new SelfHostService();
    
                        return instance;
                    }
                }
            }
        }
    
  10. In above code I have created a public property named Instance to provide a single instance of SelfHostService class
  11. Now let us define a service contract IMessageListener
  12. namespace SelfHostService
    {
        public interface IMessageListener
        {
            bool AcceptMessages(string messsage);
        }
    }
    
  13. We will have to override OnStart() and OnStop() methods of ServiceBase class. These methods contains instructions to follow when service starts and stops respectively. Let us write a code for these methods
  14.         protected override void OnStart(string[] args)
            {
                 if (serviceHost != null)
                        serviceHost.Close();
    
                    serviceHost = new ServiceHost(typeof(MessageListenerService));
    
                    serviceHost.Open();
    
                    var timer = new Timer();
                    timer.Interval = 60000;
                    timer.Elapsed += new ElapsedEventHandler(DoWork);
                    timer.Start();
            }
    
            protected override void OnStop()
            {
                if (serviceHost != null)
                {
                    serviceHost.Close();
                    serviceHost = null;
                }
            }
    
  15. DoWork method is a task assigned to a timer which has been initialized in OnStart() method. After every interval elapses, this method will get executed. So one can write any code which is to be performed repetitively by a window service.
  16.         private void DoWork(object sender, ElapsedEventArgs e)
            {
                //Add code to do the intended work
            }
    
  17. I will add a method to accept requests, received by MessageListenerService
  18.         public bool AcceptExternalMessages(string message)
            {
                if (string.IsNullOrEmpty(message))
                    return false;
                else
                    return true;
            }
    
  19. Now we will implement IMessageListener in MessageListenerService
  20.     public class MessageListenerService : IMessageListener
        {
            public bool AcceptMessages(string message)
            {
                //Notify message to windows service
                return SelfHostService.Instance.AcceptExternalMessages(message);
            }
        }
    
  21. We will have to configure the services’ base address, binding and contracts
  22. <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>    
    	<services>
          <service name="SelfHostService.MessageListenerService" behaviorConfiguration="ServiceBehavior">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8082/SelfHostService/Service"/>
              </baseAddresses>
            </host>
            
            <endpoint address="" binding="wsHttpBinding" contract="SelfHostService.IMessageListener" />
            
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="ServiceBehavior" >
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    

In my next post I will write about how to install this service using InstallUtil.exe

Note: This code post is written in C# 6.0 in Visual Studio 2015

Extension methods in C#

Extension methods are special methods in C#, which allows to extend the functionality of an existing class. These methods are mostly used to add an additional behavior to classes which are closed to modification.

While programming we come across a situation where some third party library does not provide a certain behavior in their classes and we want to have the same. In such situation extension methods come to rescue.

Syntax for extension method is very simple. Extension methods are always static. First parameter in this method should be of type which you are going to extend, preceded by this keyword . (This is mandatory to make a method as extension method, though you do not have to pass it.) Other parameters can be defined after this as required.

public static ExtensionMethod(this TypeToExtend parameter)
{

//put desired stuff to be done with parameter

}

Lets have a look to real time example.

public static class ExtensionMethods
{

  public static int GetNumberCount(this String myString)
  {
    int count = 0;
    
    foreach(char character in myString)
    { 
       if(Char.IsDigit(character))
         count++;
    }

    return count;
 } 

} 

Above extension method can be invoked in the same way as instance method:

string numberedString = "Company strength is 2948";
int numberCount = numberedString.GetNumberCount();

More facts about extension methods:

  • Extension methods are always written in a static class.
  • Extension methods are always static.
  • If class which is being extended contains a method with same signature as that of the extension method, then extension method never gets called.
  • Though extension methods are static they are invoked as an instance method.
  • Multi parameter extension method can be written.