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\?

John Bubriski
źródło

Odpowiedzi:

295

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

Nie jest wymagany HttpContext.

Corbin March
źródło
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 !!

Kiran Banda
źródło
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

tekBlues
źródło
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.

VoltaicShock
źródło
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