ASP.NET中Redis存储会话跳转时序列化错误问题求助
首先先看你遇到的错误截图:
结合你描述的情况——已经给Session相关类加了序列化,但非aspx.cs里的类存Session有问题,Redirect时报错,设throwOnError="false"后Session读不了还没法存新数据——我给你整理几个实用的排查和解决方向:
先确认非aspx.cs类的序列化完整性
别只看类本身加了[Serializable]特性,得检查:- 类里所有嵌套的自定义对象、属性类型也都加了
[Serializable](如果用的是默认的BinaryFormatter);要是用DataContract序列化,就得给类加[DataContract],需要序列化的成员加[DataMember]。 - 有没有包含无法序列化的类型?比如FileStream、未标记序列化的委托、或者一些第三方库的非序列化对象,这些都会导致序列化失败。
- 有没有不小心加了
[NonSerialized]的成员,但其实这个成员是需要存在Session里的?
- 类里所有嵌套的自定义对象、属性类型也都加了
修复Response.Redirect导致的Session写入中断
Response.Redirect默认的第二个参数是true,会直接终止当前请求,这时候Session的序列化写入操作可能还没完成就被打断了,进而引发错误。你可以改成:Response.Redirect("你的目标页面路径", false); Context.ApplicationInstance.CompleteRequest();这样不会强制终止请求,能让Session的写入操作正常完成,同时用
CompleteRequest()正确结束请求流程。别用throwOnError="false"掩盖问题
这个配置只是把错误藏起来,但底层的序列化失败并没有解决,反而会导致Session数据损坏,所以后续连正常的Session都存不了。建议打开应用日志和Redis日志,找到具体的序列化错误信息——比如到底是哪个类的哪个成员序列化失败,这样才能精准修复。检查Redis Session存储的序列化器配置
如果用的是StackExchange.Redis这类库,默认的序列化器对某些复杂自定义类型支持有限。可以换成Json.NET(Newtonsoft.Json)的序列化方案,比如自己实现一个ISessionStateSerializer,或者用现成的扩展包来替换默认序列化器,这样对自定义类型的兼容性会好很多。避免存储匿名类型或动态生成的类型
如果非aspx.cs里的类是动态生成的,或者你存了匿名对象到Session里,这类类型默认是无法序列化的,一定要换成明确标记了序列化特性的实体类。
内容的提问来源于stack exchange,提问作者Kumar Shubham

