我想将会话存储在 SQL Server 数据库中,为此我想使用会话状态模式 SQLSERVER,并且我更改了我的
web.config
并添加了会话状态属性:
<sessionState mode="SQLServer" timeout="30" sqlConnectionString="Data Source=server;user id=sa;password=sa;" cookieless="false" />
当我运行我的应用程序时,我收到此错误:
无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用不可序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则适用相同的限制。
这个问题很旧,但没有有效的答案,我遇到了同样的问题,并在另一个网站上找到了解决方案。由于这个主题是谷歌上的第一个结果,我在这里为其他人添加解决方案。
问题是关于将结构对象添加到会话中。 ASP.NET Web 应用程序处理会话对象存储的方式与 InProc 模式和 SQLServer 模式不同。当将会话对象存储到 SQL Server 中时,.NET 框架将序列化对象。这是必要的,因为会话对象需要在服务器之间传输。
堆栈跟踪(错误页面上的黄色部分)准确显示了哪个对象导致了问题。就我而言:
[SerializationException:在程序集中键入“admin+users+stUsers” 'App_Code.3_0rnsep,版本=0.0.0.0,文化=中性, PublicKeyToken=null' 未标记为可序列化。]
我在我的结构体上添加了 [Serialized] 标签,问题就消失了。
[Serializable]
public struct stUsers
{ .... }