Как узнать, является ли текущее приложение веб-приложением 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 и все функции полукогерентно как одно "приложение".
Ответ 4
Это может быть полезно:
Как определить, выполняется ли сборка .NET с веб-сайта или с настольного компьютера?
if(HttpRuntime.AppDomainAppId != null)
{
//is web app
}
else
{
//is windows app
}