实际问题和疑问:
当我将sessionState模式从InProc切换到StateServer时,Web服务器抛出序列化错误。我需要更改什么才能使其正常工作?
技术:
ASP.Net,IIS7,Framework 4中的vb.Net和C#详细信息:
我们正在将我们的ASP.Net网站的sessionState模式从InProc切换到StateServer。这是我们为了能够在同一服务器上的2个Web应用程序之间共享sessionID和会话信息而进行的一些更改。托管Web的服务器也将运行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,但从我读到的,它们不应该是。为了以防万一,我测试了它们被标记为Serializable,并没有解决问题。
如果我将sessionState模式切换回InProc,它可以正常工作。我的印象是,如果你的对象为InProc正确序列化,它们也应该适用于StateServer。我将这个假设基于我读过的其他人的问题和答案,但这可能是错误的。
如果我的web.config配置不正确,这就是sessionState标记的样子:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false"/>
我已经在Web服务器上启动了ASP.Net State Service服务器,并检查了注册表中的配置,以确保它正在侦听默认端口42424并且它是。
如果您认为有任何更多细节相关,请告诉我,我会将其添加进来。
谢谢,
-BEP
其他信息
在查看了EdSF建议的其他文章之后,我添加了XmlAttribute XmlEnum,但没有帮助。我尝试了其他一些建议,并没有得到任何不同的结果。
这让我对问题的位置做了一些假设,并且我在类代码中找到了一个位置,其中序列化信息的某些转换正在发生,这就是问题所在。