.net - 한번만 - c# 특정시간 실행




스레드 또는 타이머에서 HttpServerUtility.MapPath 메서드에 액세스하는 방법? (4)

내 Asp.Net 응용 프로그램에서 System.Timers.Timer 를 사용하고 HttpContext.Current.Server.MapPath 통해서만 사용할 수있는 HttpServerUtility.MapPath 메서드를 사용해야합니다. 문제는 Timer.Elapsed 이벤트가 발생할 때 HttpContext.Currentnull 이라는 Timer.Elapsed 입니다.

HttpServerUtility 객체에 대한 참조를 얻는 다른 방법이 있습니까? 내 클래스 '생성자에 삽입 할 수 있습니다. 안전 해요 ? 현재 요청이 끝나면 쓰레기 수거가되지 않을 것이라고 어떻게 확신 할 수 있습니까?

감사!


HostingEnvironment는 모의하기 매우 어려운 클래스이기 때문에 완벽한 솔루션이 아닙니다 ( HostingEnvironment.MapPath를 사용하는 테스트 코드 단위 방법을 참조하십시오).

테스트 가능성이 필요한 사람들을 위해 더 나은 방법은 https://.com/a/1231962/85196 에서 제안한대로 자신의 경로 매퍼 인터페이스를 만드는 것일 수 있습니다.

public class ServerPathMapper : IPathMapper { 
 public string MapPath(string relativePath) { 
      return HostingEnvironment.MapPath(relativePath); 
 } 
} 

결과는 쉽게 조롱 할 수 있으며 HostingEnvironment를 내부적으로 사용하며 잠재적으로 ase69의 우려 를 동시에 해결할 수도 있습니다.


그 이유는 그 이유는 당신이 그것에 대해 생각한다면 그 이유는, 타이머 경과 이벤트가 HTTP 요청의 일환으로 발생하지 않는다는 것입니다 (따라서 컨텍스트가 없습니다) 생각합니다. 그것은 당신 서버의 어떤 것으로 인해 발생합니다.


타이머가 경과하면 현재 HTTP 컨텍스트가 없습니다. 이는 타이머 이벤트가 특정 HTTP 요청과 관련이 없기 때문입니다.

HTTP 컨텍스트를 사용할 수있는 HttpServerUtility.MapPath를 사용해야합니다. 요청 파이프 라인 이벤트 (예 : Page_Load) 중 하나에서 또는 Application_Start와 같은 Global.asax 이벤트에서이 작업을 수행 할 수 있습니다.

MapPath 결과를 Path.Combine을 사용하여 필요한 특정 파일의 위치를 ​​얻을 수있는 Timer.Elapsed 이벤트에서 액세스 할 수있는 변수에 할당합니다.


타이머를 시작하기 전에 MapPath 함수를 호출 할 수 없으며 단순히 결과를 캐시 할 수 있습니까? 진드기 이벤트 내에서 MapPath 호출을하는 것이 절대적으로 필요합니까?





httpcontext