Comment faire?
Je ne veux pas utiliser ceci:
HttpContext.Current.Server.MapPath
Y a-t-il une fonction similaire que je peux appeler sans nécessiter de httpcontext?
Par exemple, si un fil de départ fait quelques affaires, je ne peux pas utiliser le httpContext, mais je dois toujours obtenir le chemin de l'application. Et non, je ne peux pas transmettre le contexte comme un argument ou la lire à partir d'un VAR partagé.
Il y a plusieurs options:
WebApplication -> Web root folder
UnitTest -> ArgumentNullException
ConsoleApplication -> ArgumentNullException
appdomain.currentdomaine.basedirectory
WebApplication -> Web root folder
UnitTest -> ...\AppDir\bin\Debug
ConsoleApplication -> ...\AppDir\bin\Debug
hostingenvironment.applicationphysicalpath
WebApplication -> Web root folder
UnitTest -> null
ConsoleApplication -> null
Je recommanderais d'utiliser AppDomain.CurrentDomain.BaseDirectory, car il peut être utilisé dans n'importe quel type de projet et peut être configuré.
Vous pouvez par exemple définir une seule base de basé sur votre dossier racine Web. Appdomain.CurrentDomain.baseDirectory par commande:
AppDomain.CurrentDomain.SetData("APPBASE", "path to your web root");
J'ai rencontré cette question lorsque vous recherchez un moyen de calculer une URL (Permalinks dans l'application Web) à fournir dans certaines notifications de courrier électronique.
Celles-ci ont été générées sur un autre fil, alors HttpContext
n'était pas disponible et je souhaitais éviter de placer des informations liées à l'URL dans la table de file d'attente utilisée pour générer les courriers électroniques.
Le code:
public static String GetCurrentAppDomainBasePath(String prefix = "http://")
{
return String.Format("{0}{1}{2}",
prefix,
System.Net.Dns.GetHostEntry("").HostName,
System.Web.HttpRuntime.AppDomainAppVirtualPath
);
}
La fonction renvoie le chemin virtuel complet comme: http://full-Host-name/AppName
. Bien entendu, il existe certaines limitations: protocole codé dur (http
, https, etc.) et en utilisant hostname
au lieu de domain name
(échoue si plusieurs domaines sont définis sur une seule machine).