Получить путь к приложению без использования httpcontext. (Asp.net) - PullRequest
49 голосов
/ 09 марта 2010

Как это сделать?

Я не хочу использовать это:

HttpContext.Current.Server.MapPath

Есть ли подобная функция, которую я могу вызвать без httpcontext?

Например, если я запускаю поток, делающий что-то, я не могу использовать httpcontext, но мне все равно нужно узнать путь приложения. И нет, я не могу передать контекст в качестве аргумента или прочитать его из общей переменной.

Ответы [ 3 ]

72 голосов
/ 09 марта 2010

Используйте свойство HttpRuntime.AppDomainAppPath.

56 голосов
/ 02 марта 2014

Есть несколько вариантов:

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, чтобы он указывал в корневой веб-папке AppDomain.CurrentDomain.BaseDirectory с помощью команды:

AppDomain.CurrentDomain.SetData("APPBASE", "path to your web root");
1 голос
/ 18 марта 2016

Я столкнулся с этим вопросом, когда искал способ вычисления URL-адреса (постоянные ссылки в веб-приложении) для предоставления в некоторых уведомлениях по электронной почте.

Они были сгенерированы в другом потоке, поэтому 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 и т. Д.) И использование hostname вместо domain name (происходит сбой, если на одной машине определено несколько доменов).

...