2

我们正在使用 ASP.NET 视图状态来存储我们自己的对象(即,不仅仅是原始类型)。每次我们进行构建时,构建号都会增加。我们试图解决的问题是在服务器更新期间:

  1. 用户加载页面
  2. 我们部署了一个新版本的 Web 应用程序
  3. 用户在同一页面上导致回发,并引发异常:

    • HttpException:此页面的状态信息无效,可能已损坏。
    • ViewStateException:无效的视图状态。
    • ArgumentException:序列化数据无效。
    • FileLoadException:无法加载文件或程序集“[我们的程序集],Version=[我们的新版本],Culture=neutral,PublicKeyToken=...”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配

我理解为什么会发生这种情况 - ViewState 已使用该类的先前版本进行序列化,然后尝试使用新版本进行反序列化,而 .NET 序列化不支持这一点。

我们考虑过创建自定义 PageStatePersister 并使用 JSON(然后对其进行加密)来序列化/反序列化,因为数据成员几乎总是在构建之间兼容。

还有其他想法吗?

4

1 回答 1

1

首先,在 viewstate 上序列化数据不是一个好主意,一个原因是这种反序列化与您的体验不匹配,但另一个问题是数据正在传输到服务器并在每次回发时返回。

我会使用一种简单的存储库方法,例如将数据存储在缓存或会话中,这样无论存储在何处以及如何持久化,您都可以询问存储库,这用于模拟内存存储库。所以你有像“MyDataSotarage.GetMyCustomObject()”和“MyDataSotarage.SaveMyCustomObject(CustomObject obj)”这样的东西,所以在存储库中有你的逻辑将项目添加到缓存(例如使用用户ID和对象名称作为键)或会话如果你喜欢(不要害怕他们,有些人会)。它更像是一种设计方法而不是实现方法,但通过这种方式,您将完全解耦数据的存储方式,您将避免序列化问题,您将节省 KB 的网络流量等。

于 2013-02-13T20:30:08.453 回答