2012-03-02 5 views
23

No estoy seguro de que esto sea posible, pero estoy esperando una pista para determinar si el código que se está ejecutando actualmente se está ejecutando bajo IIS Express. Mi mejor aproximación hasta el momento, que es increíblemente hacker y sin duda fallará/descanso en algún momento:Programmatically determine si el código se está ejecutando en IIS Express

bool IsExpress = 
    Request.ServerVariables["SERVER_SOFTWARE"] == "Microsoft-IIS/7.5" 
    && Int32.Parse(Request.ServerVariables["INSTANCE_ID"]) > 1000000000; 

Desde luego, tiene que haber una mejor manera. Mi examen de los objetos Application, Server y Request no pareció revelar nada que pudiera proporcionar una mejor idea. Tal vez solo necesito ver otro objeto?

Actualización:

estoy realmente ansioso por ver si hay una manera de detectar esto - es muy académica en este momento no tengo una sensación de ardor que usarlo. La pregunta original está en pie. Pero en el espíritu de responder a los comentarios, específicamente estoy interesado en responder a una crítica de otra pregunta/respuesta en este sitio: How to search the server's MIME map. La crítica es que la respuesta publicada no funciona para IIS Express, solo las instancias tradicionales de IIS. IIS Express almacena la configuración MIME en el archivo XML applicationhost.config y me gustaría actualizar esa respuesta para proporcionar una forma de devolver esa información para IIS Express también. Ciertamente podría simplemente agregar un código que tome el valor apropiado del XML (¡Yay para LINQ to XML!) Pero realmente me gustaría hacerlo más inteligente. Para ser claros, no necesito ayuda para analizar ese archivo, solo algo más elegante al tratar de detectar si el código se está ejecutando actualmente en el motor IIS Express.

Actualización 2:

IIS 8.0 Beta expreso era released this week, y va más allá para demostrar que el enfoque en mi pregunta es frágil y se romperá. Si bien no es un factor decisivo para apuntar a una versión específica, sería bueno contabilizar eso y tratar de garantizar que el código funcionará con al menos las versiones conocidas de hoy.

+0

¿cuál es su objetivo? ¿Por qué quieres detectar esto (quizás hay alguna otra forma de lograr tu objetivo)? – Yahia

+5

Si se está ejecutando en IIS Express, ¿qué quiere manejar de forma diferente? Tal vez esa es la pregunta que debe hacer en lugar de cómo detectar IIS Express. "¿Cómo hago ____ en lugar de _____ cuando se ejecuta en depuración?", Por ejemplo. –

+0

El deseo se centra en examinar algunos elementos de configuración, utilizando DirectoryEntry ("IIS:/localhost/W3SVC /") y analizando el XML en applicationhost.config que controla IIS Express. – Goyuix

Respuesta

24

¿Comprobar el nombre del proceso actual, hacer el truco?

bool isExpress = 
    String.Compare(Process.GetCurrentProcess().ProcessName,"iisexpress") == 0; 

Normal IIS se ejecuta en w3wp.exe de memoria.

+1

Es 'w3wp' para IIS 7.5 - pero no estoy seguro acerca de las diferentes versiones de IIS. Sé que es algo diferente para las versiones antiguas de IIS ... – debracey

+1

@debracey yes para versiones anteriores será 'aspnet_wp.exe'. – Strelok

+0

El único problema potencial que he encontrado con este enfoque es que la clase System.Diagnostics.Process requiere plena confianza. De lo contrario, parece estar funcionando como un encanto. – Goyuix

2

Si no le importa caer en las API de nivel COM, puede utilizar la API de la versión de IIS

http://msdn.microsoft.com/en-us/library/gg418429.aspx

Hay una cierta discusión acerca de cómo esto se ha utilizado en este SO de la publicación: Starting and stopping IIS Express programmatically - - No es exactamente lo que quieres, pero discuten el uso de la API.

Editar: Debo añadir que no lo he probado, pero parece prometedor, ¡buena suerte!

+0

Intenté esta API, pero tenía dos reservas: una marcada como "no destinada a ser utilizada directamente desde el código", no es un factor decisivo, pero tampoco es alentador. Dos No estoy seguro de cómo (o incluso si puede) conectar el código que se está ejecutando actualmente a una instancia devuelta desde la API. Tal vez haciendo coincidir las URL o algo así. – Goyuix

+0

No estoy seguro de lo que está obteniendo, pero lo que haría es extraer la versión de IIS en su código (quizás en su propia 'enum' administrada) cuando se inicie el grupo de aplicaciones, y luego almacenar eso en una variable estática - - No deje de consultar la API COM cada vez. El tipo de servidor obviamente no puede cambiar sin reiniciar su aplicación. – debracey

+0

Si actualizo la clase IISVersionManager, puedo obtener una lista de instancias de IIS disponibles en la máquina, pero no tengo forma de correlacionar esa interfaz de IISVersion con el código que se está ejecutando dentro de una instancia de IIS. Realmente no veo cómo esta API COM me ayuda a saber si el código que se está ejecutando está dentro de IIS Express o no, no solo que IIS Express está disponible. Tal vez una muestra de código ayudaría a aclarar lo que está sugiriendo? – Goyuix

2

¿No podemos intentar y ver si uno o más limitation of IIS Express funciona o no, si funciona no es IIS Express. Ejemplo IIS Express no es compatible con los servicios de Sharepoint

+0

¿Podría compartir cuál de esas limitaciones específicas (u otras) cree que podría probar de manera confiable? – Goyuix

+0

algún tipo de consulta, digamos variables de entorno% IISBin% sería una buena pista? o consulta el servicio de punto compartido y, si el resultado no es compatible, excepción, sabemos que estamos en IIS Express –

+0

Probando para% IIS_BIN%, parece que solo IIS Express establece esa variable. El único problema es que la clase EnvironmentPermission puede configurarse para denegar el acceso a esas variables. No tengo ni idea de lo que quiere decir con "consulta para compartir el servicio de punto": SharePoint es un producto que puede instalar, no algo nativo de IIS. – Goyuix

Cuestiones relacionadas