セッション紛失問題

10392 ワード

昨日は1日やったAspでNet(.net framework 2.0)では、aspxページがFramesetに埋め込まれている場合、Sessionが失われるという問題が発生していることがわかりました.具体的には、IIS(Windows XP)の下に2つのサイトがあります.AサイトはFrameset開発を使用しています.一部のページはBサイトの下のページにハイパーリンクしています.このとき、Bサイトの下でSessionを使用すると、BサイトのSessionが失われます.どちらも単独でテストしても問題はなく、セッションは正常で、Framesetを併用すると問題が発生します.ネットで解決策を見つけたのは、BサイトのページPage_Loadメソッドには、Response.AddHeader("P3P","CP=CAO PSA OUR");あるいは、IISには、Httpヘッダ(名称は「P 3 P」、値は「CP=CAO PSA OUR」、引用符を含まない)を加える.これでSessionは失われません.同様にIframeを使用する場合も同様の問題が発生する場合はWebを修正する.configプロファイル:
cookieless=「false」を「true」に変更すればいいです.しかし、ページにJavascriptのwindowを採用するという小さな問題もあります.location.href=''というようにリダイレクトすると、システムはこれが別の新しいリクエストであり、新しいSessionIdが生成され、元のSessionと同じ損失をもたらすと考えられます.リダイレクトにはResponseを使用しますRedirect()がいいです. 
 
回転:http://www.cnblogs.com/strawberryww/archive/2009/04/28/1444980.html
 
c#SESSION紛失問題解決方法について
 
作者:飞翔
私たちはC#でプログラムを開発するとき、Sessionが不安定で、データが失われていることがよくあります.次は、Sessionデータ損失の解決策です.
1、WEB.CONFIGファイルでSESSION状態保存モードを変更します.
C#コード
C# code//
次のコードは私のプロジェクトで発生した問題で、主にcookielessの問題で、falseに設定すると、損失の問題が発生します.
<sessionState mode='StateServer' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='180'/>   



<sessionState mode='StateServer' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='180'/> 


2、システムサービス「ASP.NET状態サービス」を起動し、システムのデフォルトは手動で起動する
3.SESSIONに保存されているデータ型がカスタムである場合、構造などのカスタムデータ型においてセッション状態をシーケンス化する.すなわち、クラスまたは構造の説明の前に[Serializable]を付ける.
以上の3部を完了すると、状態は保存できますが、アクセスページがブラウザで表示されるパスには、(S(lto 3 j 0 eg 25 cztmqtxevm 5 tb 4))などの文字が追加されています.
最近ASPをやっています.NETプロジェクトの时、テストサイトはいつもSessionの中の値を取ることができなくて、ネット上で検索して、いくつかの解决方法を探し当てて、ここに记录します.最後に、StateServerに格納されているメソッドを使用して問題を解決しました. 
SessionStateのTimeout)は、その主な原因は3つあります.1:ウイルスを殺すソフトウェアがWebをスキャンします.Configファイル、その時Sessionは間違いなく落ちて、これはマイクロソフトの言い方です.二:プログラム内部にSessionを落とすコードがあり、サーバーのメモリが不足している.3:プログラムにはフレームワークページとドメイン間の状況がある.1つ目の解決策は、ウイルスを殺すソフトウェアをスキャンWebを遮断することである.Configファイル(プログラム実行時に自分で編集しない)2つ目はコードのSessionの有無をチェックすることです.Abandon()とか.3つ目はWindowサービスにおけるASP.NET State Serviceが起動します. 
ヘルプの内容は次のとおりです:(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconsessionstate.htm)  ASP.NETは、複数のWebリクエストにわたって任意のデータとオブジェクトを格納できる簡単で使いやすいセッションステータスモデルを提供します.この操作は、辞書ベースのメモリ内のオブジェクト参照(これらのオブジェクト参照はIISプロセスに存在する)キャッシュを使用して完了します.プロセス内のセッションステータス・モードを使用する場合は、次の制限を考慮します.
プロセス内のセッションステータスモードを使用する場合、aspnet_wp.exeまたはアプリケーションドメインが再起動すると、セッションステータスデータが失われます.これらの再起動は通常、アプリケーションのWebで発生します.configファイルの要素では、memoryLimitなどの新しいプロセスが条件が満たされたときに起動するプロパティを設定します.Globalを変更します.asaxまたはWeb.configファイル.WebアプリケーションのBinディレクトリに変更します.ウイルス対策ソフトでGlobalをスキャンして修正する.asaxファイル、Web.configファイルまたはWebアプリケーションのBinディレクトリの下にあるファイル.アプリケーションのWebでconfigファイルの要素では、ネットワークパークモードが有効になっています.プロセス内のセッションステータスモードは使用しないでください.ランダムなデータ損失が発生します. 
次の2つがあります.
一:最初のページにSESSIONを置いて、それからREDIRECTは2番目のページに行きます.解決策は、REDIRECTでendResponseをFALSEに設定することです. 
二:ASP.NETではACCESSデータベースが使用されており,データベースはbinディレクトリに格納されている.解決策は、更新されるファイルをBINディレクトリに入れないことです. 
参照先:http://www.dotnet247.com/247reference/msgs/58/290316.aspx 
Asp.Netデフォルトの構成の下で、Sessionがなぜか失われた原因と解決方法
通常の操作でSessionは理由もなく失われます.プログラムは絶え間なく操作されているので、セッションがタイムアウトする可能性を排除します.また、Sessionタイムアウト時間は60分と設定されており、こんなに早くタイムアウトすることはありません. 
今度CSDNの上で招待状を探して、多くの人がこの問題を討論していることを発見して、それから私はまたgoogleをして、マイクロソフトのウェブサイトの上で類似の内容があることを発見しました. 
今、原因と解決策を書きます. 
理由:
なぜならNetプログラムはデフォルト設定なのでWeb.コンフィグファイルのセッションに関する設定は以下の通りです.
C#コード
C# code
<sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/>   



<sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/> 


sessionStateラベルには、InProc、StateServerの3つの値を取得できる属性modeがあります.SQLServer.デフォルトではInProc、すなわちセッションをプロセス内に保存する(IIS 5はaspnet_wp.exe、IIS 6はW 3 wp.exe)プロセスは不安定であり、あるイベントが発生するとプロセスが再開されるため、そのプロセス内に格納されているセッションが失われる. 
どのような場合にプロセスが再開されますか?マイクロソフトの文章は私たちに教えてくれた:1、プロファイルの中のprocessModelラベルのmemoryLimit属性2、Global.asaxまたはWeb.configファイルが変更された3、BinフォルダのWebプログラム(DLL)が変更された4、ウイルス対策ソフトがスキャンされた.configファイル.詳細はPRB:Session variables are lost intermittently in ASP.を参照してください.NET applications 
解決策:
前述したsessionStateラベルのmodeプロパティには、InProcのほかにStateServer、SQLServerの3つの値を取ることができます.この2つのセッションを保存する方法はいずれもプロセス外であるため、aspnet_wp.exeが再開された場合、Sessionには影響しません. 
modeをStateServerに設定してください.StateServerは本機のサービスであり、システムサービスでサービス名がASP.であることを見ることができる.NET State Serviceのサービスは、デフォルトでは起動しません.modeをStateServerに設定したら、手動でサービスを開始してください. 
これにより、コンピュータが再起動したり、StateServiceがクラッシュしたりしない限り、セッションは失われません(セッションタイムアウトで破棄されるのは正常です). 
このほか、Sessionを他のパソコンのStateServiceで保存することもできます.具体的な修正はこうです.同様にsessionStateラベルにはstateConnectionString='tcpip=127.0.0.1:42424'の属性があり、ipアドレスがあり、デフォルトは自機(127.0.0.1)であり、StateServiceサービスを実行するコンピュータIPに変更することができ、異なるコンピュータ上のAspを実現することができる.Netプログラムはセッションに接続されています. 
より高い要件がある場合は、サービス期間の再起動時にSessionも失わないようにする必要があります.modeをSQLServerに設定することも考えられます.同様にsqlConnectionsStringプロパティを変更する必要があります.SQLServerを使用してセッションを保存する操作については、こちらをご覧ください. 
StateServerまたはSQLServerを使用してセッションを格納する場合、セッションに保存する必要があるすべてのオブジェクトは、int、stringなどの基本データ型以外はシーケンス化する必要があります.[Serializable]タブをシーケンス化するクラスの前に置くだけです.次のようになります.
C# code
[Serializable]

public class MyClass

{

......

}