스레드 또는 타이머에서 HttpServerUtility.MapPath 메서드에 액세스하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/111927

문제

나는 System.Timers.Timer 내 Asp.Net 응용 프로그램에서 다음을 사용해야 합니다. HttpServerUtility.MapPath 를 통해서만 사용할 수 있는 것으로 보이는 방법 HttpContext.Current.Server.MapPath.문제는 HttpContext.Current ~이다 nullTimer.Elapsed 이벤트가 발생합니다.

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

감사해요!

도움이 되었습니까?

해결책

사용이 가능해요 HostingEnvironment.MapPath() 대신에 HttpContext.Current.Server.MapPath()

하지만 스레드나 타이머 이벤트에서는 아직 시도하지 않았습니다.


내가 고려한 일부 (실행 가능하지 않은) 솔루션;

  • 내가 관심을 갖는 유일한 방법 HttpServerUtility ~이다 MapPath.그래서 대안으로 나는 사용할 수 있습니다 AppDomain.CurrentDomain.BaseDirectory 그리고 이것으로부터 내 길을 건설하십시오. 하지만 앱이 가상 디렉터리를 사용하면 실패합니다. (내 것이 그렇습니다).

  • 또 다른 접근법:필요한 모든 경로를 Global 수업.다음 경로를 해결하세요. Application_Start.

다른 팁

이것이 가상 디렉터리 문제를 해결할 수 있을지는 모르겠지만 저는 이것을 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('/', '\\');
}

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

테스트 가능성이 필요한 사람들을 위해 더 좋은 방법은 제안한 대로 자신만의 경로 매퍼 인터페이스를 만드는 것입니다. https://stackoverflow.com/a/1231962/85196, 다음과 같이 구현하는 것을 제외하고

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

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

타이머를 시작하기 전에 MapPath 함수를 호출하지 않고 단순히 결과를 캐시할 수 있습니까?틱 이벤트 내에서 MapPath 호출이 반드시 필요합니까?

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

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

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

그 당시에 null인 이유는(생각해 보면) 타이머 경과 이벤트가 HTTP 요청의 일부로 발생하지 않기 때문이라고 생각합니다(따라서 컨텍스트가 없음).서버의 문제로 인해 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top