Инициализация приложения IIS с помощью IIS 10.0 и WebAPI

Всем привет и доброго утра,

Я столкнулся с проблемой, когда запущенные службы больше не подписываются на обнаружение служб. При тестировании они работали под управлением IIS Express. Однако как только я переключил его на IIS и убедился, что все еще работает; служба больше не обращается к Application_Start() в Global.asax.cs.

Проведя небольшое исследование, выяснилось, что IIS требует небольшой настройки, чтобы заставить его выполнять некоторую работу по инициализации после запуска пула приложений. Я запускаю это в среде Windows 10 Professional с IIS 10.0.17763.1.

Цель: запустить службу для подписки на обнаружение службы, если она работает под управлением IIS Express.

Сначала я нашел в MSDN документацию по настройке всего этого, включая предварительные условия здесь Инициализация приложения IIS 8.0

Выполнив все шаги и обновив необходимые записи конфигурации, я все еще не инициализирую свою веб-службу при запуске пула приложений.

Я создал новую конечную точку на контроллере для тестирования, чтобы заставить это работать.

Контроллер аккаунта:

[System.Web.Http.HttpGet]
public IHttpActionResult Init()
{
    // here is where I am registering the service thats coming up
}

Файл определения маршрута:

{"Name": "Account - Init",
"RouteTemplate": "api/{controller}/init",
"Defaults": "controller = AccountController, action = Init"}

Web.config

<applicationInitialization skipManagedModules="false" doAppInitAfterRestart="true" remapManagedRequestsTo="/api/account/init">
  <add initializationPage="/api/account/init" />
</applicationInitialization>

Я исхожу из того, что инициализация будет происходить только ОДИН РАЗ, и это происходит, когда пул приложений впервые запускается или перезапускается. IIS внутренне сделает «управляемый» вызов веб-приложению с сопоставленным ресурсом, который он находит в файле web.config приложения. Правильно ли я понимаю, как это должно работать? Если да, то может кто-нибудь объяснить, почему?

Я не просто пытаюсь «заставить это работать». Я хотел бы понять, почему в настоящее время это «не работает» для меня.

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


person Robert    schedule 17.05.2019    source источник
comment
вот почему никогда не следует разрабатывать против IIS Express, а против реального IIS   -  person Andrei Dragotoniu    schedule 17.05.2019


Ответы (2)


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

На самом деле вы можете попасть в точки отладки, если вам удастся вовремя подключить Visual Studio к пулу приложений процесса IIS. Есть возможность присоединить отладчик к процессу, так что вы можете его использовать.

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

person Andrei Dragotoniu    schedule 17.05.2019
comment
Спасибо за быстрый ответ. Я могу просто подключить отладчик в Visual Studio, но когда пул приложений перезапускается, он убивает мой сеанс, и мне приходится повторно подключаться, что является болью. Однако я даже не могу проверить, что он попал в указанную конечную точку. Я знаю, что код в конечной точке работает, и у меня есть шлюз/вход в другом экземпляре Visual Studio, подключенном к процессу w3wp для «его» пула приложений, и я никогда не получаю никаких точек останова. Это означает, что он не попадает в конечную точку, которую я предоставляю при запуске. - person Robert; 17.05.2019
comment
в Application_Start просто добавьте текст журнала в файл на диске, и вы увидите, действительно ли он не попал. - person Andrei Dragotoniu; 17.05.2019
comment
Сообщаю, что не пишет на диск. Это означает, что он не попадает ни в Application_Start в Global.asax.cs, ни в конечную точку, которую я создал в контроллере. Я поместил один и тот же код в оба места, но разный текст, чтобы узнать, откуда он был зарегистрирован. - person Robert; 17.05.2019

Следуя,

Я исправил свою проблему. Похоже, что код работает правильно, он попадает в Global.asax.cs Application_Start, как и должно быть. У меня возникло исключение, не связанное с IIS, после внесенного мной изменения, которое привело к тому, что, казалось, «не работает».

Следование инструкциям в MSDN действительно работает.

person Robert    schedule 17.05.2019