使用 SQL 会话数据库中存储的对象时重新编译后的强制转换异常

本文关键字:编译 异常 转换 数据库 会话 SQL 存储 使用 对象 新编译 | 更新日期: 2023-09-27 18:33:54

为了在重新编译后维护会话,我正在使用SQLServer来存储会话状态。只要我不存储自定义对象,这就可以很好地工作。当尝试在重新编译后使用已存储在会话中的自定义对象时,我收到以下错误:

[A]MyObject cannot be cast to [B]MyObject. 
Type A originates from 'App_Code.9qazkuv_, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null' 
    in the context 'Default' at location 
    'C:'Windows'Microsoft.NET'Framework'v4.0.30319'Temporary ASP.NET Files
        'root'26676eb7'92c7e946'App_Code.9qazkuv_.dll'. 
Type B originates from 'App_Code.jndyusrx, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null' 
    in the context 'Default' at location 
    'C:'Windows'Microsoft.NET'Framework'v4.0.30319'Temporary ASP.NET Files
        'root'26676eb7'92c7e946'App_Code.jndyusrx.dll'.

几个月来我一直在与此错误作斗争,到目前为止我找到的唯一解决方案是将对象放在 dll 文件中。在某些情况下,这并不容易做到。必须有一种更简单的方法来解决这个问题。有什么建议吗?

同样奇怪的是,该错误不容易重现。我试图将我的站点复制到测试环境以体验该问题,但我无法在同一服务器上的测试环境中重现错误。在本地主机上,问题确实会发生。

使用 SQL 会话数据库中存储的对象时重新编译后的强制转换异常

问题是

,会话状态类使用 BinaryFormatter 来序列化对象,从而存储版本和类程序集名称。您最好围绕会话状态类编写一个包装器,该类获取您的对象,自己对其进行序列化 - 如 JSON 或 XML - 并将结果作为字符串添加到您的状态中。