Utilizo un System.Timers.Timer
en mi aplicación Asp.Net y necesito usar el HttpServerUtility.MapPath
método que parece estar solo disponible a través de HttpContext.Current.Server.MapPath
. El problema es que HttpContext.Current
es null
cuando Timer.Elapsed
se dispara el evento.
¿Hay otra forma de obtener una referencia a un objeto HttpServerUtility? Podría inyectarlo en el constructor de mi clase. Es seguro ? ¿Cómo puedo estar seguro de que no se recopilará basura al final de la solicitud actual?
¡Gracias!
fuente
No sé si esto resolverá su problema de directorios virtuales, pero lo uso para MapPath:
public static string MapPath(string path) { if (HttpContext.Current != null) return HttpContext.Current.Server.MapPath(path); return HttpRuntime.AppDomainAppPath + path.Replace("~", string.Empty).Replace('/', '\\'); }
fuente
HostingEnvironment no es la solución perfecta porque es una clase muy difícil de burlar (consulte Cómo probar un código que usa HostingEnvironment.MapPath ).
Para aquellos que necesitan capacidad de prueba, una mejor manera podría ser crear su propia interfaz de mapeador de rutas según lo propuesto por https://stackoverflow.com/a/1231962/85196 , excepto implementarlo como
public class ServerPathMapper : IPathMapper { public string MapPath(string relativePath) { return HostingEnvironment.MapPath(relativePath); } }
El resultado es fácilmente burlable, utiliza HostingEnvironment internamente e incluso podría abordar la preocupación de ase69s al mismo tiempo.
fuente
¿No puede llamar a la función MapPath antes de iniciar el temporizador y simplemente almacenar en caché el resultado? ¿Es absolutamente necesario tener la llamada MapPath dentro del evento tick?
fuente
Cuando transcurre el tiempo, no hay contexto HTTP actual. Esto se debe a que los eventos del temporizador no están relacionados con una solicitud HTTP específica.
Lo que debe hacer es usar HttpServerUtility.MapPath donde el contexto HTTP está disponible. Puede hacerlo en uno de los eventos de canalización de solicitudes (como Page_Load) o en un evento Global.asax como Application_Start.
Asigne el resultado de MapPath a una variable accesible desde el evento Timer.Elapsed, donde podría usar Path.Combine para obtener la ubicación de un archivo específico que necesita.
fuente
Creo que la razón por la que es nulo en ese momento (si lo piensa) es que el evento transcurrido del temporizador no ocurre como parte de una solicitud HTTP (por lo tanto, no hay contexto). Es causado por algo en su servidor.
fuente