2010-03-09 4 views
45

Wie geht das?Anwendungspfad ohne Verwendung von httpcontext abrufen. (asp.net)

Ich möchte dies nicht verwenden:

HttpContext.Current.Server.MapPath 

Gibt es eine ähnliche Funktion, die ich, ohne dass eine Httpcontext anrufen kann?

Zum Beispiel wenn ich einen Thread starte, der einige Sachen macht, kann ich den httpcontext nicht benutzen, aber ich muss immer noch den Pfad der App finden. Und nein, ich kann den Kontext nicht als Argument übergeben oder aus einer gemeinsamen Variablen lesen.

Antwort

69

Verwenden Sie die HttpRuntime.AppDomainAppPath-Eigenschaft.

+0

+1 Gut zu wissen. Vielen Dank. – Saar

+0

Danke, ich wusste nicht einmal, dass diese Klasse existiert. – Tomasi

+2

Es ist eine Low-Level-Klasse, die die meisten Menschen nicht verwenden müssen. – SLaks

49

Es gibt mehrere Möglichkeiten:

HttpRuntime.AppDomainAppPath

WebApplication  -> Web root folder 
    UnitTest   -> ArgumentNullException 
    ConsoleApplication -> ArgumentNullException 

AppDomain.CurrentDomain.BaseDirectory

WebApplication  -> Web root folder 
    UnitTest   -> ...\AppDir\bin\Debug 
    ConsoleApplication -> ...\AppDir\bin\Debug 

HostingEnvironment.ApplicationPhysicalPath

Ich würde AppDomain.CurrentDomain.BaseDirectory verwenden, da es in jeder Art von Projekt verwendet werden kann und es eingerichtet werden kann.

Sie können zum Beispiel festlegen Unittest Basedirectory Ihren Web-Stammordner der AppDomain.CurrentDomain.BaseDirectory durch Befehl Punkt:

AppDomain.CurrentDomain.SetData("APPBASE", "path to your web root"); 
0

ich auf diese Frage laufen haben, wenn Sie Weg, um eine URL (Permalinks berechnen in Web-Anwendung), die in einigen E-Mail-Benachrichtigungen enthalten sein soll.

Diese wurden auf einem anderen Thread generiert, so HttpContext war nicht verfügbar, und ich wollte vermeiden, URL-bezogene Informationen in die Queue-Tabelle, die zum Generieren der E-Mails verwendet werden.

Der Code:

public static String GetCurrentAppDomainBasePath(String prefix = "http://") 
{ 
    return String.Format("{0}{1}{2}", 
     prefix, 
     System.Net.Dns.GetHostEntry("").HostName, 
     System.Web.HttpRuntime.AppDomainAppVirtualPath 
    ); 
} 

Die Funktion gibt den vollständigen virtuellen Pfad wie: http://full-host-name/AppName. Natürlich gibt es einige Einschränkungen: fest codiertes Protokoll (http, https usw.) und Verwendung von hostname anstelle von domain name (schlägt fehl, wenn mehrere Domänen auf einer einzigen Maschine definiert sind).