не может быть приведен к [B];Тот же контекст (по умолчанию);Другой временный файл - PullRequest
6 голосов
/ 23 июля 2011

Мне трудно найти причину, по которой происходит следующая ошибка. Я опишу загадочные аспекты под описанием ошибки.

[A] ASP.common_resultmessagepanel_ascx нельзя преобразовать в
[B] ASP.common_resultmessagepanel_ascx .

Тип A происходит от 'App_Web_resultmessagepanel.ascx.38131f0b.2c4hpv_z, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = ноль'
в контексте «По умолчанию» в местоположении
'C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Временные файлы ASP.NET \ MyWebApp \ dc3e0df6 \ ba1606c8 \ App_Web_resultmessagepanel.ascx.38131f0b.2c4hpv_z.dll'.

Тип B происходит от 'App_Web_wz3shqfq, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = ноль'
в контексте «По умолчанию» в местоположении
'C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Временные файлы ASP.NET \ MyWebApp \ dc3e0df6 \ ba1606c8 \ App_Web_wz3shqfq.dll'.

Класс, на который ссылается ошибка, является пользовательским веб-элементом управления, унаследованным от System.Web.UI.UserControl и реализующим System.Web.UI.ITextControl.
Элемент управления зарегистрирован и используется на главной странице. Ни у одной из родительских главных страниц или страниц реализации нет экземпляров элемента управления.
Класс и страница разметки находятся в проекте веб-приложения.
Исключение не происходит как прямой результат кода приложения. , это происходит во время внутреннего выполнения кода .NET Framework.
Проект - это веб-приложение, а не веб-сайт.
Веб-приложение компилируется в один двоичный файл, а ресурсы, специфичные для культуры, компилируются в один двоичный культура.

Контекст, указанный для каждого типа в исключении, одинаков, но я смог убедиться, что при возникновении исключения в папке Temporary ASP.NET Files для приложения фактически есть два отдельных определения класса.

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

Исключение не происходит последовательно. После создания временных файлов исключение будет происходить каждый раз, когда запрашивается страница. Если что-либо вызывает очистку или воссоздание временных файлов, случайным образом возникает вопрос о том, будут ли повторные временные определения классов / DLL создаваться заново. Это может быть изменение web.config, перезапуск пула приложений, иногда даже просто обновленный / перестроенный двоичный файл веб-приложения.

Последний бит трассировки стека:

   ASP.Default.__BuildControl__control35(Control ctrl) in C:\Projects\ABC.Web\App_Themes\Default\CheckBox.skin:3
   System.Web.UI.ControlSkin.ApplySkin(Control control) +12
   System.Web.UI.PageTheme.ApplyControlSkin(Control control) +119
   System.Web.UI.Control.ApplyStyleSheetSkin(Page page) +61
   ASP.masterpages_mymaster_master.__BuildControlpnlResults() in C:\Projects\ABC.Web\MasterPages\MyMaster.master:10
   ASP.masterpages_mymaster_master.__BuildControl__control2(Control __ctrl) in C:\Projects\ABC.Web\MasterPages\MyMaster.master:9
   System.Web.UI.CompiledTemplateBuilder.InstantiateIn(Control container) +12
   System.Web.UI.MasterPage.InstantiateInContentPlaceHolder(Control contentPlaceHolder, ITemplate template) +87

Предполагаемый источник-нарушитель (единственная строка в файле скина C: \ Projects \ ABC.Web \ App_Themes \ Default \ CheckBox.skin):

<asp:CheckBox runat="server" SkinID="FormInput" CssClass="FormLabel FormInputCheckBox" />

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

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

Есть идеи?


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

Пока исключение больше не повторялось. Я собираюсь дать ему еще пару дней тестового времени, чтобы увидеть, не всплывет ли он снова.

Я все еще хочу знать, почему вообще произошло исключение. Кто-нибудь с глубокими знаниями о том, как IIS запускает веб-приложения .net или как создаются временные файлы?


Новая теория!

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

Другие разработчики испытывали ошибки при запуске проекта из Visual Studio. Я не знаю, как это могло бы объяснить эти случаи, но я не исключаю, что это также является причиной.

Ответы [ 3 ]

2 голосов
/ 01 марта 2013

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

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

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

Решение Visual Studio состоит из нескольких проектов, и разработчики обычно имеют несколько экземпляров VS, экземпляр SQLmg Mgmt и другие выполняющиеся процессы, которые вызывают нехватку доступной памяти на компьютерах разработчиков. Чем меньше доступной памяти, тем чаще и надежнее будет происходить ошибка.

Чтобы очистить состояние ошибки, очистка пула приложений / iisreset очистит память, а затем перестройка, как правило, решит проблему. Если доступной памяти по-прежнему мало, проблема может сохраняться до тех пор, пока не будет доступно больше памяти для запуска приложения. Просто закройте некоторые приложения или иным образом освободите память для ОС.

Я до сих пор не уверен, почему при запуске приложения через веб-сервер Visual Studio вместо IIS возникает та же проблема, но если он обрабатывает память так же, как IIS, то понятно, что поведение такое же.

2 голосов
/ 23 июля 2011

Я не уверен, что происходит в вашем случае, но у меня это случилось при следующих обстоятельствах:

Тип проекта веб-сайта, а не веб-приложение. Папка

/Controlsсодержащий много пользовательских контроллеров ascx.

/Client/Controls папка, содержащая другие пользовательские элементы управления ascx, некоторые из которых регистрируются и ссылаются на /Controls пользовательские элементы управления.

/Controls/BadControl.ascx с использованием /Client/Controls/DupedControl.ascx в качестве дочернего элемента управления.

Компилятор сталкивается с циклической зависимостью при попытке скомпилировать каждую папку в отдельную сборку.

/Controls/BadControl.ascx требуется /Client/Controls для компиляции в первую очередь.

/Client/Controls нуждается /Controlsдолжен быть скомпилирован первым.

Таким образом, компилятор сначала вставляет DupedControl.ascx в отдельную сборку.Затем /Controls, затем /Client/Controls , в который DupedControl все еще включается .

На данный момент существует два различных типа для DupedControl в двух отдельных сборках.DupedControl.ascx (разметка) указывает на правильный тип (назовем его TypeA в сборке папки), а ссылка BadControl указывает на дубликата TypeB в небольшой дополнительной сборке.

Когда страница, использующая BadControl, выполняется, DupedControl TypeA создается с помощью разметки, но BadControl пытается втиснуть ее в переменную TypeB, что приводит к описанной вами ошибке.

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

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

0 голосов
/ 21 сентября 2012

РЕШИТЬ!

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

странно, но верно ..


MyUserControl myuc = new MyUserControl(); 
myuo = (MyUserControl)Page.LoadControl("~/UserControls/MyUserCOntrol.ascx");

не работает


MyUserControl myuc = (MyUserControl)Page.LoadControl("~/UserControls/MyUserCOntrol.ascx");

работает

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