Najpierw wklej kod, aby pobrać plik katalogu strony internetowej, w następujący sposób:
Po uruchomieniu tego zdania zostanie wyrzucony wyjątek, który stwierdzi, że obiekt jest pusty, jak pokazano na poniższym rysunku:
Dlaczego dostaję null?
Ponieważ wątek uruchamiający ten kod nie jest bieżącym wątkiem obsługującym bieżące żądanie
Dlaczego nie jest to null, skoro dostajesz go gdzie indziej?
Dzieje się tak ASP.NET ponieważ program już ustawił obiekt HttpContext na właściwość System.Runtime.Remoting.Messaging.CallContext.HostContext, o której wspomniałem wcześniej przed wywołaniem kodu.
HttpApplication posiada wewnętrzną metodę OnThreadEnter(), ASP. .NET wywołuje tę metodę, aby przełączyć HttpContext przed wywołaniem kodu zewnętrznego, na przykład za każdym razem, gdy wykonuje się obsługę zdarzeń potoku lub gdy kontekst synchronizacji (AspNetSynchronizationContext) wykonuje wywołanie zwrotne. Po zmianie właściwości CallContext.HostContext w wątku, nasz kod może uzyskać dostęp do referencji HttpContext. Uwaga: Odniesienie do HttpContext jest faktycznie zapisane w obiekcie HttpApplication.
Jak uzyskać absolutną ścieżkę pliku w tym przypadku?
Możemy uzyskać dostęp do System.Web.HttpRuntime.AppDomainAppPath, aby uzyskać ścieżkę główną programu, a następnie łączy względne ścieżki pliku
|