Application_Start не стреляет?

143

У меня есть приложение ASP.NET MVC (бета), над которым я работаю, и мне сложно определить, что я делаю не так, или мой Application_Startметод в Global.asax.cs фактически не запускается при попытке отладить приложение.

Я ставлю точку останова в строке в моем Application_Startметоде и ожидаю, что при попытке отладки приложения точка останова попадет ... но это никогда не происходит. Не после перезагрузки IIS, не после перезагрузки, никогда. Я что-то упускаю? Почему этот метод никогда не вызывается?

Боб Йексли
источник
Ваша страница global.asax наследует от глобального класса, в котором находится ваш метод?
Я отскочил в случае, когда global.asaxфайл просто отсутствовал. так что это также стоит проверить :-)
itho

Ответы:

85

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

В Visual Studio вы можете прикрепить отладчик к процессу. Это можно сделать, нажав Отладка >> Присоединить к процессу. Присоединитесь к браузеру, а затем нажмите ваше приложение. Чтобы быть в безопасности, перезапустите IIS и перейдите на сайт. Я не уверен на 100%, что это решит проблему, но это будет намного лучше, чем запуск потока сна в App_Start.

Другой вариант - временно разместить встроенный веб-сервер до завершения отладки приложения.

Грегори Бимер
источник
21
чтобы развернуть - (в VS2010, используя тип проекта MVC 3) щелкните правой кнопкой мыши веб-проект> свойства> веб (вкладка) и убедитесь, что выбран переключатель «Использовать Visual Studio Development Server». Тогда ваши точки останова Application_Start должны быть выполнены очень хорошо.
MemeDeveloper
Спасибо @MemoDeveloper !! Это превосходно!
Правин Праджапати
2
Ааааа, я потерял пару часов. Очередной раз!! Спасибо за этот ответ. :)
Самуил
Если вы установили точку останова в Visual Studio в Global.asax.cs в Application_Start (), и она не срабатывает, проверьте тип сборки. Если вы работаете как релиз, эта точка останова может не срабатывать. Переключитесь на Debug и он должен остановиться.
Пол
171

Примечание. Хорошей простой альтернативой использованию встроенного «Visual Studio Development Server» или IIS Express (например, потому что вы разрабатываете с использованием IIS и у вас есть особые настройки , необходимые для правильного функционирования вашего приложения), это просто продолжать работать в IIS (I использовать пользовательский веб-сервер + запись файла хостов + привязка IIS к тому же домену)

  1. дождитесь начала сеанса отладки
  2. затем просто отредактируйте пробел в корне web.config и сохраните файл
  3. обновить страницу (Ctrl + F5)

Ваша точка останова должна быть удачной, и вы можете продолжить отладку в своей естественной среде обитания IIS . Большой !

MemeDeveloper
источник
Это замечательное приложение для перезапуска AppDomain. Спасибо !!
Sanjay10
Больше нет Visual Studio Development Server. stackoverflow.com/questions/19676527/…
mac10688
1
@ mac10688 верно, но все еще существует IIS Express, который, как правило, не является производственной средой. Обновил ответ соответственно спасибо.
MemeDeveloper
Определенный принятый ответ. Я указываю устройства на IIS, которые не позволяют общаться при использовании IIS Express Edition! Это сработало очарование.
Мэтт Скелдон
54

Следующее поможет в любом случае (независимо от того, используете ли вы IIS, Cassini или что-то еще):

  1. Установите точку останова в Application_Start
  2. Начать отладку (точка останова, скорее всего, не достигнута) -> страница отображается в браузере
  3. Измените web.config (например, введите пустую строку) и сохраните его
  4. Перезагрузите страницу в браузере -> достигнута точка останова!

Почему это работает? При изменении web.config веб-сервер (IIS, Cassini и т. Д.) Выполняет перезапуск, но в этом случае (по какой-либо причине) процесс остается прежним, поэтому вы продолжаете подключаться к нему с помощью отладчика (Visual Studio). ).

