Death to Windows Services...Long Live AppFabric!

Up until now, the only option for running always on/long running processes was to build a Windows Services.  While .NET made building Windows Services easier, they still come with their own set of headaches.  Windows Server AppFabric adds an Auto-Start/Always-Running feature which allows IIS hosted services to behave more like traditional Windows Services.  Services will automatically start when the computer boots, an application pool is started, or an IISRESET is performed.

Why use this feature? 

By hosting within IIS, applications receive the following benefits:

  • Single hosting framework for all application components.  Web sites, services, and long running services can be hosted using the same framework & management tools.
  • Improved deployment capabilitiesXCOPY deployment is now possible or use the new Web Deploy functionality.  Web Deploy is enough of a reason by itself!
  • Provide self-hosted management or monitoring web pages.  You can easily add ASPX web pages to your service to provide status on their work load.
  • Utilize IIS automatic management features.  Optionally configure your service to recycle on a given interval or based on memory usage, just like any other IIS hosted service.
So, how do you get started?

Step 1: Install the prerequisites

Step 2: Update Application Pool to Auto-Start

Start IIS Manager and access the configuration editor:



Select the system.applicationHost/applicationPools section and click the ellipsis by the application pool collection:



Select the application pool & change the start mode to “AlwaysRunning”. Once you close the popup, make sure you click the Apply button.



 
Step 3: Configure Site with Net.Pipe Binding

The net.pipe binding is used by AppFabric to control the hosted service.  Navigate to the site & click edit bindings.  Add net.pipe if it isn’t already there.



 
Step 4: Configure Application with Net.Pipe Binding

Access the advanced settings on the application (virtual directory) and make sure net.pipe is one of the enabled protocols.

 

Step 5: Configure Application with Auto-Start

Access the Configure WCF and WF option on the application.  Click on the Auto-Start tab & select “Enabled”.


 
Step 6: Make changes to the application code

Add your thread initialization to the AppStart class.  It is fired for both HTTP and non-HTTP activation (such as net.pipe).  Do not put the code in global.asax since it is only invoked for the HTTP pipeline.   You need to create a class called AppStart within App_Code directory.  It should have a public static method of AppInitialize. 

AppStart.cs (within App_Code directory)

   1:  namespace Payformance.Services.ImportService
   2:  {
   3:      public class AppStart
   4:      {
   5:          private static ImportServicePlugin servicePlugin;
   6:   
   7:          // Code that runs on application startup by ASP.NET infrastructure
   8:          public static void AppInitialize()
   9:          {
  10:              servicePlugin = new ImportServicePlugin();
  11:              servicePlugin.Start();
  12:          }
  13:   
  14:      }
  15:  }
  16:   

Step 7: Monitoring

Since all services will be hosted under the w3wp.exe process name, you can see the Worker Process associated with your application pool within the IIS manager:





Another approach is to use the SysInternals Process Explorer free from Microsoft.  Add the “Command Line” column to the grid, and the application pool name will be listed after the –ap switch.




And my personal favorite, you can also add a web page to your service that provides information about your service. 

Hopefully you're as fired up as I am about these new possibilities...go try it out.

15 Comments

  • What happens in the auto start scenario where the AppPool shuts down due to inactivity? Does auto start kick it back up again?

  • Very interesting concept and one that is worth exploring. I'm not very familiar with webdeploy - could it be scripted to do all the configuration you're doing within IIS (steps 2-5)?

  • I've tried this out but am getting a bit confused. The web application that you're setting to autostart - is this a .net web project or a windows service project?

    Presumably it's a web project as I couldn't get this working with a windows service.

  • Rory: The inactivity shutdown is disabled when you turn on the "Always On" mode.

    Rposbo: This is a web application. Instead of putting your startup code (for kicking off threads, etc.) in the windows service class, you put it in the autostart class.

  • Are there any caveats to this vs a windows service?

    Windows services are not all that bad, especially if you add some plugins so you can debug them like regular apps.

    But they work, and they're proven to work, and can run on any machine with the correct .net version.

  • That is a great feature! I was waiting it so long..

  • Great post, Brian - this will really help me in my effort to sell the merits of AppFabric features to our PHBs.

    BTW - I tried to subscribe to your blog, but your feed links seem to be broken.

  • mkprilliman: Thanks for the heads up. The feed should be fixed now.

    Ryan: I haven't found any caveats so far. I've converted one of my services over and it is working great. I'll keep everyone posted if I start running into problems.

    rposbo: Scripting with Web Deploy might be possible, but PowerShell would definitely work.

  • Thanks for the post. Exactly what I needed.
    Btw... your header reminds me of Half Life.

  • Hi

    Great post but i don't quite get how to get my project started in Visual Studio 2010? What kind of project are you using?

  • Actually, if you could post a sample project to download that would be great!

  • It would be great if you could post a working project! Thanks

  • Hey,

    How did you create the web page described in the last section?

    --larsw

  • I like this, but windows services also get a shutdown signal. What if we need to gracefully shutdown the application? Is there also a magic AppShutdown method to be put in the App_Code directory?

    Erlend

  • One caveat appears to be use autostart to the initialize spring.net framework. It complains about Types from the object definitions, as if object signatures had changed.

Comments have been disabled for this content.