2009-06-01 13 views
109

Necesito usar Server.MapPath() para combinar algunos archivos de ruta que almaceno en el web.config.¿Cómo puedo usar Server.MapPath() desde global.asax?

Sin embargo, dado que Server.MapPath() se basa en el HttpContext actual (creo), no puedo hacer esto. Al intentar usar el método, aunque está "disponible", recibo la siguiente excepción:

El funcionamiento del servidor no está disponible en este contexto.

¿Hay otro método que puede trazar un directorio raíz web relativa como ~/App_Data/ a la ruta física completa como C:\inetpub\wwwroot\project\App_data\?

Respuesta

266

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

No HttpContext required.

+0

¿Tiene alguna advertencia sobre esta técnica? –

+9

No. Si activa 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 corta al intermediario. –

+1

+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 contexto por algún motivo. Cambiando a esto ponlo de nuevo para navegar sin problemas. –

-3

Puede probar HttpContext.Current.Server.MapPath ("/") - Así es como lo he mencionado anteriormente en las clases.

+2

Puede hacer referencia así en las clases que realmente TIENEN un HttpContext, pero no creo que global.asax tenga uno, de ahí el mensaje de error que recibí. –

1

Cuando en Global.asax, utilice el contexto objeto:

context.Server.mappath()

Contexto también le permite acceder a la colección de la sesión, el objeto de la petición, el objeto respuesta . Muy útil cuando desea registrar errores, por ejemplo

+0

No hay un 'Contexto' garantizado en Global.asax. –

3

Use AppDomain.CurrentDomain.BaseDirectory porque Context podría devolver nulo !!

Cuestiones relacionadas