2010-09-25 16 views
85

Buduję witrynę ASP.NET MVC, w której używam Lucene.Net do wyszukiwania zapytań. I asked a question here o tym, jak poprawnie zaprojektować wykorzystanie Lucene.Net w aplikacji ASP.NET MVC i powiedziano mi, że najlepszą metodą jest zadeklarowanie mojego IndexWriter jako public static, aby mógł być ponownie użyty.Używanie Server.MapPath() wewnątrz statycznego pola w ASP.NET MVC

Oto kod, który jest na szczycie mojej 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); 

Jak writer jest statyczna, IndexLocation musi być statyczna. Zatem, kompilator daje mi następujący błąd na Server.MapPath():

Odwołanie do obiektu jest wymagane dla pola non-statyczne, metoda lub właściwość „System.Web.Mvc.Controller.Server.get”

Czy istnieje sposób korzystania z Server.MapPath() lub coś podobnego ze statycznego pola? Jak mogę naprawić ten błąd?

Z góry dziękuję.

Odpowiedz

198

Wypróbuj HostingEnvironment.MapPath, który jest static.

Zobacz ten SO pytanie o potwierdzenie, że HostingEnvironment.MapPath zwraca taką samą wartość jak Server.MapPath: What is the difference between Server.MapPath and HostingEnvironment.MapPath?

+0

Funkcja ta dała mi błąd w rezultacie returbed przez HostingEnvironment.MapPath nie tak samo jak Server.MapPath, ten drugi zwraca bezwzględny adres URL, a nie względny adres URL: – John

+0

@john, otrzymuję tę samą wartość dla obu. – ps2goat

28

Myślę, że można spróbować to za telefon z klasy

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

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

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

Aktualizacja

mam wyjątek podczas korzystania System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

szczegóły Ex: System.ArgumentException: Względne ścieżki wirtualnej 'SignatureImages' nie jest tutaj. w System.Web.VirtualPath.FailIfRelativePath()

rozwiązanie (testowane w WebMethod statycznego)

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

+1

Jedyny przypadek, w którym zobaczyłem błąd, o którym wspomniałeś w swojej aktualizacji, to fakt, że kod użył względnej ścieżki wirtualnej. Na przykład 'Server.MapPath()' zezwala na ścieżkę "files/file1.doc". Używa bieżącego kontekstu, aby na przykład określić ścieżkę bieżącej strony, a następnie stamtąd tworzy ścieżkę względną. Jeśli jesteśmy w '~/Subfolder/Page1.aspx', adres URL będzie mapowany z' ~/Subfolder/files/file1.doc'. Funkcja 'HostingEnviornment.MapPath()' jest statyczna i dlatego zawsze wymaga pełnej wirtualnej ścieżki, zaczynając od części '~ /' adresu URL. – ps2goat

+0

Użyłem go i bez wątpienia nie zadziała. –

Powiązane problemy