Comment puis-je utiliser Server.MapPath () depuis global.asax?

122

Je dois utiliser Server.MapPath()pour combiner certains chemins de fichiers que je stocke dans le web.config.

Cependant, comme Server.MapPath()repose sur le HttpContext actuel (je pense), je suis incapable de le faire. Lorsque j'essaie d'utiliser la méthode, même si elle est «disponible», j'obtiens l'exception suivante:

Le fonctionnement du serveur n'est pas disponible dans ce contexte.

Existe-t-il une autre méthode qui peut mapper un répertoire relatif racine Web tel que ~/App_Data/le chemin d'accès physique complet tel que C:\inetpub\wwwroot\project\App_data\?

John Bubriski
la source

Réponses:

295

Vous pouvez essayer System.Web.Hosting.HostingEnvironment.MapPath () .

Aucun HttpContext requis.

Corbin mars
la source
Des mises en garde à cette technique?
John Bubriski
10
Nan. Si vous lancez Reflector, vous remarquerez que Server.MapPath et Request.MapPath appellent finalement VirtualPath.MapPath qui appelle finalement HostingEnvironment.MapPath. Ils finissent tous au même endroit. HostingEnvironment.MapPath élimine les intermédiaires.
Corbin mars
1
+1 cela a corrigé un projet open source qui fonctionnait pour moi, puis s'est arrêté de s'initialiser en raison de l'explosion de HttpContext.Current.Server car il n'avait pas de contexte pour une raison quelconque. Passer à cela a permis de retrouver une navigation fluide.
Chris Marisic
4

Utilisez AppDomain.CurrentDomain.BaseDirectoryparce que Contextpeut retourner null !!

Kiran Banda
la source
1

Dans Global.asax, utilisez l' objet context :

context.Server.mappath ()

Le contexte vous permet d'accéder également à la collection de sessions, à l'objet de requête, à l'objet de réponse. Très utile lorsque vous souhaitez enregistrer des erreurs, par exemple

tekBlues
la source
Il n'y a pas de garantie Contextdans Global.asax.
Anders Tornblad
-3

Vous pouvez essayer HttpContext.Current.Server.MapPath ("/") - C'est ainsi que je l'ai référencé auparavant dans les classes.

VoltaicShock
la source
2
Vous pouvez le référencer comme ça dans les classes qui ont en fait un HttpContext, mais je ne pense pas que global.asax en ait un, d'où le message d'erreur que j'ai reçu.
John Bubriski