ASP.NET Web表单+ Spring.NET过渡到StateServer问题

问题描述

我正在尝试使用NHibernate 4和Spring.NET改进用ASP.NET编写的旧版应用程序,并将其会话状态移至StateServer(本地ASP> NET状态服务)以加快请求处理。 我遇到了与序列化问题有关的错误

无法序列化会话状态。在“ StateServer”中, 在“ sqlServer”模式下,ASP.NET将序列化会话状态对象, 结果是不可序列化的对象或MarshalByRef对象是 不允许。如果序列化类似,则适用相同的限制 由自定义会话状态存储以“自定义”模式完成。 说明:在执行期间发生未处理的异常 当前的Web请求。请查看堆栈跟踪以获取更多信息 有关错误及其在代码中起源的信息。

我已经遍历了通过容器使用的所有对象(服务,存储库,配置对象等),现在随着IIS开始到达Spring.NET类,事情变得一团糟:

[SerializationException:类型 “ Spring.Objects.Factory.Support.WebObjectFactory” w zestawie 'Spring.Web,版本= 2.0.0.40001,文化=中性, PublicKeyToken =无效” nie jest oznaczony jakomożliwydo serializacji。” System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType 类型)+12672447
System.Runtime.Serialization。 c__displayClass9_0.b__0(MemberHolder _)+42 System.Collections.Concurrent.ConcurrentDictionary 2.GetorAdd(TKey key,Func 2 valueFactory)+73
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type 类型,StreamingContext上下文)+186
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +166 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(对象 obj,ISurrogateSelector surrogateSelector,StreamingContext上下文, SerObjectInfoInit serObjectInfoInit,IFormatterConverter转换器, ObjectWriter objectWriter,SerializationBinder装订器)+187
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo,NameInfo memberNameInfo,NameInfo typeNameInfo)+581
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object 图,Header [] inHeaders,__ BinaryWriter serWriter,布尔值fCheck) +470 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(流 serializationStream,对象图,Header []标头,布尔值fCheck) +137 System.Web.Util.AltSerialization.WriteValuetoStream(对象值,BinaryWriter编写器)+1619

[HttpException(0x80004005):Niemożnaserializowaćstanu sesji。 w ^ trybie'StateServer'和'sqlServer'应用程序ASP.NETbędzie serializowaćobiekty stanu sesji i dlatego obiektyniemożliwedo serializacji lub obiekty MarshalByRef niesądozwolone。为了萨摩 ograniczenie ma zastosowanie,耶希利·波多巴纳·萨利扎扎 wykonywana przez magazyn niestandardowychstanówsesji w trybie “自定义”。]
System.Web.Util.AltSerialization.WriteValuetoStream(对象值, BinaryWriter作家)+1708
System.Web.SessionState.SessionStateItemCollection.WriteValuetoStreamWithAssert(Object 值,BinaryWriter作家)+35
System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter 作家)+641
System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData 项,流)+241
System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData item,Int32 initialStreamSize,Byte []&buf,Int32&length,布尔 compressionEnabled)+62
System.Web.SessionState.OutOfProcSessionStateStore.SetAndReleaseItemExclusive(HttpContext 上下文,字符串ID,SessionStateStoreData项,对象lockId,布尔值 newItem)+110
System.Web.SessionState.SessionStateModule.OnReleaseState(Object 来源,EventArgs eventArgs)+686
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +201 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep步骤)+132 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤) 步骤,布尔值和已同步完成)+73

对此,我有几个问题:

  1. 为什么IIS正在触摸这些对象?会话状态在项目中用于存储一些未使用这些引用的类。
  2. 除了InProc以外,是否有人使用过处于会话状态的Spring.NET并可以分享自己的经验?
  3. 如何避免在Spring.NET库中进行更改?
  4. 如何编写可以检测到此类对象的单元测试?

无法重写整个应用程序。 可以删除Spring.NET。

系统版本信息:.NET Framework:4.0.30319; ASP.NET:4.8.4210.0

编辑1

问题1的答案很简单:您可以指定对象的范围,其中一些对象使用scope =“ session”,这意味着Spring.Net正在创建一些代理以将它们存储在会话中州。它们必须是可序列化的,因此在使用某些外部库时会出现与此相关的错误。 而且第3个问题也可以用相同的方式回答。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)