2012-01-12 24 views
14

Uso de la solicitud actual que puedo conseguir con el nombre de host URL:Determine el nombre de host URL sin usar HttpContext.Current?

HttpContext.Current.Request.Url.Host 

Pero - me necesitan para determinar el nombre de host URL sin el uso de la petición actual (HttpContext.Current). La razón de esto es que mi código se llama desde SqlDependency en la devolución de llamada onChange para cuando se encuentra una Dependencia de SQL. Aunque el código reside en mi aplicación web, no hay solicitud, y HttpContext.Current es nulo.

Tenía la esperanza de poder tomarlo desde HttpRuntime, pero no parece haber nada de uso allí. ¿Hay alguna manera de obtener esta información?

+0

Uno de nuestros sitios web responde a cualquier nombre de host proporcionado. Sin inspeccionar la solicitud entrante, sería difícil determinar el nombre de host utilizado para contactarnos. – spender

+0

¿Qué intenta hacer y exactamente cuándo se está ejecutando su código? ¿Está en el evento OnChange de SqlDependency, en onRemoveCallback de caché de aplicaciones o en otro lugar? – Journey

+0

Se ha editado la pregunta para mayor claridad –

Respuesta

3

Si conoce el anfitrión de este momento se está configurando el controlador de eventos, entonces debería ser capaz de hacer algo como (código realidad no probado):

string host = HttpContext.Current.Request.Url.Host; 
var dep = new SqlDependency(cmd); 
dep.OnChange += ((sender, args) => 
{ 
    DoStuff(host); 
}); 
+0

Saludos, estaba llegando a esto también, así que suponiendo que puedo mover mi código de Application_OnStart a algo como Session_OnStart (para hacer que el objeto Request esté disponible), puedo pasar el host como me sugiera. –

4

¿Qué tal

Environment.MachineName 
+0

Lo siento, esto no funcionará, tengo varias instancias en el mismo cuadro, con diferentes enlaces de host (site1.xxx.com, site2.xxx.com etc.) –

+0

Me pregunto si es posible entonces para determinar el contexto bajo el cual se ejecuta su código si falta el HttpContext (como usted dijo). –

1

Se debe utilizar la API de IIS para consultar la información de la página web que estás buscando. Porque dependiendo de la configuración de IIS, su URL o nombre de host podrían ser diferentes. (Piense en hostheaders, puertos, protocolos y cosas como esta.

Una introducción para la API de IIS se podría encontrar en http://learn.iis.net/page.aspx/165/how-to-use-microsoftwebadministration/

+0

Parece la única manera de hacerlo, sin embargo, requiere permisos adicionales para interrogar a IIS, por lo que creo que debo ver si puedo solucionar este problema. –

6

Si está ejecutando esto desde una aplicación web, y todo es código administrado entonces HttpContext debe existe. ¿Su biblioteca secundaria (suponiendo que su código administrado está en una biblioteca) tiene una referencia a System.Web? De lo contrario, considere agregar esta referencia. Desde ese punto, debe poder acceder al HttpContext directamente utilizando el espacio de nombres completamente calificado. :

System.Web.HttpContext.Current.Request.Url.Host 

En cualquier caso, a menos que su código no esté administrado o su estafa el texto realmente no se origina con una aplicación web, HttpContext debería estar disponible en cada punto mientras el hilo esté activo.

Editar:
Sobre la base de la lectura de su comentario a continuación, parece que la SqlDependency está siendo despedido de forma independiente. Si bien está en el mismo hilo, no está siendo despedido directamente por la solicitud. Como todo lo que está buscando es la URL del host, no es inconcebible que pueda crear una variable de aplicación o una variable estática para contener esta información en el caso de que se necesite para una dependencia.

También algo que he visto es que mientras HttpContext.Current puede no estar disponible, HttpContext.Request podría ser. Estos deberían ser el mismo objeto, pero pueden no ser necesariamente. Es posible que el Anfitrión se encuentre allí.

+1

HttpContext existe, pero HttpContext.Current (que es la solicitud actual) no lo hace, porque el código en la aplicación web no se desencadena por una solicitud, se desencadena por la devolución de llamada de Dependencia de SQL, por lo tanto, es nulo. –

+0

¿Puedes establecer un campo de página en 'HttpContext.Current' (por ejemplo, _currentContext) y acceder a él en la devolución de llamada? – jrummell

+0

@MattRoberts: Publicó una edición. –

Cuestiones relacionadas