web-dev-qa-db-fra.com

Obtenez un chemin d'application sans utiliser httpcontext. (asp.net)

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é.

49
Tomasi

Il y a plusieurs options:

httpruntime.appdomainappath

    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");
56
Tomas Kubes

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

1
Alexei