C# 无法使用stateserver序列化会话状态

C# 无法使用stateserver序列化会话状态,c#,asp.net,serialization,C#,Asp.net,Serialization,我遇到以下错误,不知道是否可以使System.Data.Linq.EntitySet可序列化 无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET将序列化会话状态对象,因此不允许使用不可序列化的对象或MarshalByRef对象。如果自定义会话状态存储在“自定义”模式下完成了类似的序列化,则同样的限制也适用 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源 异常详细信息:System.Web.Ht

我遇到以下错误,不知道是否可以使System.Data.Linq.EntitySet可序列化

无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET将序列化会话状态对象,因此不允许使用不可序列化的对象或MarshalByRef对象。如果自定义会话状态存储在“自定义”模式下完成了类似的序列化,则同样的限制也适用

描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

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

源错误:

在执行当前web请求期间生成了未经处理的异常。有关异常的起源和位置的信息可以使用下面的异常堆栈跟踪来识别

堆栈跟踪:

[SerializationException:在程序集'System.Data.Linq,Version=3.5.0.0,Culture=中性,PublicKeyToken=b77a5c561934e089'中键入'System.Data.Linq.EntitySet'1[[NES.HiLo.Data.DAO.UserResource,NES.HiLo.Data,Version=1.0.5012.39381,Culture=中性,PublicKeyToken=null]]。] System.Runtime.Serialization.FormatterServices.InternalGetSerializationMembers(RuntimeType类型)+7738715 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型类型,StreamingContext上下文)+258 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()+111 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerializate(对象obj、ISurrogateSelector代理选择器、StreamingContext上下文、SeroObjectInfoinit SeroObjectInfoinit、FormatterConverter转换器、ObjectWriter ObjectWriter)+422 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serializate(对象obj、ISurrogateSelector代理选择器、StreamingContext上下文、SeroObjectInfo init SeroObjectInfo init、FormatterConverter转换器、ObjectWriter ObjectWriter)+51 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo,NameInfo memberNameInfo,NameInfo typeNameInfo)+7636088 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serializate(对象图,头[]inHeaders,u BinaryWriter serWriter,Boolean fCheck)+461 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialization(流序列化流,对象图,头[]头,布尔fCheck)+134 System.Web.Util.AltSerialization.WriteValueToStream(对象值,BinaryWriter-writer)+1577


异常实际上已经告诉您问题所在,EntitySet是不可序列化的。因此,如果使用会话数据库功能,则无法将其存储在会话状态

EntitySet不实现/支持此功能。因此,要将其存储在会话状态,您必须将数据读入您自己的对象中,然后将其保存。
或者干脆不要尝试使用会话状态来“持久化”这些类型的对象,因为通常您不想这样做(没有最佳实践)。

一个最简单&最好的解决方案是使用
Json.NET

此库允许您将
LINQ
对象双向转换为其
JSON
表示。 例如,您可以在视图状态下存储产品,只需几行代码:

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
string json = JsonConvert.SerializeObject(product);
ViewState["product"] = json ;
并将其取回:

product = JsonConvert.DeserializeObject<Product>(ViewState["product"] as string);
product=JsonConvert.DeserializeObject(ViewState[“product”]作为字符串);
有关更多信息,请参阅以下两个链接:

1.)

(二)

如果您的应用程序正在使用进程内状态管理,您将能够在会话、应用程序和缓存中存储LINQ对象。但是,您将无法在视图状态下存储它们

原因是存储在视图状态中的数据是使用二进制格式化程序序列化的

因此,另一个解决方案是使
LINQ
类可序列化,您需要将所有
System.Data.LINQ.EntitySet
System.Data.LINQ.EntityRef
字段标记为
NonSerialized
属性,并使用
serializable
属性标记
LINQ


另一种解决方案是从
LINQ
对象中手动提取数据,将其存储为某种中间格式(
class
struct
,…等等),然后手动将其转换回

那么,对于这类事情,什么是最佳实践呢?尽可能地将应用程序实现为无状态,以防止出现许多问题。无论何时需要用户状态或概要文件数据,都可以将其持久化到数据库(专用表)中,并将数据加载到内存中。如果需要,您可以使用分布式内存缓存使数据可用于多个web服务器。