ArrayTypeMismatch Session中的异常

时间:2013-12-07 09:39:33

标签: .net asp.net-mvc session exception authorization

我有一个用ASP.NET MVC编写的网站。有一些自定义授权逻辑,并添加了以下属性。

public sealed class CustomAuthorizeAttribute : AuthorizeAttribute

在AuthorizeCore方法的覆盖中,我尝试访问Session和:

  1. HttpContext.Current.Session!= null
  2. HttpContext.Current.Session.IsNewSession == false
  3. 但是HttpContext.Current.Session.Keys会抛出一个ArrayTypeMismatch异常。另外HttpContext.Current.Session [“SomeKey”]抛出相同的异常。因此,我无法从会话中获取值。
  4. 更多信息: 模式:SQL服务器

    <sessionState allowCustomSqlDatabase="true" cookieless="UseCookies" mode="SQLServer" sqlConnectionString="Server=.;Database=ASPState;integrated security=true;" timeout="120" sqlCommandTimeout="240" />
    

    堆栈追踪:

    at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseArrayMember(ParseRecord pr)    在System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseMember(ParseRecord pr)    在System.Runtime.Serialization.Formatters.Binary.ObjectReader.Parse(ParseRecord pr)    在System.Runtime.Serialization.Formatters.Binary ._ BinaryParser.ReadMemberReference()    在System.Runtime.Serialization.Formatters.Binary。 _BinaryParser.Run()    在System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler,__BinaryParser serParser,Boolean fCheck,Boolean isCrossAppDomain,IMethodCallMessage methodCallMessage)    在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream,HeaderHandler handler,Boolean fCheck,Boolean isCrossAppDomain,IMethodCallMessage methodCallMessage)    在System.Web.Util.AltSerialization.ReadValueFromStream(BinaryReader reader)    在System.Web.SessionState.SessionStateItemCollection.ReadValueFromStreamWithAssert()    在System.Web.SessionState.SessionStateItemCollection.DeserializeItem(String name,Boolean check)    在System.Web.SessionState.SessionStateItemCollection.get_Item(String name)    在System.Web.SessionState.HttpSessionStateContainer.get_Item(String name)    在System.Web.SessionState.HttpSessionState.get_Item(String name)    在{mynamespace} .SessionHelper.get_UserSessionContext()在d:{mypath} \ SessionHelper.cs:第41行    在{mynamespace} .CustomAuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext)在d:{mypath} \ CustomAuthorizeAttribute.cs:第50行    在System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext)    在System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext,IList`1过滤器,ActionDescriptor actionDescriptor)    在System.Web.Mvc.Async.AsyncControllerActionInvoker。&lt;&gt; c_ DisplayClass25.b _1e(AsyncCallback asyncCallback,Object asyncState)

    任何人都可以解释为什么会出现这种错误,我该如何排除故障以及解决这个问题的可能方法?

1 个答案:

答案 0 :(得分:2)

这听起来像基于类型的序列化程序(BinaryFormatterNetDataContractSerializer等)的常见问题,它与构建之间的不兼容类型一起使用。在一般情况下,这种类型的工作方式足以使通常允许您在构建之间使用相同的数据(因为您通常不会更改涉及的类型),但是:有一个很大的动态类型生成时的问题 - 在Entity Framework和NHibernate等工具中广泛使用。从本质上讲,因为它们在运行时是子类,所以几乎可以保证您永远无法在重建之间进行反序列化,甚至可能在应用程序重新启动之间以及集群中不同节点之间进行反序列化。

这里有两条指导:

  • 永远不会将您的标准域实体存储在会话(或缓存)中:拥有专用的DTO(即表示您要存储的数据的简单类型)并存储它。如果可能,使此类型不可变(特别是为了避免同一对象与克隆的问题,这在提供者之间发生变化)
  • 如果可能的话,控制序列化,使其不依赖于类型定义:“基于合同”的序列化程序(如XmlSerializer,Json.NET或protobuf-net)都允许您在会话中使用CLOB或BLOB数据(或缓存)图层,即使您在程序集之间移动类型并重命名它们,也可以进行无痛序列化/反序列化