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?

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?


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.