Utilisation de Server.MapPath () dans un champ statique dans ASP.NET MVC

116

Je construis un site ASP.NET MVC sur lequel j'utilise Lucene.Net pour les requêtes de recherche. J'ai posé une question ici sur la façon de structurer correctement l'utilisation de Lucene.Net dans une application ASP.NET MVC et on m'a dit que la meilleure méthode consiste à déclarer le my IndexWriteras public static, afin qu'il puisse être réutilisé.

Voici un code qui se trouve en haut de mon 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);

Comme writerc'est statique, IndexLocationdoit également être statique. Ainsi, le compilateur me donne l'erreur suivante pour Server.MapPath():

Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique 'System.Web.Mvc.Controller.Server.get'

Existe-t-il un moyen d'utiliser Server.MapPath () ou quelque chose de similaire à partir d'un champ statique ? Comment puis-je corriger cette erreur?

Maxim Zaslavsky
la source

Réponses:

240

Essayez HostingEnvironment.MapPath, ce qui est static.

Voir cette question SO pour une confirmation qui HostingEnvironment.MapPathrenvoie la même valeur que Server.MapPath: Quelle est la différence entre Server.MapPath et HostingEnvironment.MapPath?

Jeff Ogata
la source
Cette fonction m'a donné une erreur car le résultat returbé par HostingEnvironment.MapPath n'est pas le même que Server.MapPath, ce dernier retourne une url absolue et non une url relative
John
@john, j'obtiens la même valeur pour les deux.
ps2goat
45

Je pense que tu peux essayer ça pour appeler d'une classe

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

* ---------------- Désolé j'ai oublié, car la fonction statique a déjà répondu à la question à la dérive *

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

Mettre à jour

J'ai eu une exception lors de l'utilisation System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Détails Ex: System.ArgumentException: Le chemin virtuel relatif 'SignatureImages' n'est pas autorisé ici. à System.Web.VirtualPath.FailIfRelativePath ()

Solution (testée en méthode web statique)

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

panky sharma
la source
1
La seule fois où j'ai vu l'erreur que vous avez mentionnée dans votre mise à jour, c'est lorsque le code a utilisé un chemin virtuel relatif. Par exemple, Server.MapPath()autorise un chemin de "files / file1.doc". Il utilise le contexte actuel pour déterminer le chemin de la page actuelle, par exemple, puis crée le chemin relatif à partir de là. Si nous sommes ~/Subfolder/Page1.aspxdedans, l'URL mappera à partir de ~/Subfolder/files/file1.doc. Le HostingEnviornment.MapPath()est statique et requiert donc toujours le chemin virtuel complet, en commençant par la ~/partie de l'url.
ps2goat