Ответ 1
if(HttpRuntime.AppDomainAppId != null)
{
//is web app
}
else
{
//is windows app
}
В основной сборке, которая запускается как в службе Windows, так и в веб-приложении, мне нужно хранить информацию за сеанс пользователя. Служба будет иметь один сеанс пользователя, а веб-приложение использует HttpContext.Current.
Я хочу настроить, какой метод использовать в конфигурации ядра - соглашение по конфигурации. Я хочу сделать это только один раз, и я считаю, что HttpContext.Current будет null при запуске из Application_Start.
Как я могу уверенно определить, является ли приложение веб-приложением?
if(HttpRuntime.AppDomainAppId != null)
{
//is web app
}
else
{
//is windows app
}
Я поеду за
HostingEnvironment.IsHosted
Обратите внимание, что при использовании метода из сборки, как это, есть небольшие накладные расходы, даже если вы не собираетесь использовать его. (System.Web будет загружен, а несколько классов могут быть инициализированы и JITed.) Кроме того, теперь существует жесткая зависимость от System.Web, поэтому вы не можете использовать его в ограниченных настройках рамки (в настоящее время это относится только к профилю клиента).
Другой способ (хотя и не такой аккуратный и документированный), это проверить
Path.GetFileName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)
Если это возвращает web.config
(или вариант его варианта), это, вероятно, веб-приложение. (Хотя вы можете настроить любой appdomain с конфигурационным файлом с именем web.config
, это не является вероятным сценарием.) Это позволяет избежать зависимости от System.Web.
Однако HostingEnvironment.IsHosted
предназначен для указания того, настроен ли appdomain для запуска в ASP.NET.
Просто так никто другой не делает ту же ошибку, что и я.
Assembly.GetEntryAssembly() не работает, чтобы определить, есть ли его веб-приложение или нет. Когда он работает как служба, Assembly.GetEntryAssembly() являются нулевыми, но когда я отлаживаю от VS, он не является нулевым.
Если возможно, я предлагаю использовать его как входной параметр для некоторого метода инициализации в библиотеке классов, который нужно будет вызвать до того, как будет использована библиотека классов.
Если это не вариант, я бы посмотрел на HttpRuntime.Cache
, который, я думаю, был бы не нулевым, даже если HttpRuntime.Current
имеет значение null. Я не парень веб-форм, но я помню, что кто-то упоминал, что для подобного вопроса где-то где-то (не может найти этот вопрос сейчас).
В веб-приложении Assembly.GetEntryAssembly() имеет значение null. Я использую его в двух библиотеках, и до сих пор он отлично работает.