¿Cómo puedo usar Server.MapPath () de global.asax?

122

Necesito usar Server.MapPath() para combinar algunas rutas de archivos que almaceno en web.config.

Sin embargo, desde Server.MapPath() basa en el HttpContext actual (creo), no puedo hacer esto. Cuando intento utilizar el método, aunque está "disponible", obtengo la siguiente excepción:

La operación del servidor no está disponible en este contexto.

¿Hay algún otro método que pueda asignar un directorio relativo a la raíz web, como ~/App_Data/la ruta física completa, como C:\inetpub\wwwroot\project\App_data\?

John Bubriski
fuente

Respuestas:

295

Puede probar System.Web.Hosting.HostingEnvironment.MapPath () .

No se requiere HttpContext.

Corbin March
fuente
¿Alguna advertencia sobre esta técnica?
John Bubriski
10
No Si enciende Reflector, notará que Server.MapPath y Request.MapPath finalmente llaman a VirtualPath.MapPath que finalmente llama a HostingEnvironment.MapPath. Todos terminan en el mismo lugar. HostingEnvironment.MapPath elimina al intermediario.
Corbin Marzo
1
Esto solucionó un proyecto de código abierto que funcionaba para mí y luego dejó de inicializarse debido a que HttpContext.Current.Server explotó porque no tenía un contexto por alguna razón. Cambiando a esto lo devolvió a la navegación sin problemas.
Chris Marisic
4

Uso AppDomain.CurrentDomain.BaseDirectoryporque Contextpodría volver nulo !!

Kiran Banda
fuente
1

Cuando esté en Global.asax, use el objeto de contexto :

context.Server.mappath ()

El contexto le permite acceder también a la colección de sesiones, el objeto de solicitud, el objeto de respuesta. Muy útil cuando quieres registrar errores, por ejemplo

tekBlues
fuente
No hay garantía Contexten Global.asax.
Anders Tornblad
-3

Podrías probar HttpContext.Current.Server.MapPath ("/") - Así es como lo he referenciado antes en las clases.

VoltaicShock
fuente
2
Puede hacer referencia a eso en clases que realmente TIENEN un HttpContext, pero no creo que global.asax tenga uno, de ahí el mensaje de error que recibí.
John Bubriski