Как определить, является ли приложение веб-приложением

В основной сборке, которая запускается как в службе Windows, так и в веб-приложении, мне нужно хранить информацию за сеанс пользователя. Служба будет иметь один сеанс пользователя, а веб-приложение использует HttpContext.Current.

Я хочу настроить, какой метод использовать в конфигурации ядра - соглашение по конфигурации. Я хочу сделать это только один раз, и я считаю, что HttpContext.Current будет null при запуске из Application_Start.

Как я могу уверенно определить, является ли приложение веб-приложением?

Ответ 1

if(HttpRuntime.AppDomainAppId != null)
{
  //is web app
}
else
{
  //is windows app
}

Ответ 2

Я поеду за

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.

Ответ 3

Просто так никто другой не делает ту же ошибку, что и я.

Assembly.GetEntryAssembly() не работает, чтобы определить, есть ли его веб-приложение или нет. Когда он работает как служба, Assembly.GetEntryAssembly() являются нулевыми, но когда я отлаживаю от VS, он не является нулевым.

Ответ 4

Если возможно, я предлагаю использовать его как входной параметр для некоторого метода инициализации в библиотеке классов, который нужно будет вызвать до того, как будет использована библиотека классов.

Если это не вариант, я бы посмотрел на HttpRuntime.Cache, который, я думаю, был бы не нулевым, даже если HttpRuntime.Current имеет значение null. Я не парень веб-форм, но я помню, что кто-то упоминал, что для подобного вопроса где-то где-то (не может найти этот вопрос сейчас).

Ответ 5

В веб-приложении Assembly.GetEntryAssembly() имеет значение null. Я использую его в двух библиотеках, и до сих пор он отлично работает.