kosh
kosh

Reputation: 561

What is the entry method for WCF service hosted on IIS?

A little background info - I'm trying to host a RESTful WCF service on Azure. As I understand, unless I have the ASP.NET type hosting on the role, I don't really need the global.asax class (which has the application_start method).

From basic prototyping, all I needed was the svc file and the implementation behind it and it automatically gets initialized on role startup (I mean, hosted up on IIS).This is great because I need no extra code other than web.config and my service is up and running. I don't need to create a new service host and start listening on it, etc. I'm able to deploy the role and POST messages to my service.

The problem - I have custom logging and initialization classes implemented that I need to initialize when my service starts up. I configured my service to be a singleton and I'm not sure where I should put my custom initialization components.

Without an explicit application start method and my service configured as a singleton, can I assume that when the first request comes in, my service constructor gets called? (along with all my custom initialization?).

Upvotes: 2

Views: 1854

Answers (2)

Kirk Broadhurst
Kirk Broadhurst

Reputation: 28698

can I assume that when the first request comes in, my service constructor gets called?

Yes, but you should ask yourself whether you really want your service to run as a singleton. If you're happy with this then it will work fine; if you don't want it to run as a singleton then you should look into Russell's answer using a custom factory.

Look at Should WCF service typically be singleton or not? for some discussion about whether WCF services should be singletons. You need to decide for your situation, but generally WCF services are not singletons unless they need to be.

To implement a custom factory, see this MSDN link Extending Hosting Using ServiceHostFactory. As the link describes, extend the service host factory like so

public class DerivedFactory : ServiceHostFactory
{
   public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )
   {
      return new ServiceHost(t, baseAddresses )
   }
}

And then specify your factory in the ServiceHost directive

<% @ ServiceHost 
     Service="MyNamespace.MyService" 
     Factory="MyNamespace.DerivedFactory" %>

Upvotes: 2

Russell
Russell

Reputation: 17719

You're looking for ServiceHostFactory. You can add a part to the SVC file to use a factory, where you can do any logging etc. you may need.

I have used this in the past to start a background worker to launch a separate thread for some background work.

http://msdn.microsoft.com/en-us/library/system.servicemodel.activation.servicehostfactory.aspx

Hope this helps you get where you need to be. :)

Upvotes: 2

Related Questions