2015-05-15 3 views
-1

Когда я отлаживаю проект веб-сайта в Visual Studio 2013, у меня возникает проблема, когда я пытаюсь придать элемент сеанса определенному типу (ZZZZ).Исключение InvalidCastException при чтении из состояния сеанса

return (ZZZZ) Session["SessionItem"]; 

InvalidCastException выбрасывается со следующим содержанием

Исключение типа «System.InvalidCastException» произошло в App_Code.axv-bzrg.dll, но не был обработан в пользовательском коде Дополнительная информация : Невозможно передать объект типа «XXX.YYYY.ZZZZ», чтобы ввести «XXX.YYYY.ZZZZ».

Я добавил элемент часы для

(WebUser) Session["LoggedInUser"] 

И следующее отображался в Value части часы:

типа «XXX.YYYY.ZZZZ» существует в обоих 'App_Code.axv-bzrg.dll' и 'App_Code.ys_ymegf.dll'

Я перемещаться к временному ASP.NET Files папку

C: \ Users _________ \ AppData \ Local \ Temp \ Temporary ASP.NET Files \ корень \ dc8aa7ce \ b2661c39

И две DLL файлы были там. Я думаю, что DLL-файлы App_Code генерируются при каждом запросе страницы, но предыдущие НЕ удаляются, в результате чего в каталоге Temp есть два дублированных типа. Почему это происходит и как я могу это исправить?

+1

Остановка IIS и очистка всех \ Временных файлов ASP.NET \ часто исправляет ее. Реже чистая/перестроенная система исправляет это. – MatthewMartin

+0

Вы правы, но я не могу остановить IIS или перестраивать каждый раз (отладка будет невозможна).Кроме того, удаление временных файлов возможно, но крайне раздражает и непродуктивно. Кроме того, у меня нет опции Clean для этого проекта. Подумайте, почему это может быть? – alex

+0

Чистое решение должно быть в контекстном меню. Чистое перекомпилирует все, включая вещи, которые Visual Studio думает, не нуждается в перекомпиляции. Прошло некоторое время, но иногда это происходит, когда динамическому компилятору не нравится, как вы устанавливаете директивы в своей разметке. Другим более решительным решением является переход от WebSite к WebApplication, который имеет более предсказуемую компиляцию/менее изворотливую, особенно по мере увеличения размера проекта. – MatthewMartin

ответ

2

Это несколько ожидаемое поведение.

Перейти к странице в первый раз - объект добавлен в состояние сеанса с типом page_V1.dll:MyType.

Вы решили прикоснуться к источнику страницы, чтобы что-то исправить - поскольку он не убивает куки-сессии, переход на одну и ту же страницу снова попытается получить объект из состояния сеанса в памяти (состояние сеанса не потеряно, поскольку пул приложений не перезапущен из-за просто изменений страницы). Ваша страница в этой точке снова скомпилирована и теперь пытается записать тип case, хранящийся в сеансе, в новый тип page_v2.dll:MyType, который действительно не работает, поскольку типы не связаны друг с другом (даже если они идентичны в противном случае).

Fix:

  • для отладки - начать новый сеанс браузера/очистить куки или просто запустить приложение рецикл-пул (т.е. прикосновением Web.config).
  • рассматривает перемещение объектов в проект библиотеки классов и добавление ссылки на него с веб-сайта - таким образом вы контролируете, когда типы действительно скомпилированы и, следовательно, не потеряют идентификацию из-за динамически генерируемого имени файла сборки.
Смежные вопросы