4

セッション変数をそれに属する変数タイプにキャストしようとすると、「ほぼランダムな」エラーが発生します。明確にするために:

クラス「Elemento」があります。そのインスタンスを作成して、セッション変数に配置します。

Elemento elem = new Elemento(id, quantity);
list.Add(elem);
context.Session["cart"] = list;

今、私はリストを回復する必要があり、次の方法でそれを実行しようとしています:

list = (List<Elemento>)context.Session["cart"];

まあ..この「いつか」はうまくいきますが、うまくいかないこともあります! 最初に試したときは問題なく動作しましたが、今では「内部サーバー エラー 500」というエラーが表示されます。

[A]System.Collections.Generic.List 1[Elemento] a [B]System.Collections.Generic.List1[Elemento] のキャストは不可能です。Il tipo A ha origine da 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' nel conto 'LoadNeither' nella posizione 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll '。Il tipo B ha origine da 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' nel conto 'LoadNeither' nella posizione 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll '。

それを翻訳..

[A]System.Collections.Generic.List 1[Elemento] to [B]System.Collections.Generic.List1[Elemento] をキャストできません。タイプ A は、コンテキスト 'LoadNeither' と位置 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll' を持つ 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' に由来します。 . タイプ B は、コンテキスト 'LoadNeither' と位置 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll' を持つ 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' に由来します。 .

IISキャッシュを空にすることで、これを「しばらくの間」解決できます..しかし、ビジュアルスタジオからソリューションを構築すると、再び発生します。

インターフェイスを使用してこれを解決できる場所を読みました..しかし、私はまだそれらの使用方法を学んでいるので、今のところ直接試すことはできません。これに対するテスト済みの解決策はありますか?

編集: krshekhar ソリューションで動作します:

list = context.Session["cart"] as List<Elemento>;

ありがとう!

4

2 に答える 2

0

IIS メモリに問題がある可能性があると思います。IIS を再起動しようとしましたか? 別の IIS サーバーを使用していますか?

Cookie など、他の方法でオブジェクトを保存することをお勧めします。

スケーラビリティについて考える場合、クッキーはサーバーではなくクライアントに保存されるため、セッション オブジェクトよりも優れたソリューションを提供します。

幸運を祈ります

于 2013-01-08T10:31:50.367 に答える
0

Elemento再構築時にエラーが発生すると述べているため、クラスまたはそれが参照する別のクラス内のフィールドに変更があり、セッション状態からのオブジェクトの逆シリアル化が中断されている可能性が高いようです。

「複雑な」オブジェクトを IIS セッション状態に格納する場合、それらはBinaryFormatter(System.Runtime.Serialization.Formatters.Binary名前空間で) を使用してシリアル化されます。このフォーマッタは、シリアライズされるクラスの変更に敏感であり、データが最初にシリアライズされてからグラフ内のいずれかのクラスが変更された場合、オブジェクト グラフを正常にデシリアライズできない可能性があります。再構築後に壊れると言うことを考えると、これはここでの問題のようです。

BCL からセッション状態にタイプのみを保存することをお勧めします (これらは .NET バージョン間でのみ変更されるため)。ISerializableまたは、オブジェクトにインターフェイスを実装することにより、独自のカスタム シリアライゼーションを実装するElementoと、プロジェクトのビルド間の互換性を維持できます。

于 2013-01-08T11:50:54.027 に答える