ASP.NET вложенных мастер-страниц с CompilationMode="Никогда", получателем на случай катастрофы? Ошибка в ASP.NET?

Работая над довольно крупным проектом веб-приложения, я решил, что он может немного подышать свежим воздухом, пометив некоторые страницы и элементы управления атрибутом @Page CompilationMode="Never". Пока все хорошо, работает, как ожидалось, и тогда это случилось. Сценарий в угловом случае, который я собираюсь объяснить, вел себя неожиданно, чтобы выразить это красиво. Этот сценарий является вложенными главными страницами.

Быстрый тизер, прежде чем продолжить. Как вы думаете, насколько глубокой будет вложенность, если вы пометите верхнюю мастер-страницу как CompilationMode="Always", а все остальные под ней - CompilationMode="Never"? Нет, это не бесконечно, или какой-то внутренний номер, который есть у ASP.NET. Его 2. Зачем? - Понятия не имею, и я надеялся, что некоторые из вас, умные ребята, смогут меня просветить?

Я приложил проект с 5 вложенными главными страницами, чтобы продемонстрировать, о чем я говорю: Тестовый проект веб-приложения с вложенными главными страницами.

Другой угловой случай, который также работает неожиданно - если у вас есть 5 вложенных главных страниц, замените второй на CompilationMode="Always", а на все остальные на CompilationMode="Never". Вы заметите, что третьи главные страницы применяются дважды!

Пожалуйста, помогите мне понять, если что-то делаю неправильно, или подтвердите проблему.

ASP.NET Runtime версия: 2.0, .NET: 3.5

РЕДАКТИРОВАТЬ:

В прикрепленном проекте все главные страницы имеют значение CompilationMode="Never". Страница ASPX отображается по желанию. Измените первый мастер (Site.master), чтобы CompilationMode="Always", чтобы увидеть, о чем я говорю.

1 ответ

Решение

ОБНОВЛЕНИЕ (21.01.2010): Хорошая новость: после дополнительного расследования выясняется, что эта проблема была исправлена ​​в VS2010. Исправление было сделано после Beta 2, поэтому оно будет частью следующей публичной сборки. У меня нет точной даты, но она не должна быть слишком далеко.


Да, я, кажется, вспоминаю об этом раньше, и действительно некоторые сценарии, включающие главные страницы Nester и CompilationMode="Never", не работают.

Глядя на старую почтовую ветку, я думаю, что это происходит только для определенных комбинаций. Похоже, что он не работает (где NoCompile означает compilationMode=never):

  1. Страница NoCompile / Мастер компиляции / Мастер NoCompile
  2. Страница NoCompile / Мастер NoCompile / Скомпилированный Мастер

В то время мы не исправляли это, потому что исправление было нетривиальным, а сценарий не распространенным.

Обратите внимание, что когда речь идет о страницах NoCompile, большая часть преимуществ заключается в использовании его для страниц aspx конечного узла, а не для главных страниц. Обычно страницы NoCompile работают немного медленнее, чем скомпилированные страницы. Их преимущество в том, что у них нет первого попадания при компиляции, и они используют меньше памяти. Кроме того, они могут быть полностью выгружены под давлением памяти. Вот почему они имеют смысл, когда у вас очень большое количество конечных страниц (их использует Sharepoint). Но на главных страницах (где большинство приложений имеют небольшое количество общих страниц), это преимущество будет минимальным. И, конечно, вы не можете иметь код на страницах NoCompile, что является основной причиной, по которой их используют немногие.

Итак, краткое резюме: вы правы, это ошибка!:) И рекомендуемый обходной путь - избегать CompilationMode = никогда для главных страниц.

Другие вопросы по тегам