在 asp.net 中序列化会话状态

本文关键字:序列化 会话状态 net asp | 更新日期: 2023-09-27 18:31:35

我正在尝试将会话状态存储在SQL中,而不是在我们的nopcommerce 1.9安装中存储在InProc中。当我对web.config进行必要的更改时,出现此错误:

"/"应用程序中的服务器错误。

无法序列化会话状态。在"状态服务器"和 "SQLServer"模式,ASP.NET 将序列化会话状态对象, 因此,不可序列化的对象或 MarshalByRef 对象是 不允许。如果类似的序列化,则适用相同的限制 由"自定义"模式下的自定义会话状态存储完成。

说明:执行 当前 Web 请求。请查看堆栈跟踪以获取更多信息 有关错误及其在代码中起源位置的信息。

异常详细信息:System.Web.HttpException:无法序列化 会话状态。在"StateServer"和"SQLServer"模式下,ASP.NET 将 序列化会话状态对象,因此不可序列化 不允许使用对象或 MarshalByRef 对象。一样 如果自定义执行类似的序列化,则应用限制 会话状态存储在"自定义"模式下。

源错误:

在执行 当前网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[序列化异常:类型 'NopSolutions.NopCommerce.BusinessLogic.Categories.Category' in 汇编 'nop.BusinessLogic, version=1.9.0.0, Culture=中性, PublicKeyToken=null' 未标记为可序列化。
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType 类型) +9449041
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type 类型,流上下文上下文)+247
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +160 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, serObjectInfoInit serObjectInfoInit, IFormatterConverter 转换器, 序列化活页夹) +371
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArray(WriteObjectInfo objectInfo, NameInfo memberNameInfo, WriteObjectInfo memberObjectInfo) +205 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo 对象信息, 名称信息成员名称信息, 名称信息类型名称信息) +651
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +444 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, boolean fCheck) +133 System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1762

[HttpException (0x80004005): 无法序列化会话状态。在 "状态服务器"和"SQLServer"模式,ASP.NET 将序列化会话 状态对象,因此不可序列化的对象或 不允许使用元帅比引用对象。同样的限制适用 如果类似的序列化由自定义会话状态存储执行 "自定义"模式。
System.Web.Util.AltSerialization.WriteValueToStream(Object value, 二进制编写器编写器) +1847
System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(Object 值,二进制编写器编写器)+34
System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter 作家) +638
System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData 项目,流流) +244
System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData item, Int32 initialStreamSize, Byte[]& buf, Int32& length, Boolean 压缩启用) +67
System.Web.SessionState.SqlSessionStateStore.SetAndReleaseItemExclusive(HttpContext 上下文、字符串 ID、会话状态存储数据项、对象锁 ID、布尔值 新项目) +140
System.Web.SessionState.SessionStateModule.OnReleaseState(Object 源, 事件参数 事件参数) +807
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completeSyncally) +75

版本信息: Microsoft .NET 框架版本:4.0.30319; ASP.NET 版本:4.0.30319.272

有人请告诉我,我不需要序列化Nopcommerce中的每个对象来执行此操作!

在 asp.net 中序列化会话状态

正如例外所说 你的类型

NopSolutions.NopCommerce.BusinessLogic.Categories.Category

不可序列化。我不知道该类型的实现,但您可以尝试使用 [Serializable] 属性装饰该类型。

如果无法执行此操作,只需将对象的 id 写入会话即可。

如果您希望将会话存储在 sql Server 中,则写入会话中的每个对象都需要是可序列化的。

更多信息

  • 会话 InProc 模式到会话状态服务器的步骤

添加 [Serializable] 属性( VB 中的 <Serializable()>)会自动使您的类可序列化。类中的所有成员也需要可序列化。因此,假设您的类中有对象引用。然后,这些对象所属的类也需要具有 [Serializable] 属性。基本类型可自动序列化。