programing

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

css3 2023. 6. 29. 20:17

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

사용합니다.System.Timers.Timer나의 Ap에서.인터넷 애플리케이션과 나는 사용해야 합니다.HttpServerUtility.MapPath를 통해서만 사용할 수 있는 것처럼 보이는 방법.HttpContext.Current.Server.MapPath문제는HttpContext.Current이라null그 때Timer.Elapsed화재 사건

HttpServerUtility 개체에 대한 참조를 얻을 수 있는 다른 방법이 있습니까?우리 반의 컨스트럭터에 주입할 수 있습니다.그것은 안전한가요?현재 요청이 끝날 때 가비지 수집이 되지 않는지 확인하려면 어떻게 해야 합니까?

감사합니다!

사용할 수 있습니다.HostingEnvironment.MapPath()대신에HttpContext.Current.Server.MapPath()

아직 스레드나 타이머 이벤트에서 시도해 본 적은 없습니다.


제가 고려한 몇 가지 (실행 가능하지 않은) 해결책;

  • 내가 신경 쓰는 유일한 방법은HttpServerUtility이라MapPath그래서 제가 다른 대안으로 사용할 수 있습니다.AppDomain.CurrentDomain.BaseDirectory여기서부터 내 길을 닦는 거지그러나 앱에서 가상 디렉터리를 사용하는 경우에는 실패합니다(내 디렉터리).

  • 또 다른 접근 방식: 필요한 모든 경로를 데이터 센터에 추가합니다.Globalclass. 이 경로들을 해결합니다.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를 사용하는 테스트 코드를 구성하는 방법 참조). 경로).

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

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

결과는 쉽게 조롱할 수 있고, 내부적으로 호스팅 환경을 사용하며, 69s의 문제를 동시에 해결할 수도 있습니다.

타이머를 시작하기 전에 MapPath 함수를 호출하지 말고 결과만 캐시할 수 있습니까?틱 이벤트 내에서 MapPath 호출이 꼭 필요합니까?

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

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

MapPath 결과를 Timer에서 액세스할 수 있는 변수에 할당합니다.경로를 사용할 수 있는 경과 이벤트입니다.결합하여 필요한 특정 파일의 위치를 가져옵니다.

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

언급URL : https://stackoverflow.com/questions/111927/how-to-access-the-httpserverutility-mappath-method-in-a-thread-or-timer