2010-01-29 38 views
7

Quiero ejecutar un "trabajo en segundo plano" en mi aplicación ASP.NET (periódicamente, como hilo separado). Y necesito el nombre de host (nombre DNS o IP) para hacer mis tareas. El problema es que el HttpContext.Current puede no estar disponible aquí (es NULL).Obtener nombre de host sin utilizar HttpRequest

¿Hay alguna manera de obtener un nombre de host en no usar HttpContext.Current.Request.Url.Host.

+1

al principio pensé Dns.GetHostName(), pero eso devuelve el nombre de host de la máquina, no necesariamente la URL de host de la solicitud (es decir, si tiene enlaces múltiples en IIS). Si todo lo que necesita es el nombre de host de la máquina, entonces puede usar Dns.GetHostName() –

Respuesta

7

Cuando el nombre de host está disponible en HttpContext.Request.Url.Host, es el resultado de que el nombre de host sea parte de la solicitud enviada por el cliente. A modo de ejemplo, tomar una solicitud a esta página:

 
GET /questions/2164261/get-host-name-without-using-httprequest HTTP/1.1 
Host: stackoverflow.com 
... 

Cuando se ejecuta en un subproceso en segundo plano, sin contexto de la petición está disponible, y realmente no hay concepto de un nombre de host en absoluto. Su única alternativa es almacenar el nombre de host dentro del código o en la configuración.

Tema ligeramente fuera de línea: ejecutar tareas programadas dentro de una aplicación web es buscar problemas, y los hilos de desove solo se ocupan de algunos de ellos. Si es posible, considere ejecutar sus trabajos programados desde un servicio de Windows, posiblemente construido usando un marco como NCron.

+3

+1 para el enlace de NCron, ojalá lo hubiera sabido hace un tiempo. –

+1

Hola Jorn, ¿podrías entrar en detalles sobre por qué la programación de trabajos regulares en un hilo de fondo es generalmente una mala idea? Siempre que los trabajos no requieran muchos recursos y, por lo tanto, no eliminen demasiados hilos valiosos del servidor, ¿qué problema esperaría? Pregunto porque recientemente desarrollé una solución así y no tuve ningún problema todavía. –

+0

@AdrianGrigore Tu grupo de aplicaciones podría reciclarse en momentos imprevistos y, a falta de solicitudes, es posible que tus trabajadores no se ejecuten. Aparte de eso, también considero esto posible y en muchos casos un enfoque razonable. Me gusta especialmente el fácil despliegue que viene con eso. – John

1

probablemente pueda agregar una variable de clase en su clase de subprocesos y establecer esta variable con request.url.host antes de ejecutar la clase de subproceso.

este método también se puede aplicar al objeto de sesión.

+0

En este caso, necesito esperar al menos una solicitud y solo luego comenzar el trabajo. No está bien. ¿Qué quiere decir "aplicar a la sesión"? No tengo acceso a la sesión, porque no tengo HttpContext. –

1

Tenga en cuenta que es una mala idea iniciar ese "trabajo en segundo plano" desde una aplicación web si necesita que el proceso en segundo plano se ejecute 24/7 de forma independiente. Incluso si lo comienzas en un nuevo hilo. Su aplicación web puede no tener solicitudes por algún tiempo. En este caso, el tiempo de ejecución cerrará el proceso y todos sus hilos "secundarios". Para una ejecución continua, debe ejecutarlo como un servicio de Windows. De lo contrario, Darren tiene razón, use System.Net.Dns.GetHostName().

0

Estoy utilizando el mismo enfoque que usted para programar tareas regulares y la forma en que trabajé en esto es almacenar el nombre de la máquina para su uso posterior cuando la aplicación recibe algún tipo de solicitud web.

Es un truco bastante sucio, pero la única forma de hacerlo es a menos que desee codificarlo o recuperarlo de un archivo de configuración externo, que era demasiado peligroso (no confiable) para mis propósitos.

Cuestiones relacionadas