- PR -

[ASP.NET]ステートサーバについて

1
投稿者投稿内容
ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 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を使用されているでしょうか。
いのつち
ベテラン
会議室デビュー日: 2002/05/14
投稿数: 73
投稿日時: 2003-04-28 15:22
StateServer ,SqlServer を利用するときは、
オブジェクトをシリアライズして、Sessionデータを保存するので、
Serializable属性が設定されている型(派生元オブジェクトも含めて)でなければ
利用できません。

従って、セッション情報を引き継ぐ方法ではなく、セッションに格納するオブジェクトに
よって、エラーが表示されていることになります。

DataViewではなく、DataSetをSessionに入れると、とりあえず、この場はOKかも。
#DataSetのシリアライズデータって大きくなりがちなので、お勧めできませんが。。

#私も、途中から導入してみようかな。と思いましたが、既に使えない型を
一部に使用していて保留にしている経緯があったりします。

ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 2003-05-01 10:39
いのつちさんありがとうございます。

オブジェクトのシリアル化ですね。
たしかにDataViewはシリアライズ機能はないですね。
DataViewを使用しないとちょっとまずいので、今回はInProcを
使用しようと思います。ありがとうございました。

あと、InProcではパフォーマンスがいいのだが、ワーカープロ
セスが停止したらセッション情報が消えてしまうと思います。
いのつちさんがInProcを使用されてて、不都合だった事象とか
はありますか?
いのつち
ベテラン
会議室デビュー日: 2002/05/14
投稿数: 73
投稿日時: 2003-05-01 18:33
引用:

あと、InProcではパフォーマンスがいいのだが、ワーカープロ
セスが停止したらセッション情報が消えてしまうと思います。
いのつちさんがInProcを使用されてて、不都合だった事象とか
はありますか?



サイトの更新時なんかに、一応パフォーマンスモニターで眺めて、
少ない頃を見計らって、DLLを更新したりしています。
ごめん!って心の中でつぶやきながら(^^;
ロジック周りの修正時は、ほんのちょっとの修正でも、全体に影響するのが
ASPに比べて厳しいですね(苦笑)

StateServerは以後、それ程詳しく調べていないのですが、
プロセスの再起動だと、たぶん継続して使用できるのだと思いますが、
独自のクラスをSessionに使用した場合、そのクラス自身を更新したら
どうなるんでしょう?
Ver1.0のシリアライズされたデータを Ver2.0でデシリアライズする際に
Ver1.0のデータをうまく吸収する仕掛けがいるのかな?(できるのかな?)

それとも、DLLの更新だと過去のSessionは無効になるんでしょうか・・。

ジーニ
常連さん
会議室デビュー日: 2002/08/27
投稿数: 21
投稿日時: 2003-06-13 19:23
.NETで業務アプリを開発しようとしています。
セッション管理をStateServerにして見ようかと思いますが、
その評価についてお聞きたく投稿します。
 文献で見る仕様については良いと思うのですが、実際使って
みた場合の感想を教えてください。

・運用後のメンテやトラブル事例など

以上よろしくお願いします。
ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 2004-01-13 13:23
みなさん色々とありがとうです。レスが遅れてしまいました(^o^;

ステートサーバはシリアライズしないといけないので対象のオブジェクトを一旦、
シリアル化できるオブジェクトに変換してセッション変数へ格納しました。
Cookie
ベテラン
会議室デビュー日: 2002/11/05
投稿数: 59
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)