Йохен Шарр
источник
3
Клон, два года спустя на stackoverflow.com/a/7655582/11635 - рассмотрите возможность удаления и добавления дополнительной информации в комментарии
Рубен Бартелинк
на самом деле @RubenBartelink, я думаю, что этот ответ яснее, чем другой, из-за формулировок и дополнительных объяснений.
Хериберто Луго,
1
@HeribertoLugo Я в восторге от этого - с 50 возражениями трудно полностью не согласиться (Тем не менее, я был бы рад за изменения в другом ответе, чтобы сократить разрыв, если у кого-то есть время и контекст; прошло некоторое время с тех пор, как я ') мы использовали отладчик на IIS!)
Рубен Бартелинк
Я согласен, что редактирование другого и удаление этого было бы лучшим маршрутом .. Сначала я увидел другой и слегка проследовал за ним, так что это не сработало .. Когда я увидел этот, потратив на него еще полчаса, то он сделал больше смысла .. вот полчаса мне не нужно было терять ..
Хериберто Луго
22

У меня тоже возникают проблемы с точками останова в application_start с размещенным приложением IIS. Хороший обходной путь - использование Debugger.Break (); в коде вместо точки останова VS

Flores
источник
2
Я верю, что не достижение точки останова как-то связано с запуском пула приложений в режиме интегрированного конвейера. Вы используете это?
Флорес
9

У меня точно такая же проблема. Я сделал много переименований в моем решении. После этого у меня появилось два неработающих веб-приложения и еще несколько веб-приложений были в порядке. Я получил ошибку, что у меня неправильные маршруты. Когда я попытался установить точку останова в Application_Startметоде, а затем перезапустить IIS, VS не прерывал выполнение. С работоспособным веб-приложением перерыв работал. Затем я вспомнил, что «чистое решение» и «перестроение» не удаляют сборки, оставшиеся после переименования. И это было решением! Я вручную почистил binкаталоги своих багги-веб-приложений, а затем увидел новую ошибку в Global.asax Inherits=""атрибуте, на которую ссылалась старая dll. Я поменял его на новый и перерыв стал работать. Предположим, что во время переименования Global.asax не обновлялся,

Dao
источник
Вау, это было больно найти! Это для чаевых!
Лэндон Поч
@Dao На самом деле это круто, спасибо;) Я потратил пару часов на это, я должен был бы найти твой ответ раньше :)
Pankaj Parkar
7

У нас была такая же проблема в проекте, который мы взяли на себя после того, как его построил другой поставщик. Проблема заключалась в том, что, хотя предыдущий поставщик в Global.asax.cs написал несколько команд, которые могли бы заставить вас поверить, что он используется, он фактически полностью игнорируется. Global.asax не наследовал от него, и этот файл легко никогда не увидеть, если присутствует файл .cs - нужно щелкнуть правой кнопкой мыши Global.asax и щелкнуть View Markup, чтобы увидеть его.

global.asax:

<%@ Application Language="C#" %>

Необходимо изменить на:

<%@ Application Codebehind="Global.asax.cs" Inherits="ProjectNamespace.MvcApplication" Language="C#" %>

Где ProjectNamespace - это любое пространство имен вашего класса Global.asax.cs (обычно это имя вашего проекта).

В нашем случае файл содержал несколько встроенных кодов, некоторые из которых были скопированы из файла .cs, некоторые нет. Мы просто сбросили встроенный код в файл .cs и постепенно объединили наши изменения обратно.

Крис Москини
источник
Вот и все. Я добавил исключение для запуска приложения (в соответствии с ответом Prisoner ZERO), и оно вообще не запускалось, так что ничего не нужно делать с отладчиком. Обновление разметки Global.asax исправило это.
Патрик
5

Попробуйте переключить режим управляемого конвейера для пула приложений в «Классический» вместо «Интегрированный». Это решило проблему для меня. Разглядывая причину сейчас ...

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

acezanne
источник
Да, это работает. Но если вы предполагаете, что ваше приложение должно работать в интегрированном пуле приложений, то оно также должно быть отлажено в интегрированном пуле.
Карел Крал
Мое приложение также не будет достигать точек останова после «F5», когда я переключаюсь с Classic на Integrated. Вы когда-нибудь узнавали почему? У меня нет никаких требований использовать Integrated, но это обескураживает, когда эти вещи не работают без объяснимой причины.
CodexArcanum
5

