Узнайте в Global.Asax - Application_Start, работает ли приложение ASP.NET локально

HttpContext.Current.Request.IsLocal недоступен в Global.Asax/Application_Start (запрос недоступен в контексте).

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

Это нужно для того, чтобы условно переписать мой web.config (в зависимости от того, развернуто ли приложение (удаленно) или тестируется (локально)).

Спасибо!


person Alex    schedule 21.05.2010    source источник
comment
Какая функция в Global.asax? Я считаю, что различные элементы доступны в зависимости от контекста. Я совершенно уверен, что HttpContext.Current.Request доступен в Application_Error, но не в других...   -  person David    schedule 22.05.2010
comment
Можно ли с ним работать в Application.BeginRequest? Там это доступно....   -  person David    schedule 22.05.2010
comment
Нет. Это для одноразовой операции с конфигурационным файлом. Application_Start выполняется один раз (по желанию) при запуске приложения, BeginRequest при каждом запросе к приложению (очень плохое место для одноразовой операции).   -  person Alex    schedule 22.05.2010
comment
Хорошая точка зрения. Просто мысли навскидку.   -  person David    schedule 22.05.2010
comment
Интересно, что HttpContext.Current.Request.IsLocal работает в Global.Asax, когда я запускаю приложение локально через VS, но не работает, когда оно развернуто на удаленном сервере.   -  person Alex    schedule 22.05.2010
comment
Странно, я думаю, это может быть связано с тем, что Cassini (или как он сейчас называется) запускается, когда вы запрашиваете просмотр файла в браузере (через F5). Я предполагаю, что, поскольку он начинается со всей информации, необходимой для построения запроса, он делает это перед запуском Application_Start. Хотя это только предположение :-)   -  person Owen    schedule 22.05.2010
comment
Если под переписыванием web.config вы подразумеваете, что вы измените web.config в файловой системе, это действительно не очень хорошая идея, потому что это приведет к перезапуску пула приложений, и вы будете делать это бесконечно.   -  person the berserker    schedule 30.10.2015
comment
Я сталкиваюсь с аналогичной проблемой при загрузке фоновой библиотеки (Hangfire), которую необходимо выполнить один раз, прежде чем будут выполняться какие-либо запросы. Я не знаю, каков ответ, но в этом случае, когда вы переписываете web.config, я бы не стал добавлять это в приложение. Это относится к типу развертывания (как и любое преобразование web.config) и должно быть частью вашего процесса развертывания. Вы упоминаете в другом месте, что это должно быть автоматизировано, и это нормально, поэтому используйте для этого TeamCity или Octopus. Перезапись web.config внутри приложения может вызвать рекурсивное переполнение.   -  person Bil Simser    schedule 14.02.2017


Ответы (2)


Событие Application_Start будет запущено, когда IIS/cassini/что угодно загрузит ваше приложение (задолго до того, как будут сделаны какие-либо HTTP-запросы).

Читая ваши комментарии, вы хотите, чтобы это была «однократная операция», что на самом деле не имеет смысла. Ваше приложение не столько "запускается локально", сколько может быть запрошено локально и/или удаленно несколько раз на протяжении своего жизненного цикла. Имея это в виду, вам нужно проверять каждый запрос, как прокомментировал Дэвид.

Может быть, было бы лучше, если бы вы немного подробнее объяснили, чего вы пытаетесь достичь?

person Owen    schedule 21.05.2010
comment
Оуэн - я добавил объяснение в свои комментарии (разовая операция над файлом конфигурации). Я переписываю части web.config условно, если приложение запускается удаленно (производство) или локально. Так что это абсолютно имеет смысл. BeginRequest определенно не подходит для этого. - person Alex; 22.05.2010
comment
Для таких вещей вам лучше использовать инструмент сценария сборки, такой как nant, или rake, который выводит правильные значения в вашей веб-конфигурации во время сборки. Но это будет зависеть от сложности вашего развертывания. - person Owen; 22.05.2010
comment
В качестве альтернативы вы можете проверить имя машины, под которой работает приложение, и загрузить соответствующую конфигурацию в зависимости от этого? - person Owen; 22.05.2010
comment
Мне это тоже не нравится, поскольку я пытаюсь полностью автоматизировать это. Как только я начну проверять жестко заданное значение (например, имя компьютера, флаг и т. д.), я потеряю это преимущество. - person Alex; 22.05.2010
comment
Алекс - когда приложение запускается, нет понятия локальный или удаленный, так как еще нет запроса. Звучит странно, но у вас может быть статическое логическое значение _isInitialized, а в BeginRequest проверить флаг и выполнить перезапись конфигурации и установить флаг, чтобы этого больше не происходило. Однако после этого первого запроса, если это локальный запрос, любые удаленные запросы к серверу будут выполняться в локальном режиме. - person Dave Thieben; 30.06.2010
comment
@dave thebin, это может вызвать множество проблем, если вы развернете свое приложение и подключитесь удаленно и нажмете его через локальный хост, тогда оно будет установлено в «локальный режим». Только реальные параметры проверяются по запросу, автоматизируют сборку перед развертыванием или проверяют имя машины или другое довольно постоянное значение env. Лично я бы сделал это шагом развертывания, но это только я. - person Owen; 03.07.2010
comment
@ Оуэн, я согласен, но это не то, о чем он просит. - person Dave Thieben; 03.07.2010

Это может быть более уместно проверить в методе BeginRequest вместо Application_Start, потому что первый запрос может быть локальным, но позже вы можете вызвать приложение в каком-то другом домене, и оно больше не будет локальным.

person Darin Dimitrov    schedule 22.05.2010
comment
Нет - см. мой вопрос и комментарии. Я хочу, чтобы обновленная конфигурация выполнялась ровно один раз при запуске приложения. - person Alex; 22.05.2010