스레드 또는 타이머에서 HttpServerUtility.MapPath 메서드에 액세스하는 방법은 무엇입니까?
System.Timers.Timer
내 Asp.Net 응용 프로그램에서를 사용하고 .NET HttpServerUtility.MapPath
을 통해서만 사용할 수 있는 방법 을 사용해야합니다 HttpContext.Current.Server.MapPath
. 문제는 즉 HttpContext.Current
인 null
경우 Timer.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) 또는 Global.asax 이벤트 (예 : Application_Start)에서 수행 할 수 있습니다.
Timer.Elapsed 이벤트에서 액세스 할 수있는 변수에 MapPath 결과를 할당합니다. 여기서 Path.Combine을 사용하여 필요한 특정 파일의 위치를 가져올 수 있습니다.
그 당시에 null 인 이유는 (생각하면) 타이머 경과 이벤트가 HTTP 요청의 일부로 발생하지 않기 때문이라고 생각합니다 (따라서 컨텍스트가 없음). 서버의 문제로 인해 발생합니다.
'IT story' 카테고리의 다른 글
코드 골프 : Collatz 추측 (0) | 2020.09.12 |
---|---|
읽을 수있는 / 계층 적 형식으로 배열 표시 (0) | 2020.09.12 |
CMD 셸의 여유 공간 (0) | 2020.09.11 |
문자열에서 '-'문자를 제거하는 jQuery (0) | 2020.09.11 |
문자열에있는 모든 문자의 색인 (0) | 2020.09.11 |