Убедитесь, что ваш global.asax не находится в подкаталоге. Он должен быть размещен на корневом уровне в вашем проекте.

троглодит
источник
Спасибо большое!!! Вы спасли меня от сумасшествия! Это было именно то, что вызывало мою проблему.
Ян Дюран
1
Моя проблема заключалась в том, что я просто создал класс с именем Global.asax.csи ожидал, что он будет работать. Вам нужно создать его, используя Add-> New Item->, Global Application Classчтобы он создавался с соответствующим Global.asaxфайлом конфигурации веб-форм.
Леви Фуллер,
4

У нас была похожая проблема, где global.asax.cs игнорировался.

Оказывается, сайт был обновлен с предварительно скомпилированного веб-сайта .NET 2 до сайта .NET 4.0. На сервере PrecompiledApp.configфайл не был удален из корневой папки. После удаления и повторного использования пула приложений IIS и касания web.config для перезапуска приложения код в Global.asax.cs начал работать нормально.

Глен Литтл
источник
3

Однажды у меня возникла проблема, когда Global.asax и Global.asax.cs фактически не копировались в папку IIS сценариями развертывания ... Так что это работало при отладке на сервере разработки, но не в IIS.

Майкл Ангел
источник
У меня такая же проблема. после того, как я загрузил Global.asax на сервер, проблема решена.
Мусульманин Хади
3

Поздняя запись ...

Чтобы проверить, запускается ли приложение IIS до того, как отладчик успел присоединиться, просто добавьте его в верхнюю или нижнюю часть ваших GLOBAL.ASAX Application_Start.

throw new ApplicationException("Yup, it fired");
Узник ноль
источник
2

Когда вы говорите «отладка», подразумеваете ли вы на самом деле запуск приложения из встроенного веб-сервера Visual Studio для отладки, или вы подразумеваете подключение к процессу в IIS? Если это первое, вы должны нажать Application_Start, но если это второе, может быть сложно быть в процессе достаточно рано, чтобы его поймать.

Рекс М
источник
Правильно, я имею в виду запуск приложения от VS. Он размещен в IIS, поэтому VS подключается к этому процессу. Вы говорите, что событие срабатывает раньше, чем VS сможет подключиться к процессу?
Боб Йексли
2

Закрыть В Visual Studio и удалить binи objпапки в веб - проекте (или всех проектов в растворе).

Вот команды для удаления этих папок из всех ваших проектов:

rm *\bin -r
rm *\obj -r
sparebytes
источник
2

Я сделал некоторые изменения, основанные на «Анализ кода при сборке» из Visual Studio. Анализ кода предложил «CA1822 Пометить элементы как статические» для Application_Start () в Global.asax. Я сделал это и закончил с этой проблемой.

Я предлагаю подавить это сообщение анализа кода и не изменять сигнатуру методов / классов, автоматически создаваемых платформой, используемой для начальной загрузки приложения. Сигнатура метода Application_Start, вероятно, была нестатической по причине.

Я вернулся к этому методу-подписи, и Application_Start () снова выстрелил:

    protected void Application_Start()
    { ... }
toralux
источник
2

Я столкнулся с этой проблемой при использовании статической страницы (например, index.html) в качестве начальной страницы - Application-Start не вызывается. Я обнаружил, что обслуживание статической страницы на самом деле не запускает приложение. Запрос страницы .aspx делает.

Мистер Кук
источник
Это было то, что сделал это для меня. Спасибо.
reekeecast
2

Убедитесь, что пространства имен в Global.asax и Global.asax.cs совпадают. Если они отличаются, он не выдаст никакой ошибки, но не достигнет точки останова также потому, что он вообще не выполняет application_start.

Ирфан
источник
1

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

ninj
источник
Да, я делаю запрос к заявке.
Боб Йексли
1

У меня была эта проблема в проекте .net 4 web forms vs2010, и я попробовал все, что упоминалось на этой странице. В итоге удаление и добавление global.asax фактически решило проблему для меня.

wonster
источник
1

