2010-07-05 10 views
19

En un ensamblaje central, que se ejecuta tanto en un servicio de Windows como en una aplicación web, necesito almacenar información por sesión de usuario. El servicio tendrá una sola sesión de usuario y la aplicación web utilizará HttpContext.Current.Cómo determinar si la aplicación es la aplicación web

Quiero configurar qué método utilizar dentro del conjunto del núcleo: convención sobre la configuración. Quiero hacer esto solo una vez, y creo que HttpContext.Current será nulo cuando se ejecute desde Application_Start.

¿Cómo puedo determinar de manera confiable si la aplicación es una aplicación web?

Respuesta

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

De ser posible, sugeriría tenerlo como un parámetro de entrada para algún método de inicialización en la biblioteca de clases que necesitaría ser llamado antes de que la biblioteca de clases pueda ser utilizada.

Si no es una opción, me gustaría ver HttpRuntime.Cache que creo que sería nulo incluso si HttpRuntime.Current es nulo. No soy un tipo de webforms, pero recuerdo que alguien lo mencionó por una pregunta similar en algún momento (no puedo encontrar esa pregunta ahora).

11

yo iría a

HostingEnvironment.IsHosted 

Tenga en cuenta que hay una ligera sobrecarga producida cuando se está utilizando un método de un montaje de este tipo, incluso cuando no se vaya a utilizar . (Se cargará System.Web y se podrían inicializar y JIT varias clases). Además, ahora hay una dependencia fuerte en System.Web, por lo que no puede usarlo en una configuración de marco limitado (actualmente IIRC solo con el perfil de cliente) .

Otra forma (aunque no tan limpio y documentado), es comprobar

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

Si esto devuelve web.config (o una variante de la carcasa del mismo), es probablemente una aplicación web. (Aunque puede configurar cualquier dominio de aplicación con un archivo de configuración llamado web.config, este no es un escenario probable). Esto evita tener una dependencia en System.Web.

Sin embargo, HostingEnvironment.IsHosted está destinado a indicar si un dominio de aplicación está configurado para ejecutarse en ASP.NET.

1

En la aplicación web Assembly.GetEntryAssembly() es nulo. Lo uso en dos bibliotecas y hasta ahora funciona muy bien.

+0

Resumí esta solución. Acabo de probarlo con código que se ejecuta en un contexto web a través de ASP.NET y también en un servicio de Windows. –

2

Simplemente, nadie más está cometiendo el mismo error que yo.

Assembly.GetEntryAssembly() no funciona para definir si es una aplicación web o no. Cuando se ejecuta como un servicio, Assembly.GetEntryAssembly() es nulo, pero cuando depuro desde VS, no es nulo.

Cuestiones relacionadas