Usando Server.MapPath () dentro de un campo estático en ASP.NET MVC


116

Estoy construyendo un sitio ASP.NET MVC donde estoy usando Lucene.Net para consultas de búsqueda. Hice una pregunta aquí sobre cómo estructurar correctamente el uso de Lucene.Net en una aplicación ASP.NET MVC y me dijeron que el mejor método es declarar my IndexWriteras public static, para que pueda reutilizarse.

Aquí hay un código que está en la parte superior de mi SearchController:

public static string IndexLocation = Server.MapPath("~/lucene");
public static Lucene.Net.Analysis.Standard.StandardAnalyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer();
public static IndexWriter writer = new IndexWriter(IndexLocation,analyzer);

Como writeres estático, IndexLocationtambién debe ser estático. Por lo tanto, el compilador me da el siguiente error para Server.MapPath():

Se requiere una referencia de objeto para el campo, método o propiedad no estática 'System.Web.Mvc.Controller.Server.get'

¿Hay alguna forma de usar Server.MapPath () o algo similar desde un campo estático ? ¿Cómo puedo solucionar este error?

Respuestas:


240

Prueba HostingEnvironment.MapPath, que es static.

Consulte esta pregunta SO para confirmar que HostingEnvironment.MapPathdevuelve el mismo valor que Server.MapPath: ¿Cuál es la diferencia entre Server.MapPath y HostingEnvironment.MapPath?


Esta función me dio un error como resultado devuelto por HostingEnvironment.MapPath no es lo mismo que Server.MapPath, este último devuelve una URL absoluta, no una URL relativa
Juan

@john, obtengo el mismo valor para ambos.
ps2goat

45

Creo que puedes probar esto para llamar desde una clase.

 System.Web.HttpContext.Current.Server.MapPath("~/SignatureImages/");

* ---------------- Perdón por descuido, para la función estática ya respondí la pregunta a la deriva *

System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Actualizar

Obtuve una excepción mientras usaba System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Detalles de Ex: System.ArgumentException: La ruta virtual relativa 'SignatureImages' no está permitida aquí. en System.Web.VirtualPath.FailIfRelativePath ()

Solución (probado en método web estático)

System.Web.HttpContext.Current.Server.MapPath("~/SignatureImages/"); Trabajó


1
La única vez que vi el error que mencionó en su actualización fue cuando el código usó una ruta virtual relativa. Por ejemplo, Server.MapPath()permite una ruta de "archivos / archivo1.doc". Utiliza el contexto actual para determinar la ruta de la página actual, por ejemplo, y luego crea la ruta relativa desde allí. Si estamos dentro ~/Subfolder/Page1.aspx, la URL se mapeará desde ~/Subfolder/files/file1.doc. El HostingEnviornment.MapPath()es estático y, por lo tanto, siempre requiere la ruta virtual completa, comenzando con la ~/parte de la URL.
ps2goat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.