2012-05-10 3 views
1

再コンパイル後にセッションを維持するために、私はセッションステートを格納するためにSQLServerを使用しています。これは、私がカスタムオブジェクトを格納していない限り非常にうまく動作します。セッションに格納された再コンパイル後にカスタムオブジェクトを使用しようとすると、私は次のエラーを取得する:SQLセッションデータベースに格納されたオブジェクトを使用するときに再コンパイルした後のCastException

[A]MyObject cannot be cast to [B]MyObject. 
Type A originates from 'App_Code.9qazkuv_, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null' 
    in the context 'Default' at location 
    'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files 
     \root\26676eb7\92c7e946\App_Code.9qazkuv_.dll'. 
Type B originates from 'App_Code.jndyusrx, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null' 
    in the context 'Default' at location 
    'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files 
     \root\26676eb7\92c7e946\App_Code.jndyusrx.dll'. 

私は数ヶ月のために、このバグをstrugling、私がこれまでに見つけた唯一の解決策されていますオブジェクトをdllファイルに入れることです。いくつかのケースでは、これはそれほど簡単ではありません。この問題を回避するには、より簡単な方法が必要です。助言がありますか?

奇妙なことは、このバグが再現しにくいということです。私はサイトをテスト環境にテスト環境にコピーしようとしましたが、同じサーバー上のテスト環境でエラーを再現することはできません。そして、localhost上で問題のdosentはまったく起こります。

答えて

0

問題は、セッションステートクラスがBinaryFormatterを使用してオブジェクトをシリアル化し、バージョンとクラスアセンブリ名を格納するということです。 JSONやXMLのように、自分のオブジェクトをとり、自分自身を直列化し、その結果を文字列として状態に追加する、セッション状態クラスのラッパーを記述する方がよいでしょう。

+0

ええ、私は2,3年前にそれを試していましたが、それはローカルホストでうまくいきました。しかし、サーバ上では、シリアライズに使用した.netクラスが原因でサイトがダウンしました。しかし、おそらく別のシリアライザを使用して修正することができます。私は – Eirik

+0

を使用した図書館の名前を覚えておいてください。それらのために、あなたのDBにオブジェクトを格納するためにEFを使用してください – esskar

関連する問題