.net - una - programa para crear aplicaciones android gratis
Cómo determinar si la aplicación es una aplicación web. (5)
En la aplicación web, Assembly.GetEntryAssembly () es nulo. Lo uso en dos bibliotecas y hasta ahora funciona muy bien.
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 utiliza HttpContext.Current.
Quiero configurar qué método usar dentro del ensamblaje central: convención sobre 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?
Iría por
HostingEnvironment.IsHosted
Tenga en cuenta que se incurre en una pequeña sobrecarga cuando utiliza un método de un conjunto como este, incluso cuando no tiene la intención de usarlo. (Se cargará System.Web y se pueden inicializar y JITed varias clases). Además, hay una gran dependencia de System.Web ahora, por lo que no puede usarlo en una configuración de marco limitado (actualmente IIRC solo con el perfil del cliente) .
Otra forma (aunque no tan limpia y documentada), es verificar
Path.GetFileName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)
Si esto devuelve web.config
(o una variante de la carcasa), es probable que sea una aplicación web. (Aunque puede configurar cualquier appdomain con un archivo de configuración llamado web.config
, este no es un escenario probable). Esto evita tomar 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.
Si es posible, sugeriría tenerlo como un parámetro de entrada para algún método de inicialización en la biblioteca de clases que debería llamarse antes de que se pueda usar la biblioteca de clases.
Si esa no es una opción, vería HttpRuntime.Cache
que creo que no sería nulo, incluso si HttpRuntime.Current
es nulo. No soy un tipo de formularios web, pero recuerdo que alguien mencionó eso para una pregunta similar en algún lugar (no puedo encontrar esa pregunta ahora).
Solo para que nadie más cometa 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 de VS, no es nulo.
if(HttpRuntime.AppDomainAppId != null)
{
//is web app
}
else
{
//is windows app
}