Verwenden von Server.MapPath () in einem statischen Feld in ASP.NET MVC

116

Ich erstelle eine ASP.NET MVC-Site, auf der ich Lucene.Net für Suchanfragen verwende. Ich habe hier eine Frage gestellt, wie die Verwendung von Lucene.Net in einer ASP.NET MVC-Anwendung richtig strukturiert werden kann, und mir wurde gesagt, dass die beste Methode darin besteht, my IndexWriterals zu deklarieren public static, damit es wiederverwendet werden kann.

Hier ist ein Code, der sich oben in meinem SearchController befindet:

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);

Wie writerstatisch, IndexLocationmuss auch statisch sein. Daher gibt mir der Compiler den folgenden Fehler Server.MapPath():

Für das nicht statische Feld, die Methode oder die Eigenschaft 'System.Web.Mvc.Controller.Server.get' ist eine Objektreferenz erforderlich.

Gibt es eine Möglichkeit, Server.MapPath () oder ähnliches aus einem statischen Feld zu verwenden ? Wie kann ich diesen Fehler beheben?

Maxim Zaslavsky
quelle

Antworten:

240

Versuchen Sie HostingEnvironment.MapPath, was ist static.

In dieser SO-Frage finden Sie eine Bestätigung, HostingEnvironment.MapPathdie denselben Wert zurückgibt wie Server.MapPath: Was ist der Unterschied zwischen Server.MapPath und HostingEnvironment.MapPath?

Jeff Ogata
quelle
Diese Funktion gab mir einen Fehler, da das von HostingEnvironment.MapPath zurückgegebene Ergebnis nicht mit Server.MapPath identisch ist. Letzteres gibt eine absolute URL zurück, keine relative URL
John
@ John, ich bekomme für beide den gleichen Wert.
ps2goat
45

Ich denke, Sie können dies versuchen, um aus einer Klasse anzurufen

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

* ---------------- Sorry ich übersehen, für statische Funktion hat die Frage bereits von adrift beantwortet *

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

Aktualisieren

Ich habe eine Ausnahme bei der Verwendung System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Ex-Details: System.ArgumentException: Der relative virtuelle Pfad 'SignatureImages' ist hier nicht zulässig. bei System.Web.VirtualPath.FailIfRelativePath ()

Lösung (getestet in statischer Webmethode)

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

Panky Sharma
quelle
1
Das einzige Mal, dass ich den Fehler sah, den Sie in Ihrem Update erwähnt haben, war, als der Code einen relativen virtuellen Pfad verwendete. Server.MapPath()Ermöglicht beispielsweise den Pfad "files / file1.doc". Es verwendet beispielsweise den aktuellen Kontext, um den Pfad der aktuellen Seite zu bestimmen, und erstellt dann den relativen Pfad von dort. Wenn wir in sind ~/Subfolder/Page1.aspx, würde die URL von abbilden ~/Subfolder/files/file1.doc. Das HostingEnviornment.MapPath()ist statisch und erfordert daher immer den vollständigen virtuellen Pfad, beginnend mit dem ~/Teil der URL.
ps2goat