Ответ 1
Используйте свойство HttpRuntime.AppDomainAppPath
.
Как это сделать?
Я не хочу использовать это:
HttpContext.Current.Server.MapPath
Есть ли аналогичная функция, которую я могу вызвать, не требуя httpcontext?
Например, если начать поток, выполняющий некоторые вещи, которые я не могу использовать httpcontext, но мне все равно нужно получить путь к приложению. И я не могу передать контекст в качестве аргумента или прочитать его из общего var.
Используйте свойство 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");
Я столкнулся с этим вопросом при поиске способа вычисления 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
. Конечно, существуют некоторые ограничения: hardcoded protocol (http
, https и т.д.) И использование hostname
вместо domain name
(сбой, если несколько доменов определены на одной машине).