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?

Maxim Zaslavsky
fuente

Respuestas:

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ó

panky sharma
fuente
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