Как узнать, является ли текущее приложение веб-приложением ASP.NET?

Из библиотеки управляемых классов я хотел бы узнать, является ли исполняемое приложение в настоящее время веб-приложением ASP.NET(веб-формы или MVC) или нет.

Я видел разные подходы к этому, например. путем проверки одного из следующих значений:

  • System.Web.Hosting.HostingEnvironment.IsHosted == true
  • System.Web.HttpContext.Current != null
  • System.Web.HttpRuntime.AppDomainAppId != null
  • System.Web.HttpRuntime.Cache != null
  • проверка файла web.config (примечание: я не считаю это надежным)

Вопрос в том, какой подход я должен использовать? Являются ли некоторые из них недействительными (например, могут ли они возвращать true даже при работе в приложении Windows) или все они равны?


Обновление/уточнение (извините, если мой вопрос не был достаточно ясным):

  • У меня есть библиотека управляемых классов (.net-код), которая запускается приложением .net(очевидно)
  • это "хост-приложение" может быть либо ASP.NET-приложением (например, веб-формами или MVC), либо приложением Windows (например, консоль или формы выигрыша).
  • мой вопрос: есть ли способ надежно определить из моей библиотеки классов (во время выполнения), выполняется ли она как часть приложения ASP.NET?

Примечание. Я знаю, что могу реализовать другое решение (например, см. комментарии ниже или ответ Томаса Ликена), но это не вопрос этого вопроса. Библиотека классов уже существует, и я хотел бы изменить как можно меньше кода!

Ответ 1

Потенциально Не надежно. MSDN подразумевает, что это всегда будет возвращать новый объект, если он уже не существует. Таким образом, есть технически моменты, когда вы можете назвать это и не существовать до его вызова.

    System.Web.Hosting.HostingEnvironment.IsHosted == true

Все веб-среды нуждаются в контексте. Какой обработчик внутри этого контекста - это то, что говорит вам тип веб-среды. (Например, MvcHandler). Обратите внимание, что это могут быть разные типы обработчиков для одной и той же среды. Например, вы можете запускать MVC и веб-формы. Это зависит только от того, что в настоящее время обслуживается, и от используемого конвейера.

    System.Web.HttpContext.Current != null

Все веб-приложения нуждаются в идентификаторе приложения. Он уникален и не изменяется при перезапуске пулов приложений.

    System.Web.HttpRuntime.AppDomainAppId != null

Я этого никогда не видел, хотя логически я могу представить себе время, когда кеш не используется и, следовательно, не будет надежным.

    System.Web.HttpRuntime.Cache != null

Вы правы.

проверка файла web.config(примечание: я не считаю это надежным)

Я использую что-то подобное в библиотеке. Я нашел его надежным.

         Page page = (HttpContext.Current != null && HttpContext.Current.Handler != null) ? HttpContext.Current.Handler as Page : null;
         if (HttpRuntime.AppDomainAppId != null && page != null)
         {
            //I'm a web forms application
         }
         else if (HttpRuntime.AppDomainAppId != null && page == null && HttpContext.Current != null) { throw new InvalidOperationException("I'm an MVC application"); }
         else throw new InvalidOperationException("Im not ASP.Net web");

Ответ 2

Я должен задать вам свою задачу: зачем библиотеке знать, из какого приложения она работает?

Мне кажется, вам нужно разделить соответствующую часть вашей библиотеки на две части - одну для использования с веб-приложениями и одну для использования с приложениями winforms. (И, возможно, третья часть, со всем, что может использоваться обоими типами приложений...)

Ответ 3

Во-первых, я согласен, что вопрос "неправильный". В вашей библиотеке все равно. Во-вторых, как показано ниже, существует несколько эвристик, но в конечном счете нет действительно хорошего способа узнать. Ваш вопрос не дает понять, почему вы хотите узнать или подтвердить это.

Тем не менее, если бы это был я, я бы, вероятно, посмотрел на System.Web.HttpContext.Current, если бы я беспокоился о текущем запросе, или System.Web.HttpRuntime.AppDomainAppId, если бы мне нужна общая проверка.

НЕТ ГАРАНТИЙ. Вероятно, это плохая идея.

От Stefan от команды ASP.NET:

Если это веб-приложение и его управляемый управляемый код, вероятность 99,9999% его ASP.NET -). Если он имеет в виду нечто иное, например, глядя на метабазы ​​IIS и пытается выяснить, действительно ли приложение приложение ASP.NET или нет - тогда потребуется какая-то эвристика. Например, для данного приложения в конфигурации IIS/metbase получите физический корень приложения - тогда посмотрите и посмотрите, если web.config, *.aspx, *.ashx и т.д. существуют в папке или любой из вложенные папки. Если да, то это, скорее всего, ASP.NET выражение. К сожалению, этого недостаточно. без каких-либо данных конфигурации, хранящихся в IIS. каждый пул приложений имеет связанную версию CLR, даже если код всегда запускается в пуле приложений. А вторая ASP.NET интеграция с IIS включена на компьютере, по умолчанию список модулей/обработчиков включает все записи ASP.NET.

В случае библиотеки эвристика, которую я описал, будет способом идти.

В настоящее время, правда, что такое "приложение ASP.NET"? В эти дни я могу придерживаться классического .asp, ASP.NET, статического HTML и php. в ту же самую структуру vdir и все функции полукогерентно как одно "приложение".