Eu uso um System.Timers.Timer
no meu aplicativo Asp.Net e preciso usar o HttpServerUtility.MapPath
método que parece estar disponível apenas via HttpContext.Current.Server.MapPath
. O problema é que HttpContext.Current
é null
quando o Timer.Elapsed
evento é disparado.
Existe outra maneira de obter uma referência a um objeto HttpServerUtility? Eu poderia injetá-lo no construtor da minha classe. É seguro ? Como posso ter certeza de que não haverá coleta de lixo ao final da solicitação atual?
Obrigado!
fonte
Não sei se isso resolverá seu problema de diretórios virtuais, mas eu uso isso para MapPath:
fonte
HostingEnvironment não é a solução perfeita porque é uma classe muito difícil de simular (consulte Como fazer o teste de unidade de código que usa HostingEnvironment.MapPath ).
Para aqueles que precisam de testabilidade, uma maneira melhor pode ser criar sua própria interface de mapeador de caminhos, conforme proposto por https://stackoverflow.com/a/1231962/85196 , exceto implementá-la como
O resultado é facilmente mockable, usa HostingEnvironment internamente e pode até mesmo resolver o problema do ase69s ao mesmo tempo.
fonte
Você não pode chamar a função MapPath antes de iniciar o cronômetro e simplesmente armazenar em cache o resultado? É absolutamente necessário ter a chamada MapPath dentro do evento tick?
fonte
Quando o tempo passa, não há contexto HTTP atual. Isso ocorre porque os eventos do cronômetro não estão relacionados a uma solicitação HTTP específica.
O que você deve fazer é usar HttpServerUtility.MapPath onde o contexto HTTP está disponível. Você pode fazer isso em um dos eventos de pipeline de solicitação (como Page_Load) ou em um evento Global.asax como Application_Start.
Atribua o resultado MapPath a uma variável acessível a partir do evento Timer.Elapsed, onde você pode usar Path.Combine para obter a localização de um arquivo específico que você precisa.
fonte
Acho que o motivo pelo qual é nulo naquele momento (se você pensar sobre isso), é que o evento de tempo decorrido não ocorre como parte de uma solicitação HTTP (portanto, não há contexto). É causado por algo no seu servidor.
fonte