Изменение страницы ASP.NET приводит к невозможности приведения массива объектов в Session к его собственному типу? - PullRequest
1 голос
/ 11 ноября 2009

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

Буду признателен за отказ от ответов "не использовать сессию", если только это не очень простое решение. Я не пытаюсь изменить весь этот процесс.

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

Ответы [ 2 ]

1 голос
/ 12 мая 2011

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

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

1 голос
/ 11 ноября 2009

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

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

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

...