2012-04-19 10 views
14

Mi código C# puede estar ejecutándose dentro de una aplicación MVC3 bajo IIS (actualmente es 7.5, pero me gustaría no depender de una versión específica) o en otro lugar.¿Cómo puede encontrar mi código si se ejecuta dentro de IIS?

Parece que una forma de saber que el código se está ejecutando en IIS es to check the current process name, pero este enfoque depende de tener una cadena de nombre de archivo codificada.

¿Hay alguna forma programática para detectar que mi código se ejecuta bajo IIS y no depende de la versión de IIS?

Respuesta

27

Tener un vistazo a la clase HostingEnvironment, especialmente el método IsHosted.

Esto le dirá si está alojado en un ApplicationManager, que le dirá si está siendo alojado por ASP.NET.

Estrictamente, no le dirá que se está ejecutando bajo IIS, pero creo que esto realmente satisface mejor sus necesidades.

código Ejemplo:

// Returns the file-system path for a given path. 
public static string GetMappedPath(string path) 
{ 
    if (HostingEnvironment.IsHosted) 
    { 
     if (!Path.IsPathRooted(path)) 
     { 
      // We are about to call MapPath, so need to ensure that 
      // we do not pass an absolute path. 
      // 
      // We use HostingEnvironment.MapPath, rather than 
      // Server.MapPath, to allow this method to be used 
      // in application startup. Server.MapPath calls 
      // HostingEnvironment.MapPath internally. 
      return HostingEnvironment.MapPath(path); 
     } 
     else { 
      return path; 
     } 
    } 
    else 
    { 
     throw new ApplicationException (
       "I'm not in an ASP.NET hosted environment :-("); 
    } 
} 
-1

Eche un vistazo a la clase ServiceController. El nombre del servicio aún estará codificado, pero las posibilidades de que el servicio cambie de nombre son relativamente bajas.

También es posible usar netstat -ab para averiguar lo que se ejecuta en el puerto 80.

+1

El hecho de que IIS se está ejecutando en el puerto 80 no significa que su aplicación está alojado en IIS. Lo contrario también es cierto: IIS podría estar ejecutándose en cualquier otro puerto (por ejemplo, 8080) –

+0

Verdadero. Es por eso que se recomienda la clase ServiceController. – pikzen

+2

Todo lo que ServiceController puede hacer es decirle si el servicio IIS se está ejecutando, no si el código actual se está ejecutando en ese IIS. – Mark

Cuestiones relacionadas