Usando Server.MapPath () dentro de um campo estático na ASP.NET MVC

116

Estou construindo um site ASP.NET MVC onde estou usando Lucene.Net para consultas de pesquisa. Eu fiz uma pergunta aqui sobre como estruturar adequadamente o uso do Lucene.Net em um aplicativo ASP.NET MVC e me disseram que o melhor método é declarar o my IndexWriteras public static, para que ele possa ser reutilizado.

Aqui está um código que está na parte superior do meu 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 writeré estático, IndexLocationtambém deve ser estático. Portanto, o compilador está me dando o seguinte erro para Server.MapPath():

É necessária uma referência de objeto para o campo, método ou propriedade não estático 'System.Web.Mvc.Controller.Server.get'

Existe uma maneira de usar Server.MapPath () ou algo semelhante de um campo estático ? Como posso corrigir esse erro?

Maxim Zaslavsky
fonte

Respostas:

240

Experimente HostingEnvironment.MapPath, o que é static.

Consulte esta pergunta do SO para confirmação que HostingEnvironment.MapPathretorna o mesmo valor de Server.MapPath: Qual é a diferença entre Server.MapPath e HostingEnvironment.MapPath?

Jeff Ogata
fonte
Esta função me deu um erro porque o resultado alterado por HostingEnvironment.MapPath não é o mesmo que Server.MapPath, o último retorna um url absoluto, não um url relativo
John
@john, obtenho o mesmo valor para ambos.
ps2goat
45

Acho que você pode tentar fazer isso ligando de uma aula

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

* ---------------- Desculpe esqueci, para a função estática já respondi a pergunta à deriva *

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

Atualizar

Eu tive uma exceção ao usar System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Detalhes Ex: System.ArgumentException: O caminho virtual relativo 'SignatureImages' não é permitido aqui. em System.Web.VirtualPath.FailIfRelativePath ()

Solução (testado em webmethod estático)

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

sharma panky
fonte
1
A única vez que vi o erro que você mencionou em sua atualização foi quando o código usou um caminho virtual relativo. Por exemplo, Server.MapPath()permite um caminho de "arquivos / arquivo1.doc". Ele usa o contexto atual para determinar o caminho da página atual, por exemplo, e então cria o caminho relativo a partir daí. Se estivermos em ~/Subfolder/Page1.aspx, o url será mapeado de ~/Subfolder/files/file1.doc. O HostingEnviornment.MapPath()é estático e, portanto, sempre requer o caminho virtual completo, começando com a ~/parte da url.
ps2goat