Изменение страницы ASP.NET приводит к тому, что массив объектов в сеансе не может быть приведен к собственному типу?

Asked
Viewd697

1

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

Я был бы признателен за то, чтобы избежать ответов «не использовать сеанс», если только это не действительно простое решение.Я не пытаюсь переделывать весь этот процесс.

 Unable to cast object of type 'ShipmentPackages[]' to type 'ShipmentPackages[]'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidCastException: Unable to cast object of type 'ShipmentPackages[]' to type 'ShipmentPackages[]'.

Source Error: 


Line 21:         Else
Line 22:             If Not Session("ShipmentList") Is Nothing Then
Line 23:                 ShipmentList = DirectCast(Session("ShipmentList"), ShipmentPackages()).ToList
Line 24:             End If
Line 25:         End If
 
  • нет, этот код отлично работает в промежутках между редактированием этой страницы.после внесения правки то, что находится в сеансе, больше не соответствует ... когда asp.net перекомпилирует страницу, отображает ли он класс как новую версию или что-то в этом роде?Я бы даже так подумал, что его можно будет преобразовывать / приводить.

    TheSoftwareJedi11 ноября 2009, 01:40
  • У вас случайно не более одного пространства имен?Возможно, клиент веб-службы и сборка, на которую имеется ссылка, имеют одинаковые имена типов?

    Jerry Bullard11 ноября 2009, 01:28

2 ответов

1

Я сам видел это сообщение несколько раз, это очень раздражает!Как вы отметили, это, вероятно, связано с изменением версии сборки.В Asp.Net при изменении страницы код перекомпилируется.В зависимости от того, где вы разместите, класс будет определять, будет ли класс перекомпилирован со страницей или нет.Я бы посоветовал вынести любые классы «модельного» типа в отдельный проект.Это позволит избежать этой проблемы, а также желания смешивать код представления / контроллера и модели :).

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

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

1

Несколько дней назад меня тоже раздражала эта проблема.Увы, первое решение Брайана будет работать только до тех пор, пока вам не нужно снова компилировать «модель-проект».Если вы сделаете это (из-за исправления ошибок и т. Д.) И обновите работающее приложение (пользователи, удерживающие сеанс во время процесса обновления, что и сделано в моем случае), вы снова получите исключение :-(!

В моем частном случае лучшее решение было действительно простым!Я изменил "DirectCast" на "TryCast".Если версия сборки изменилась и кастинг завершился неудачно, trycast ничего не вернет.В этом случае или если я еще не записал словарь / коллекцию в сеанс, я получаю свои данные (снова) по базе данных и сохраняю их потом.В следующий раз кастинг будет работать ;-)!И еще один замечательный момент: это работает также, если интерфейс объекта изменится!