2009-11-24 8 views
12

¿Alguien puede decirme si hay una forma de obtener el nombre de dominio de mi sitio en el evento Application_Start en el archivo global.asax?Global ASAX: obtenga el nombre del servidor

Normalmente lo obtendría de Context.Request.ServerVariables ["SERVER_NAME"], pero esto no está disponible. Idealmente, también me gustaría obtener la URL de la solicitud que inició la aplicación.


Hmm - a partir de las respuestas a continuación, parecería que al estar en IIS7 hace una diferencia aquí. Esto es nuevo y ahora hay directrices de diseño para probar y que deje de hacerlo:

IIS Blog

Respuesta

21

Puede acceder a la Context a través de la HttpContext.Current miembro estático.

HttpContext.Current.Request.ServerVariables["SERVER_NAME"]; 
HttpContext.Current.Request.Url; 

Editar, basado en algunas de sus comentarios me hicieron una investigación adicional

Este error se debe a un cambio de diseño en la tubería IIS7 integrado que hace que el contexto de la petición no está disponible en caso Application_Start. Al usar el modo Clásico (el único modo cuando se ejecuta en versiones anteriores de IIS), el contexto de solicitud solía estar disponible, incluso aunque el evento Application_Start siempre se haya concebido como un evento global y de solicitud independiente en la vida útil de la aplicación. A pesar de esto, dado que las aplicaciones ASP.NET siempre se iniciaron con la primera solicitud a la aplicación, antes era posible acceder al contexto de la solicitud a través del campo estático HttpContext.Current.

lo que tiene dos opciones

  1. cambiar su código de aplicación a no usar el contexto de la petición (recomendado).
  2. Mueva la aplicación al modo Clásico (NO recomendado).

http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart/

+2

No creo que hay una HttpContext en Application_Start – Luk

+2

@Luk - HttpContext.Current es un miembro estático. No importa en qué alcance se encuentre. Está allí. Si tiene problemas con él, califíquelo completamente System.Web.HttpContext.Current – Bob

+4

Si hago esto, aparece un error de tiempo de ejecución que indica que Request no está disponible en este contexto. La calificación no hace diferencia. – Paddy

-3

Ha intentado: -

System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"] 

Gracias,

Phil.

+0

+1 Sorprendentemente esto funciona incluso en 'Application_Start' donde' HttpContext.Current.Request' es 'null'. Resulta que 'ServerVariables' es una variable estática (también conocida como global). – Andomar

+4

-1: Bajo las circunstancias de la Q (IIS> = 7 & modo integrado), esto fallará de la misma manera. – Richard

4

Supongo que está en IIS 7? Porque HttpContext está disponible allí en IIS 6.0.

¿Puede considerar completar esa información más adelante? La primera llamada al Application_BeginRequest por ejemplo?

+0

Estoy en IIS7, qué interesante ... Actualmente estoy usando Application_BeginRequest, pero prefiero tener este código que necesito ejecutar una vez en el evento correcto. – Paddy

+0

@Downvoter: ¿dónde estoy equivocado? Estoy bastante seguro de que no puedes acceder a él antes de BeginRequest en IIS7 – Luk

+0

Tienes un tiempo para cancelar eso ... Pareces ser la respuesta correcta. – Paddy

0

¿Tiene acceso al objeto Request en absoluto? Si es así, creo que podría usar Request.Url.Authority

Devolverá el nombre de host del DNS que es lo que está buscando.

G

14

Su aplicación web podría ejecutarse en varios dominios diferentes.Como no existe una solicitud actual en el evento Application_Start, no puede saber bajo qué dominio se llamará la aplicación.

Sin embargo, puede encontrar el nombre de la máquina usando System.Environment.MachineName.

3

En VB.NET, en Global.asax, utilizo el siguiente:

Hosting.HostingEnvironment.ApplicationHost.GetSiteName 

Se corresponde con el nombre de la aplicación en IIS.

ACTUALIZACIÓN: Parece el método "GetSiteName" no está destinado a ser llamado directamente y ya no funciona para mí en Visual Studio 2015 (o tal vez es debido a que el cambio de versión marco hice). Me fijo reemplazándolo por:

System.Web.Hosting.HostingEnvironment.SiteName 
Cuestiones relacionadas