実際の問題と質問:
sessionState モードを InProc から StateServer に切り替えると、Web サーバーがシリアル化エラーをスローします。正しく動作させるには何を変更する必要がありますか?
テクノロジー:
ASP.Net、IIS7、Framework 4 の vb.Net および C#
詳細:
ASP.Net Web サイトの sessionState モードを InProc から StateServer に切り替えています。これは、同じサーバー上の 2 つの Web アプリケーション間でセッション ID とセッション情報を共有できるようにするために行っているいくつかの変更のうちの 1 つです。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 があります。
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 State Service サーバーを起動し、レジストリの構成をチェックして、既定のポート 42424 でリッスンしていることを確認しました。
関連すると思われる詳細が他にもあればお知らせください。追加します。
ありがとう、
-BEP
追加情報
EdSF によって提案された他の記事をいくつか見た後、XmlAttribute XmlEnum を追加しましたが、それは役に立ちませんでした。他の提案をいくつか試しましたが、異なる結果は得られませんでした。
これにより、問題がどこにあるのかについていくつかの仮定を捨てることができ、シリアル化された情報でいくつかの変換が行われているクラス コード内の場所を見つけました。それが問題の場所でした。