Utilizzo di Server.MapPath () all'interno di un campo statico in ASP.NET MVC


116

Sto costruendo un sito ASP.NET MVC in cui utilizzo Lucene.Net per le query di ricerca. Ho posto una domanda qui su come strutturare correttamente l'utilizzo di Lucene.Net in un'applicazione ASP.NET MVC e mi è stato detto che il metodo migliore è dichiarare il mio IndexWritercome public static, in modo che possa essere riutilizzato.

Ecco del codice che si trova nella parte superiore del mio 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);

Come writerè statico, IndexLocationdeve essere anche statico. Pertanto, il compilatore mi dà il seguente errore per Server.MapPath():

È richiesto un riferimento a un oggetto per il campo, il metodo o la proprietà non statici "System.Web.Mvc.Controller.Server.get"

Esiste un modo per utilizzare Server.MapPath () o qualcosa di simile da un campo statico ? Come posso correggere questo errore?

Risposte:


240

Prova HostingEnvironment.MapPath, che è static.

Vedere questa domanda SO per la conferma che HostingEnvironment.MapPathrestituisce lo stesso valore di Server.MapPath: Qual è la differenza tra Server.MapPath e HostingEnvironment.MapPath?


Questa funzione mi ha dato un errore in quanto il risultato ripristinato da HostingEnvironment.MapPath non è lo stesso di Server.MapPath, quest'ultimo restituisce un url assoluto non relativo
John

@john, ottengo lo stesso valore per entrambi.
ps2goat

45

Penso che tu possa provare questo per chiamare da una classe

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

* ---------------- Scusate la supervisione, poiché la funzione statica ha già risposto alla domanda alla deriva *

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

Aggiornare

Ho avuto un'eccezione durante l'utilizzo System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Dettagli es: System.ArgumentException: il percorso virtuale relativo "SignatureImages" non è consentito qui. in System.Web.VirtualPath.FailIfRelativePath ()

Soluzione (testata in metodo web statico)

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


1
L'unica volta che ho visto l'errore che hai menzionato nel tuo aggiornamento è stato quando il codice utilizzava un percorso virtuale relativo. Ad esempio, Server.MapPath()consente un percorso di "file / file1.doc". Utilizza il contesto corrente per determinare il percorso della pagina corrente, ad esempio, e quindi crea il percorso relativo da lì. Se siamo in ~/Subfolder/Page1.aspx, l'URL verrebbe mappato da ~/Subfolder/files/file1.doc. Il HostingEnviornment.MapPath()è statico, e quindi richiede sempre il percorso virtuale completo, a partire dalla ~/parte dell'url.
ps2goat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.