- - PR -
[ASP.NET]ステートサーバについて
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-04-28 14:30
いつも拝見させてもらってます。
セッション情報を保持するのにステートサーバを採用しようと思うのですが、 以下のようにWeb.configを修正して実行できる時とできないときがあります。 --Web.config <sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424" /> --エラーメッセージ アセンブリ System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 の型 System.Data.DataView は シリアル化可能として設定されていません。 説明 : 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 例外の詳細: System.Runtime.Serialization.SerializationException: アセンブリ System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 の型 System.Data.DataView は シリアル化可能として設定されていません。 とでます。セッション情報を引き継ぐ方法に問題があるのでしょうか。 エラーページが出ない場合は別のセッション情報の引継ぎかたをしています。 みなさんはInProcではなくStateServerを使用されているでしょうか。 | ||||
|
投稿日時: 2003-04-28 15:22
StateServer ,SqlServer を利用するときは、
オブジェクトをシリアライズして、Sessionデータを保存するので、 Serializable属性が設定されている型(派生元オブジェクトも含めて)でなければ 利用できません。 従って、セッション情報を引き継ぐ方法ではなく、セッションに格納するオブジェクトに よって、エラーが表示されていることになります。 DataViewではなく、DataSetをSessionに入れると、とりあえず、この場はOKかも。 #DataSetのシリアライズデータって大きくなりがちなので、お勧めできませんが。。 #私も、途中から導入してみようかな。と思いましたが、既に使えない型を 一部に使用していて保留にしている経緯があったりします。 | ||||
|
投稿日時: 2003-05-01 10:39
いのつちさんありがとうございます。
オブジェクトのシリアル化ですね。 たしかにDataViewはシリアライズ機能はないですね。 DataViewを使用しないとちょっとまずいので、今回はInProcを 使用しようと思います。ありがとうございました。 あと、InProcではパフォーマンスがいいのだが、ワーカープロ セスが停止したらセッション情報が消えてしまうと思います。 いのつちさんがInProcを使用されてて、不都合だった事象とか はありますか? | ||||
|
投稿日時: 2003-05-01 18:33
サイトの更新時なんかに、一応パフォーマンスモニターで眺めて、 少ない頃を見計らって、DLLを更新したりしています。 ごめん!って心の中でつぶやきながら(^^; ロジック周りの修正時は、ほんのちょっとの修正でも、全体に影響するのが ASPに比べて厳しいですね(苦笑) StateServerは以後、それ程詳しく調べていないのですが、 プロセスの再起動だと、たぶん継続して使用できるのだと思いますが、 独自のクラスをSessionに使用した場合、そのクラス自身を更新したら どうなるんでしょう? Ver1.0のシリアライズされたデータを Ver2.0でデシリアライズする際に Ver1.0のデータをうまく吸収する仕掛けがいるのかな?(できるのかな?) それとも、DLLの更新だと過去のSessionは無効になるんでしょうか・・。 | ||||
|
投稿日時: 2003-06-13 19:23
.NETで業務アプリを開発しようとしています。
セッション管理をStateServerにして見ようかと思いますが、 その評価についてお聞きたく投稿します。 文献で見る仕様については良いと思うのですが、実際使って みた場合の感想を教えてください。 ・運用後のメンテやトラブル事例など 以上よろしくお願いします。 | ||||
|
投稿日時: 2004-01-13 13:23
みなさん色々とありがとうです。レスが遅れてしまいました(^o^;
ステートサーバはシリアライズしないといけないので対象のオブジェクトを一旦、 シリアル化できるオブジェクトに変換してセッション変数へ格納しました。 | ||||
|
投稿日時: 2004-04-02 11:19
トピックを読ませていただきました。私も同様の処理をしようとしているのですが
なかなかうまくいかないので、こちらで質問させてください。 Stateサーバにて、カスタムエラーページへの遷移処理を作成しているのですが Global.asaxでセッション変数に値を入れても、遷移先のページで値が取得出来ません。 (コード) Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) '発生した例外をセッション変数に保存 Session("UserException") = Server.GetLastError().GetBaseException() System.Diagnostics.Debug.Assert(False) '定義したエラーページに遷移 Response.Redirect("UserError.aspx") Response.End() End Sub 遷移先のページで、保存したExceptionをいろいろ調べたかったのですが… デバッグ実行したところ、Global.asaxの上のプロシージャ内では 確かにセッション変数にExceptionが入っているのですが、 UserError.aspxに遷移すると値がなくなっている(Nothing)のです。 また、セッション変数「UserException」はGlobal.asaxでのみ作成していたので、 あらかじめ例外を投げる元ページで同じキー名でセッション変数を作り 適当な値を入れておいたところ、Global.asaxで値を入れた時は例外がちゃんと 入っているのですが、UserError.aspxに遷移したとたんに 元ページでセットしておいた値に戻ってしまいました。 Exceptionクラスは暗黙的にシリアライズされるとのことなので Stateサーバでも問題はないはずなのですが、なぜかGlobal.asaxでセットした値が 消えてしまいます。 ちなみに、全く同じコードでInprocサーバで実行してみたらちゃんと値は入っていました。 これは、どのような原因が考えられますか? どなたか、ご意見頂けると嬉しいです。よろしくお願いします。 | ||||
1
