web-dev-qa-db-ja.com

httpcontextを使用せずにアプリケーションパスを取得します。 (asp.net)

どうやってするの?

これを使いたくない:

HttpContext.Current.Server.MapPath

Httpcontextを必要とせずに呼び出すことができる同様の関数はありますか?

たとえば、何かを実行しているスレッドを開始する場合、httpcontextを使用できませんが、それでもアプリのパスを取得する必要があります。また、コンテキストを引数として渡したり、共有変数から読み取ることはできません。

49
Tomasi

使用 - HttpRuntime.AppDomainAppPath プロパティ。

72
SLaks

いくつかのオプションがあります:

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

いくつかの電子メール通知で提供する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を使用(単一のマシンで複数のドメインが定義されている場合は失敗)。

1
Alexei