124 votes

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

Je suis en train de construire un site ASP.NET MVC où j'utilise Lucene.Net pour les requêtes de recherche. I a posé une question ici J'ai demandé comment structurer correctement l'utilisation de Lucene.Net dans une application ASP.NET MVC et on m'a répondu que la meilleure méthode consistait à déclarer l'option "my" de l'application. IndexWriter comme public static afin qu'il puisse être réutilisé.

Voici un peu de 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 writer est statique, IndexLocation doit é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'.

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

250voto

adrift Points 24386

Essayez HostingEnvironment.MapPath qui est static .

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

0 votes

Cette fonction m'a donné une erreur car le résultat retourné par HostingEnvironment.MapPath n'est pas le même que Server.MapPath, ce dernier retourne une url absolue et non une url relative.

0 votes

@john, j'obtiens la même valeur pour les deux.

55voto

panky sharma Points 379

Je pense que vous pouvez essayer ceci pour appeler d'une classe

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

* ----------------Désolé, j'oublie que la fonction statique a déjà répondu à la question. par dérive*

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

Mise à jour

J'ai eu une exception en utilisant System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

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

Solution (testée en statique webmethod)

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

1 votes

La seule fois où j'ai vu l'erreur que vous avez mentionnée dans votre mise à jour, c'est lorsque le code utilisait un chemin virtuel relatif. Par exemple, Server.MapPath() permet un chemin d'accès de "files/file1.doc". Il utilise le contexte actuel pour déterminer le chemin de la page actuelle, par exemple, et crée ensuite le chemin relatif à partir de là. Si nous sommes dans ~/Subfolder/Page1.aspx l'url serait de ~/Subfolder/files/file1.doc . Le site HostingEnviornment.MapPath() est statique, et requiert donc toujours le chemin virtuel complet, en commençant par le fichier ~/ de l'url.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X