Użycie Server.MapPath () wewnątrz pola statycznego w ASP.NET MVC

116

Tworzę witrynę ASP.NET MVC, w której używam Lucene.Net do wyszukiwania zapytań. I zadał pytanie tutaj o tym, jak prawidłowo struktury zużycia Lucene.Net w aplikacji ASP.NET MVC i powiedziano mi, że najlepszą metodą jest zadeklarować moja IndexWriterjak public static, tak, że może on być ponownie użyte.

Oto kod, który znajduje się na górze mojego 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);

Ponieważ writerjest statyczny, IndexLocationmusi być również statyczny. W związku z tym kompilator podaje następujący błąd dla Server.MapPath():

Odwołanie do obiektu jest wymagane dla niestatycznego pola, metody lub właściwości „System.Web.Mvc.Controller.Server.get”

Czy istnieje sposób użycia Server.MapPath () lub czegoś podobnego z pola statycznego ? Jak mogę naprawić ten błąd?

Maxim Zaslavsky
źródło

Odpowiedzi:

240

Spróbuj HostingEnvironment.MapPath, co jest static.

Zobacz to pytanie SO, aby uzyskać potwierdzenie, które HostingEnvironment.MapPathzwraca tę samą wartość, co Server.MapPath: Jaka jest różnica między Server.MapPath i HostingEnvironment.MapPath?

Jeff Ogata
źródło
Ta funkcja spowodowała błąd, ponieważ wynik został ponownie wprowadzony przez HostingEnvironment.MapPath nie jest tym samym, co Server.MapPath, ten ostatni zwraca bezwzględny adres URL, a nie względny adres URL
Jan
@john, otrzymuję tę samą wartość dla obu.
ps2goat
45

Myślę, że możesz tego spróbować, dzwoniąc z klasy

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

* ---------------- Przepraszam za przeoczenie, ponieważ funkcja statyczna już odpowiedziała na pytanie przez dryf *

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

Aktualizacja

Wystąpił wyjątek podczas używania System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Ex szczegóły: System.ArgumentException: względna ścieżka wirtualna „SignatureImages” jest tutaj niedozwolona. w System.Web.VirtualPath.FailIfRelativePath ()

Rozwiązanie (przetestowane w statycznej metodzie internetowej)

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

panky sharma
źródło
1
Błąd, o którym wspomniałeś w aktualizacji, widziałem tylko wtedy, gdy kod używał względnej ścieżki wirtualnej. Na przykład Server.MapPath()zezwala na ścieżkę „pliki / plik1.doc”. Na przykład używa bieżącego kontekstu do określenia ścieżki bieżącej strony, a następnie tworzy ścieżkę względną z tego miejsca. Jeśli jesteśmy w ~/Subfolder/Page1.aspxśrodku, adres URL będzie mapowany z ~/Subfolder/files/file1.doc. HostingEnviornment.MapPath()Jest statyczny, a więc zawsze wymaga pełnej ścieżki wirtualnej, zaczynając od ~/części adresu URL.
ps2goat