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

Réponses:


295

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

Aucun HttpContext requis.


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 !!


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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.