どうやってするの?
これを使いたくない:
HttpContext.Current.Server.MapPath
Httpcontextを必要とせずに呼び出すことができる同様の関数はありますか?
たとえば、何かを実行しているスレッドを開始する場合、httpcontextを使用できませんが、それでもアプリのパスを取得する必要があります。また、コンテキストを引数として渡したり、共有変数から読み取ることはできません。
使用 - 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
WebApplication -> Web root folder
UnitTest -> null
ConsoleApplication -> null
AppDomain.CurrentDomain.BaseDirectoryを使用することをお勧めします。これは、あらゆるタイプのプロジェクトで使用でき、設定できるためです。
たとえば、次のコマンドでUnitTest BaseDirectoryを設定して、WebルートフォルダーをAppDomain.CurrentDomain.BaseDirectoryに指定できます。
AppDomain.CurrentDomain.SetData("APPBASE", "path to your web root");
いくつかの電子メール通知で提供するURL(Webアプリケーションのパーマリンク)を計算する方法を探しているときに、この質問に遭遇しました。
これらは別のスレッドで生成されたため、HttpContext
は利用できず、電子メールの生成に使用されるキューテーブルにURL関連の情報を入れないようにしました。
コード:
public static String GetCurrentAppDomainBasePath(String prefix = "http://")
{
return String.Format("{0}{1}{2}",
prefix,
System.Net.Dns.GetHostEntry("").HostName,
System.Web.HttpRuntime.AppDomainAppVirtualPath
);
}
この関数は、http://full-Host-name/AppName
のような完全な仮想パスを返します。もちろん、いくつかの制限があります:ハードコードされたプロトコル(http
、httpsなど)およびdomain name
の代わりにhostname
を使用(単一のマシンで複数のドメインが定義されている場合は失敗)。