Asp.net: динамически скомпилированные ascx файлы перекомпилируются во время выполнения - PullRequest
0 голосов
/ 19 ноября 2018

Наше веб-приложение ASP.NET имеет редактор форм, в котором пользователи могут создавать свои собственные страницы, перетаскивая пользовательские элементы управления на страницу и устанавливая различные свойства для каждого пользовательского элемента управления.Когда конечные пользователи затем открывают эту страницу во время выполнения, пользовательские элементы управления помещаются на страницу в соответствии с этой конфигурацией.

Редактор также содержит механизм бизнес-правил, где пользователи могут создавать простые операторы if-then-else для прямогопоток страниц в соответствии с бизнес-логикой.Например, пользователь может создать правило «если Data.Customer.DateOfBirth равно Today, тогда HappyBirthdayScript станет видимым», где HappyBirthdayScript является экземпляром пользовательского элемента управления.Эти бизнес-правила затем компилируются деревьями лямбда-выражений, которые, в свою очередь, кэшируются на один день для производительности.

Теперь проблема, с которой сталкивается один из наших клиентов, заключается в том, что, как правило, в непиковые часы (после полуночи), но иногда даже в пиковые часы в течение дня, ASP.NET, кажется, перекомпилирует динамически генерируемые dll для одного илибольше файлов ascx.Это приводит к ошибкам, подобным этой:

System.InvalidCastException: [A] ASP.ui_controls_scripting_ascx не может быть приведен к [B] ASP.ui_controls_scripting_ascx.Тип A происходит из «App_Web_scripting.ascx.cb748d43.1ce9kuug, Version = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null» в контексте «По умолчанию» в расположении «C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319».\ Временные файлы ASP.NET \ root \ a3b6cf39 \ a9985cbd \ App_Web_scripting.ascx.cb748d43.1ce9kuug.dll '.Тип B происходит из «App_Web_scripting.ascx.cb748d43.e6qrsk0w, Version = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null» в контексте «По умолчанию» в расположении «C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319».\ Temporary ASP.NET Files \ root \ a3b6cf39 \ a9985cbd \ App_Web_scripting.ascx.cb748d43.e6qrsk0w.dll '

Это исключение вызвано тем, что тип пользовательского элемента управления Scripting в кэшированном скомпилированном бизнес-правилеодин в новой перекомпилированной dll во временных файлах ASP.NET.Скомпилированное дерево выражений преобразует пользовательский элемент управления в указанный тип для доступа к его свойствам без необходимости использовать более медленное отражение.

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

Это происходит один раз в несколько дней на одном или обоих серверах с балансировкой нагрузки.Пулы приложений обоих серверов будут перезагружаться каждый день в 3:33 утра.Ни у кого из наших клиентов нет этой проблемы.Это также не происходит в одно и то же время каждый раз, и это не происходит с тем же контролем.Поэтому я немного озадачен, чтобы выяснить причину этого.

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

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

Кто-нибудь знает, как я могу исследовать эту проблему дальше? Меня особенно интересует дополнительная информация о том, как IIS определяет, когда нужно динамически перекомпилировать файлы ascx, и найти больше журналов по этому вопросу, но до сих пор я еще не нашел ничего полезного. В статье Общие сведения о динамической компиляции ASP.NET на MSDN говорится, что файлы ascx / aspx / ashx / etc компилируются по их первому запросу и при внесении изменений в файл. Однако после развертывания эти файлы должны быть статичными, особенно ночью, когда никто с доступом RDP к серверу в это время даже не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...