tags:

views:

106

answers:

3

In a core assembly, which is run both in a windows service, and in a web application, I need to store information per user session. The service will have a single user session, and the web application uses HttpContext.Current.

I want to configure which method to use within the core assembly - convention over configuration. I want to to this only once, and I believe HttpContext.Current will be null when run from Application_Start.

How can I reliably determine if the application is a web application?

A: 

If possible I'd suggest having it as an input parameter to some initialize method in the class library that would need to be called before the class library can be used.

If that's not an option I'd look at HttpRuntime.Cache which I think would be non null even if HttpRuntime.Current is null. I'm not a webforms guy but I remember someone mentioning that for a similar question sometime somewhere (can't find that question now).

ho1
+3  A: 

if(HttpRuntime.AppDomainAppId != null) { //is web app } else { //is windows app }

Paul
A: 

I'd go for

HostingEnvironment.IsHosted

Note that there is a slight overhead incurred when you're using a method from an assembly like this, even when you don't intend to use it. (System.Web will be loaded and several classes could be initialized and JITed.) Also, there's a hard dependency on System.Web now, so you can't use it in a limited framework setting (currently IIRC only with the Client Profile).

Another way (although not as neat and documented), is to check

Path.GetFileName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)

If this returns web.config (or a casing variant thereof), it's probably a web application. (Although you can setup any appdomain with a config file named web.config, this is not a likely scenario.) This avoids taking a dependency on System.Web.

However, HostingEnvironment.IsHosted is intended to indicate whether an appdomain is configured to run under ASP.NET.

Ruben