Jak mogę używać Server.MapPath () z global.asax?


122

Muszę użyć Server.MapPath()do połączenia niektórych ścieżek plików, które przechowuję w web.config.

Jednak ponieważ Server.MapPath()opiera się na bieżącym HttpContext (myślę), nie mogę tego zrobić. Podczas próby użycia metody, mimo że jest „dostępna”, pojawia się następujący wyjątek:

Działanie serwera nie jest dostępne w tym kontekście.

Czy istnieje inna metoda, która może mapować katalog względny głównego katalogu WWW, na przykład ~/App_Data/pełną ścieżkę fizyczną, na przykład C:\inetpub\wwwroot\project\App_data\?

Odpowiedzi:


295

Możesz spróbować System.Web.Hosting.HostingEnvironment.MapPath () .

Nie jest wymagany HttpContext.


Jakieś zastrzeżenia do tej techniki?
John Bubriski

10
Nie. Jeśli uruchomisz Reflector, zauważysz, że Server.MapPath i Request.MapPath ostatecznie wywołują VirtualPath.MapPath, który ostatecznie wywołuje HostingEnvironment.MapPath. Wszystkie kończą w tym samym miejscu. HostingEnvironment.MapPath wycina środkowego człowieka.
Corbin marzec

1
+1 to naprawiło projekt open source, który działał dla mnie, a następnie po prostu przestał się inicjować z powodu wysadzenia HttpContext.Current.Server, ponieważ z jakiegoś powodu nie miał kontekstu. Przejście na to przywróciło płynność żeglugi.
Chris Marisic

4

Użyj, AppDomain.CurrentDomain.BaseDirectoryponieważ Contextmoże zwrócić wartość null !!


1

W Global.asax użyj obiektu kontekstu :

context.Server.mappath ()

Kontekst umożliwia również dostęp do kolekcji sesji, obiektu żądania, obiektu odpowiedzi. Bardzo przydatne, gdy chcesz na przykład rejestrować błędy


W ContextGlobal.asax nie ma gwarancji .
Anders Tornblad

-3

Możesz spróbować HttpContext.Current.Server.MapPath („/”) - w ten sposób odwoływałem się do niego wcześniej w klasach.


2
Możesz odwoływać się do tego w ten sposób w klasach, które faktycznie MAJĄ HttpContext, ale nie sądzę, by global.asax go miał, stąd otrzymałem komunikat o błędzie.
John Bubriski
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.