实际问题和问题:
当我将 sessionState 模式从 InProc 切换到 StateServer 时,Web 服务器引发了序列化错误。我需要更改什么才能使其正常工作?
技术:
ASP.Net、IIS7、Framework 4 中的 vb.Net 和 C#
细节:
我们正在将 ASP.Net 网站的 sessionState 模式从 InProc 切换到 StateServer。这是我们为能够在同一服务器上的 2 个 Web 应用程序之间共享 sessionID 和会话信息所做的几项更改中的一项。托管网站的服务器也将运行 ASP.Net State Service 服务。
当我在主站点的 web.config 文件中切换 sessionState 的模式时,出现服务器错误:
Invalid cast from 'System.Int32' to 'OurCompany.OurApp.Objects.User+enUserType'.
User 类被声明为 Serializable,并且一直是我们在会话中存储用户的方式:
<System.ComponentModel.DesignerCategory("Code"), SerializableAttribute()> Public Class User
Inherits BaseClass
Implements System.Runtime.Serialization.ISerializable
我暂时将声明更改为:
<Serializable()> Public Class User
万一这会有所帮助,但它并没有改变任何东西。
User 类有一个公共枚举 enUserType:
Public Enum enUserType
usrInternal = 1
usrCustomer
usrCarrier
usrSupplier
End Enum
和公共财产:
Public Property UserType() As enUserType
Get
Return m_iUserType
End Get
Set(ByVal Value As enUserType)
m_iUserType = Value
End Set
End Property
这些没有特别标记为可序列化,但根据我的阅读,它们不应该是。以防万一,我用它们标记为 Serializable 对其进行了测试,但它并没有解决问题。
如果我将 sessionState 模式切换回 InProc,它工作正常。我的印象是,如果您的对象为 InProc 正确序列化,它们也应该适用于 StateServer。我的这个假设是基于我读过的其他人的问题和答案,但这可能是错误的。
如果我的 web.config 配置不正确,这就是 sessionState 标记的样子:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false"/>
我已经在 Web 服务器上启动了 ASP.Net 状态服务服务器,并检查了注册表中的配置,以确保它正在侦听默认端口 42424,并且确实如此。
如果有任何您认为相关的详细信息,请告诉我,我会添加它们。
谢谢,
-BEP
附加信息
在查看了 EdSF 建议的其他一些文章后,我添加了 XmlAttribute XmlEnum 但这没有帮助。我尝试了其他一些建议,但没有得到任何不同的结果。
这让我对问题出在哪里提出了一些假设,并且我在类代码中找到了一个地方,其中发生了对序列化信息的一些转换,这就是问题所在。