Использование Server.MapPath () внутри статического поля в ASP.NET MVC

116

Я создаю сайт ASP.NET MVC, где использую Lucene.Net для поисковых запросов. Я задал здесь вопрос о том, как правильно структурировать использование Lucene.Net в приложении ASP.NET MVC, и мне сказали, что лучший метод - объявить my IndexWriteras public static, чтобы его можно было использовать повторно.

Вот код, который находится в верхней части моего 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);

Как writerстатический, он IndexLocationтакже должен быть статическим. Таким образом, компилятор выдает следующую ошибку Server.MapPath():

Ссылка на объект требуется для нестатического поля, метода или свойства System.Web.Mvc.Controller.Server.get.

Есть ли способ использовать Server.MapPath () или что-то подобное из статического поля ? Как исправить эту ошибку?

Максим Заславский
источник

Ответы:

240

Попробуйте HostingEnvironment.MapPath, что есть static.

См. Этот вопрос SO для подтверждения, которое HostingEnvironment.MapPathвозвращает то же значение, что и Server.MapPath: В чем разница между Server.MapPath и HostingEnvironment.MapPath?

Джефф Огата
источник
Эта функция дала мне ошибку, так как результат, возвращенный HostingEnvironment.MapPath, не совпадает с Server.MapPath, последний возвращает абсолютный URL-адрес, а не относительный URL-адрес
Джон
@john, я получаю одинаковое значение для обоих.
ps2goat
45

Я думаю, вы можете попробовать это, чтобы позвонить из класса

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

* ---------------- Извините, я недосмотрел, для статической функции уже ответил на вопрос по течению *

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

Обновить

У меня исключение при использовании System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Сведения об Ex: System.ArgumentException: относительный виртуальный путь SignatureImages здесь не допускается. в System.Web.VirtualPath.FailIfRelativePath ()

Решение (проверено статическим веб-методом)

System.Web.HttpContext.Current.Server.MapPath("~/SignatureImages/"); Работал

панки шарма
источник
1
Единственный раз, когда я видел ошибку, которую вы упомянули в своем обновлении, - это когда код использовал относительный виртуальный путь. Например, Server.MapPath()разрешает путь «files / file1.doc». Он использует текущий контекст, например, для определения пути к текущей странице, а затем создает оттуда относительный путь. Если мы находимся ~/Subfolder/Page1.aspx, URL-адрес будет отображаться из ~/Subfolder/files/file1.doc. Объект HostingEnviornment.MapPath()статичен и, следовательно, всегда требует полного виртуального пути, начиная с ~/части URL-адреса.
ps2goat