質問: 一部のマシンでセッションが時々失われるのはなぜですか?
回答: ファイアウォールやウイルス対策ソフトウェアなどのマシン環境に関連している可能性があります。ファイアウォールを無効にしてみてください。
Q: Session.Abandon が呼び出されたときに、Session_End メソッドが起動されないのはなぜですか?
回答: まず、Session_End メソッドは InProc (インプロセス) タイプのセッションのみをサポートします。次に、Session_End メソッドをアクティブにするには、セッションが存在し (つまり、セッションがシステムで使用されている)、少なくとも 1 つのリクエストが完了している必要があります (このメソッドはこのリクエストで呼び出されます)。
Q: InProc モードで使用するとセッションが頻繁に失われるのはなぜですか?
回答: この問題は通常、アプリケーションがリサイクルされることが原因で発生します。これは、プロセスがリサイクルされるとセッションが aspnet_wp プロセスに保存されるため、プロセスがリサイクルされたかどうかを判断するためです。リサイクルされた場合は、システムのイベント ビューアを確認して情報を確認してください。
具体的な情報については、以下を参照してください。
ASP.NET アプリケーションでセッション変数が断続的に失われる
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
1.0 にはワーカー プロセスがリサイクルされて再起動されるバグもありました。このバグは 1.1 と sp2 で修正されました。
このバグの詳細については、以下を参照してください。
ASP.NET ワーカー プロセス (Aspnet_wp.exe) が予期せずリサイクルされる。
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792
質問: セッションがタイムアウトした後、または放棄された後、新しいセッションの ID が元の ID と同じになるのはなぜですか?
回答: SessionID はクライアント ブラウザのインスタンスに保存されるため、セッションがタイムアウトし、サーバー上でセッションが再確立されると、ブラウザによって渡されたセッション ID が使用されます。セッション ID は、再確立された後も変更されません。
Q: SessionID がリクエストごとに異なるのはなぜですか?
回答: この問題は、セッションに情報が保存されていない、つまりセッションがプログラム内のどこでも使用されていないことが原因である可能性があります。情報がセッションに保存されると、SessionID は常にブラウザーに関連付けられ、現時点では SessionID は変更されません。
Q: ASP と ASP.NET の間でセッションを共有できますか?
答え: はい。ただし、これは比較的複雑なプロセスです。Microsoft は公式のソリューションを提供しています。http: //msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET .aspQを参照してください。
: セッションにはどのような種類のオブジェクトを保存できますか?
回答: これは、使用されるセッション モードによって異なります。インプロセス (InProc) セッションを使用する場合、任意のオブジェクトを簡単に保存できます。非 InProc モードを使用する場合は、シリアル化および逆シリアル化できるオブジェクトのみを保存できます。この時点で保存されるオブジェクトがシリアル化をサポートしていない場合は、このモード (非 InProc) のセッションに保存できません。
Q: Session_End で Response.Redirect メソッドと Server.Transfer メソッドを使用してページにジャンプできないのはなぜですか?
回答: Session_End はサーバー内で起動されるイベント処理関数です。これはサーバー内のタイマーに基づいています。イベントが発生したとき、サーバー上には関連する HttpRequest オブジェクトがないため、現時点では Response.Redirect メソッドと Server.Transfer メソッドは使用できません。
Q: Session_End で HttpContext オブジェクトを取得できますか?
回答: いいえ、このイベントはどのリクエスト (リクエスト) にも関連付けられておらず、リクエストベースのコンテキストも持たないためです。
質問: Web サービスでセッションを使用するにはどうすればよいですか?
回答: Web サービスでセッションを使用するには、Web サービスの呼び出し元が追加の作業を行う必要があり、Web サービスを呼び出すときに使用される Cookie を保存して保存する必要があります。詳細については、MSDN ドキュメントの HttpWebClientProtocol.CookieContainer プロパティを参照してください。ただし、フレームワークの制限により、プロキシ サーバーを使用して Web サービスにアクセスする場合、両者はセッションを共有できません。
質問: 独自の HttpHandler をカスタマイズするときにセッションを使用できないのはなぜですか?
回答: 独自の HttpHandler を実装する場合、Session を使用する場合は、IRequiresSessionState および IReadOnlySessionState の 2 つのマーク インターフェイスのいずれかを実装する必要があります。これらのインターフェイスには、実装する必要があるメソッドはありません。 INamingContainer インターフェイスを使用する方法。
Q: Web ファームを使用しているときに、別の Web サーバーにリダイレクトするとセッションが失われるのはなぜですか?
回答: 詳細については、以下を参照してください。
PRB: SqlServer または StateServer セッション モードを使用すると、Web ファームでセッション状態が失われる
http://support.microsoft.com/default.aspx?scid=kb;en-us;325056Q
: Application_OnAcquireRequestState メソッドでセッションが無効になるのはなぜですか?
回答: セッションは、HttpApplication.AcquireRequestState イベントが呼び出された後にのみ有効になります。
詳細については、以下を参照してください。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhandlingpublicevents.asp
Q: Cookie なしが使用されている場合、HTTP ページから HTTPS に転送するにはどうすればよいですか?
回答: 次の方法を試してください。
文字列originalUrl = "/fxtest3/sub/foo2.aspx";
文字列modifiedUrl = " https://localhost " + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
Q: セッションは global.asax 内のこれらのイベントで有効ですか?
回答: セッションは AcquireRequestState イベントの後にのみ有効であり、このイベントの後のイベントはセッションを使用できます。
Q: 現在のセッションに保存されているすべてのオブジェクトを取得するにはどうすればよいですか?
回答: すべての Session.Key を走査することで取得できます。コードは次のとおりです。
ArrayList sessionCollection = new ArrayList();
foreach (Session.Keys の文字列 strKey){
sessionCollection.Add(Session[strKey]);
}
Q: 異なるアプリケーションでセッションを共有することはできますか?
回答: 直接共有することはできません。 ASP と ASP.NET 間でセッションを共有する方法を参照できます。
Q: Session.Abandon と Session.Clear の違いは何ですか?
回答: 主な違いは、Session.Abandon を使用する場合、Session_End メソッド (InProc モード) が呼び出されることです。 Session_Start メソッドは、次のリクエストが来たときに起動されます。 Session.Clear はセッション内のすべてのデータをクリアするだけであり、セッションを終了しないため、これらのメソッドは呼び出されません。
質問: Session のステータス値に順次アクセスするために、Session にはロック機構が提供されていますか?
回答: セッションはリーダー/ライター ロック メカニズムを実装します。
ページにセッションの書き込み可能機能がある場合 (つまり、ページに <%@ Page EnableSessionState="True" %> タグがある場合)、ページのセッションはリクエストが完了するまで書き込みロックを保持します。
ページにセッションの読み取り専用機能がある場合 (つまり、ページに <%@ Page EnableSessionState="ReadOnly" %> タグがある場合)、ページの完了を要求したセッションは読み取りロックを保持します。
読み取りロックは書き込みロックをブロックしますが、読み取りロックは読み取りロックをブロックしません。書き込みロックはすべての読み取りロックと書き込みロックをブロックします。これが、2 つのフレーム内の同じページが同じセッションに書き込む場合、一方が書き込みを開始する前に、もう一方 (わずかに速い方) が完了するまで待機する必要がある理由です。
Q: セッション スムーズ タイムアウトとは何を意味しますか?
回答: セッション スムーズ タイムアウトとは、ページがセッションにアクセス (使用) している限り、タイムアウトが更新される (リタイミングとして理解できます)、つまり、タイムアウトがページ リクエストから再計算されることを意味します。ただし、ページではセッションを無効にすることはできません。現在のページのセッションに自動的にアクセスし、タイムアウトを更新します。
質問: global.asax のイベント処理関数でセッションが無効なのはなぜですか?
回答: どのイベント処理関数でセッションが使用されるかによって異なります。セッションは AcquireRequestState イベントの後のみ有効です。このイベントの後のすべてのイベント処理関数はセッションを使用できますが、それ以前のイベント処理関数は使用できません。
質問: 現在のアプリケーションのセッションに依存するコンポーネントを作成する場合、Session["Key"] を直接使用してその値を取得できないのはなぜですか?
回答: Session["Key"] は実際には this.Session["Key"] であり、Page のプロパティとして提供されるため、このプロパティをコンポーネント内で直接使用することはできません。セッションは次の方法で使用できます。
HttpContext.Current.Session["Key"] = "My Seesion Value";
Q: InProc モードを使用してセッションを保存すると、その時点でセッションはどこに保存されますか?
回答: IIS が異なれば、処理方法も異なります。
IIS5 を使用する場合、セッションは aspnet_wp.exe のプロセス領域に保存されます。
IIS6 を使用する場合、デフォルトではすべてのアプリケーションがアプリケーション プールを共有し、セッションは w3wp.exe のプロセス スペースに保存されます。
Q: セッションのタイムアウト設定は分単位ですか、それとも秒単位ですか?
回答: 分です。デフォルトは 20 分です。
Q: ページでエラーが発生した場合、セッションは保存されますか? Session_End でクリーンアップを処理する必要がありますが、失敗します。なぜですか?
回答: Session_End は、セッションが InProc モードで実行されている場合にのみ実行されます。 Session_End で使用されるアカウントは、aspnet_wp ワーカー プロセスを実行しているアカウントです (これは machine.config で設定できます)。したがって、統合セキュリティを使用して Session_End メソッドで SQL に接続する場合、aspnet_wp プロセスのアカウントを使用してリンクが開かれ、このときの成功または失敗は SQL セキュリティ設定によって決まります。
質問: Cookieless を true に設定すると、リダイレクトするとセッションが失われるのはなぜですか?
回答: Cookie なしを使用する場合は、プログラム内の絶対パスを相対パスで置き換える必要があります。絶対パスを使用すると、ASP.NET は URL に SessionID を保存できなくなります。
たとえば、myDirmySubdirdefault.aspx を ..default.aspx に置き換えます。
質問: SortedList をセッションまたはキャッシュに保存するにはどうすればよいですか?
回答: 次の方法を参照してください。
SortedList x = 新しい SortedList();
x.Add("Key1", "ValueA");
x.Add("Key2", "ValueB");
セッションに保存:
セッション["SortedList1"] = x;
取得するには次の方法を使用します。
SortedList y = (SortedList) Session["SortedList1"];
チャヘも同様です。
Q: 「設定ファイルまたは Page ディレクティブで、enableSessionState が true に設定されている場合にのみセッション状態を使用できます」というエラー メッセージが表示されるのはなぜですか?
回答: この問題は、Microsoft Visual Studio .NET 開発環境がインストールされているマシンに Windows Sharepoint Server (WSS) をインストールした後に発生することがあります。
WSS ISAPI フィルターはすべてのリクエストを処理します。仮想ディレクトリを通じて ASP.NET アプリケーションを参照する場合、ISAPI フィルタは URL をフォルダ ディレクトリに割り当てません。
解決策は、WSS がインストールされているマシンではセッションを使用しないことです。
詳細については、以下を参照してください。
Windows SharePoint Services を使用する ASP.NET ではセッション状態を使用できません
http://support.microsoft.com/default.aspx?scid=kb;en-us;837376Q
: セッション変数を削除するにはどうすればよいですか?
回答: Session 変数を削除したい場合は、HttpSessionState.Remove() メソッドを使用できます。
Q: アプリケーションの実行中にセッションが占有するメモリの量を知る方法はありますか?
答え: いいえ。現時点では、この値を検証することはできません。少なくとも私はこれに関する情報をまだ見ていません。ただし、パフォーマンス モニターとプログラム コードを通じて値を大まかに見積もることができます。
質問: ページ内にフレームセットがある場合、最初のリクエストで各フレームに表示されるページの SessionID が異なることがわかります。なぜですか?
回答: その理由は、フレームセットが ASPX ページではなく HTML ページに配置されているためです。
通常の状況では、フレームセットが aspx ページの場合、ページをリクエストすると、まず Web サーバーにリクエストが送信され、SessionID が取得されます。その後、ブラウザはフレーム内の他のページをそれぞれリクエストします。全ページのSessionID 同様で、FrameSetページのSessionIDです。
ただし、HTML ページを使用して FrameSet ページを作成する場合、最初のリクエストは HTML ページになり、ページがサーバーから返されると、セッションは生成されません。そのため、ブラウザはフレーム内のページをリクエストします。ページは独自の SessionID を生成するため、この場合にはこの問題が発生します。ページを更新すると、SessionID は同じになり、最後にリクエストされたページの SessionID になります。
Q: 同じ SQL Server サーバー上の異なるデータベースに異なるアプリケーションのセッションを保存することは可能ですか。
回答: はい、以下を参照してください。
修正: SQL Server セッション状態のすべてのアプリケーションに対して 1 つの SQL データベースを使用すると、ボトルネックが発生する場合がある
http://support.microsoft.com/default.aspx?scid=kb;en-us;836680Q
: Session_End で有効な HttpSessionState オブジェクトと HttpContext オブジェクトを取得できますか?
回答: このメソッドで HttpSessionState オブジェクトを取得でき、Session を使用して直接アクセスできます。ただし、イベントがリクエストに関連付けられていないため、コンテキスト オブジェクトが存在しないため、HttpContext オブジェクトを取得できません。
Q: SQL Server モードでセッションを使用すると、セッションが期限切れにならないのはなぜですか?
回答: SqlServer モードでは、SQL エージェントの登録によってセッションの有効期限が完了します。SQL エージェントが実行されているかどうかを確認してください。
Q: EnableSessionState を「ReadOnly」に設定した後も、InProc モードでセッション値を変更できるのはなぜですか?
回答: EnableSessionState が ReadOnly とマークされている場合でも、ユーザーは InProc モードでセッションを編集できます。唯一の違いは、リクエスト中にセッションがロックされないことです。
Q: SQL をリンクするときにパスワードを指定しないようにするにはどうすればよいですか?
回答: 信頼できるリンクを使用するか、暗号化されたリンク文字列を使用します。詳細については、以下を参照してください。
ASP.NET ユーティリティを使用して資格情報とセッション状態の接続文字列を暗号化する方法
http://support.microsoft.com/default.aspx?scid=kb;en-us;329290Q
: 自分のクラスでセッションを使用するにはどうすればよいですか?
回答: HttpContext.Current.Session を使用できます。具体的な方法は次のとおりです。
HttpContext.Current.Session["SessionKey"] = "SessionValue";
同様に、この方法で Application オブジェクトを使用できます。
Q: SQL Server モードに切り替えた後、リクエストがハングするのはなぜですか?
回答: セッションに保存されているすべてのオブジェクトが SQL Server モードで保存できるかどうかを確認してください。つまり、これらのオブジェクトはシリアル化をサポートしている必要があります。
質問: セッションが Cookie なしに設定されている場合、どのような影響がありますか?
回答: Cookieless が true に設定されている場合、主に次の制約があります。
1.ページ内では絶対リンクは使用できません
2. HTTP と HTTPS 間の切り替えに加えて、アプリケーションで他のいくつかの手順を完了する必要があります。
他の人にリンクを送信すると、このときのURLにはセッションIDの情報が含まれるため、2人でセッションを共有することになります。
Q: セッションをデータベースに保存できますか?
回答: もちろん、詳細については、http: //support.microsoft.com/default.aspx?scid=kb;en-us; 311209 を参照してください
。 -------------------------------------------------- -------------------------------------------------- -- -
Q: InProc モードで使用するとセッションが頻繁に失われるのはなぜですか?
追加の状況: Access データベースを使用している場合、データベースがダウンロードされないようにするために、データベース ファイルを bin ディレクトリに置き、データベースが InProc モードの場合にはダウンロードできないようにすることを考える人もいるかもしれません。 、これもセッションが失われる原因になります。アプリケーションにアクセスすると、データがデータベースに頻繁に書き込まれるため、bin ディレクトリの下にあるデータベース ファイルが変更され、bin ディレクトリが変更されるとセッションが失われます。
この問題を解決するには、データベース ファイルのストレージ パスを変更するか、StateServer モードまたは SqlServer モードを使用します。
詳細については、以下を参照してください。
PRB: ASP.NET InProc セッション ステート モードを使用するとセッション データが失われる
http://support.microsoft.com/default.aspx?scid=kb;en-us;324772
-------------------------------------------------- -----------------------
dnyz のブログから選択された Asp.net のマルチプロジェクト共有セッション
http://dev.csdn.net/article/21/21714.shtm
1. d:MyProjectMyProject.sln などの空のソリューションを作成します。
2. Web アプリケーションのルート ディレクトリ d:MyProjectWebMis を d:MyProject の下に作成し、それをhttp://localhost/WebMisの仮想ディレクトリに設定します。
3. WebMis ディレクトリ内のモジュールに従って、d:MyProjectWebMisLogin および d:MyProjectWebMisCheckOut などの新しいディレクトリを作成します。
4. VS.net のモジュールに基づいて、 http://localhost/WebMis/Loginおよびhttp://localhost/WebMis/CheckOutなどの新しい Web アプリケーションを作成します。
5. 作成後、Login ディレクトリと CheckOut ディレクトリは仮想ディレクトリとして自動的に設定されます。
6. WebMis プロジェクトにログインとチェックアウトのプロジェクト参照を追加します。
7. IISマネージャーでログインとチェックアウトの仮想ディレクトリを削除します。
8.各プロジェクトのglobal.asaxを削除(ルートプロジェクトを削除)
9. プロジェクトの web.config 内の次のコードを削除します (ルート プロジェクトを削除します)。
<認証モード="Windows" />
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="データ ソース=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
または、web.config を削除します (各ディレクトリで設定する必要がない場合)
10. コンパイル後、実行できます。