2010-08-23 15 views
10

Tengo algunos procesos que se ejecutan sin un HttpContext en una aplicación web ASP.NET MVC. Este proceso debe poder determinar la ruta física al directorio de contenido de la aplicación para leer/escribir datos. Pero, dado que es sin HttpContext, no consigo usar cosas sofisticadas como Server.MapPath y tal. Sugerencias?¿Cómo se determina la ruta física de un archivo sin HttpContext?

+1

Incluso si 'HttpContext.Current' puede ser nulo,' Server.MapPath' seguirá funcionando. Si no lo "tiene", ¿tal vez quiere decir que no ve la referencia a 'System.Web'? – Abel

+0

@Abel: "No tendrá" una referencia a "Servidor" para usar .MapPath en, por ejemplo, un constructor estático, porque "Servidor" es una propiedad de HttpContext.Current (y también una propiedad de HttpApplication), tampoco de los cuales estará disponible de manera confiable en dicho contexto estático. "Servidor" es del tipo "HttpServerUtility" cuyo constructor es interno, por lo que no puede usarlo a menos que pueda obtenerlo desde HttpContext.Current o HttpApplication en Global.asax. Por lo tanto, HttpRuntime.AppDomainAppPath es lo que debe usarse, tal como lo publicó en su respuesta a continuación. – Triynko

Respuesta

12

En una página web, lo mejor es utilizar HttpRuntime.AppDomainAppPath, ya que en ciertos momentos de la ruta de ejecución (es decir, cuando el sitio se pone en marcha), no hay HttpContext.Current disponible.

Véase también this post.

+3

¿Por qué es HttpRuntime.AppDomainPath mejor que AppDomain.BaseDirectory? ' – Matt

+4

Debido a su semántica. Cuando estás dentro de HttpRuntime, es mejor preguntarle al tiempo de ejecución el camino correcto, en lugar de hurgar a tu alrededor. Además, hace que tu código sea más legible y tu intención sea más clara. Finalmente, las implementaciones pueden cambiar, pero incluso en ese caso, HttpRuntime aún devolverá la ruta correcta y AppDomain no lo hará (lo mismo puede aplicarse al raro caso en el que haya iniciado un dominio de aplicación separado). – Abel

+0

Gracias. Edité arriba porque en realidad es AppDomainAppPath no AppDomainPath (al menos en .NET4) – Matt

4

La mejor manera de hacerlo es usando la propiedad AppDomain.BaseDirectory. Siempre que no juegue con dominios de aplicaciones personalizadas, apuntará a su directorio raíz de aplicaciones. En otras palabras; estos dos cuerdas sería la misma:

string mapUsingAppDomain = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Contents"); 
string mapUsingServer = HttpContext.Current.Server.MapPath("~/Contents"); 
+0

Gracias amable señor – Matt

+2

En un sitio web, se prefiere utilizar 'HttpRuntime.AppDomainPath', que se garantiza que devolverá la ruta correcta. Pero driis tiene razón, puedo pensar en muy pocos casos en que estos métodos puedan devolver algo diferente. – Abel

Cuestiones relacionadas