У меня та же проблема, не могу поймать Application_Start. И причина была в том, что это не стрельба из-за несоответствия в файле разметки. Файл разметки Global.asax наследовал другой класс ...

lobiZoli
источник
1

Вы проверили настройки проекта? У меня была эта проблема, и у меня был начальный URL, идущий на другой порт, чем порт моего сервера. Мне потребовалось слишком много времени, чтобы понять ...

Д. Кермотт
источник
1

После того, как я попробовал столько других ответов, сколько было применимо в моей ситуации, и мне не повезло ни с одним из них, я вошел в свойства веб-проекта (проект на стороне сервера для приложения Silverlight, использующего службы RIA), щелкнул по кнопке Вкладка «Интернет» и изменил выбранный сервер с «Локальный IIS» на «IIS Express». (Обратите внимание, я использую VS2013.) Это решило проблему. Application_Start выполняется в «IIS Express», но не в «Local IIS». Интересный...

MylesRip
источник
Это выполняется. Вы просто не можете отладить его, поскольку вы либо не подключены к процессу IIS, либо подключены к нему после его выполнения.
uygar.raf
1

Я пытался пошагово пройти через код в RegisterRoutes (), который вызывался с момента запуска приложения и не достигал моей точки останова. Я определил, что Application_Start не вызывали. Мне пришлось внести изменения, чтобы сделать поверхностное изменение в App_start / RouteConfig.cs и сохранить его до вызова Application_Start. Я предполагаю, что эти файлы куда-то кешируются и не вызываются, если не внесены изменения.

Дон диллард
источник
1

Моя же проблема была решена путем добавления ссылки проекта System.Web.Routingв проекте

введите описание изображения здесь

Пракаш Мхасавекар
источник
0

Если вы используете System.Diagnostics.Debugger.Break (); Обходной путь (который я считаю вполне подходящим для временного использования), и он «просто не работает» на вашем компьютере с Windows 8. Причиной является ошибка в Visual Studio «Отладка как раз вовремя».

Исправление заключается в следующем: исправить ключ для «отладчика Visual Studio Just-In-Time»

Откройте regedit и перейдите к HKEY_CLASSES_ROOT \ AppID {E62A7A31-6025-408E-87F6-81AEB0DC9347} для значения реестра 'AppIDFlags', установите флаг 0x8

Более подробная информация здесь: http://connect.microsoft.com/VisualStudio/feedback/details/770786/just-in-time-debugging-operation-attempted-is-not-supported

ProVega
источник
0

В моем случае устранение проблемы со встроенным экземпляром ASP.NET Development Server через системный трей.

Маца
источник
0

Странные и сумасшедшие вещи ... но отладка на сервере и другой пользователь оставили IIS Express работающим на своем сеансе. Мне пришлось выйти из системы этого пользователя, чтобы убить его запущенные процессы IIS Express. Это, кажется, решило проблему!

Обновить

Потратив более 1 часа в погоне за тем, что вызывало проблему ... вот в чем дело: мне несколько удалось набрать sвнутри <appSettings>раздел Web.config. Visual Studio пыталась предупредить меня в Error Listокне с предупреждением . Признаюсь, я редко проверяю предупреждения ... должен начать проверять это с этого момента. : D Как только я удалил нарушителя, sточка останова попала в Application_Start.

введите описание изображения здесь

Лениэль Маккаферри
источник
0

У меня была эта проблема при попытке инициализации log4net. Я решил просто сделать статический конструктор для Global.asax

static Global(){
//Do your initialization here statically
}
Марк Прокопио
источник
0

Проблема в основном возникает при попытке переместить файл Global.asax в другой каталог решения. Снова переместите файл Global.asax в папку по умолчанию. Это будет работать как ожидалось.

Арнаб Чаудхури
источник
Что делать, если все на сайте предварительно скомпилировано, включая Global.asax.aspx? У меня есть предварительно скомпилированные файлы в каталоге bin. Application_Start не запущен.
Вин
0

Ни одно из описанных выше решений не помогло мне. Однако переустановка пакета

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 

использование Nuget GUI (не слишком хороший) обход

Michele
источник