ASP.NET ページのSessionオブジェクトのプロパティSessionIDが要求間で変わるのはなぜですか?
次のようなページがあります。
...
<div>
SessionID: <%= SessionID %>
</div>
...
そして、ブラウザーに関係なく、F5 を押すたびに出力が変化し続けます。
これがまさにその理由だ
Cookie ベースのセッション状態を使用する場合、ASP.NET は、Session オブジェクトが使用されるまで、セッション データ用のストレージを割り当てません。その結果、セッション オブジェクトがアクセスされるまで、ページ要求ごとに新しいセッション ID が生成されます。アプリケーションでセッション全体の静的セッション ID が必要な場合は、アプリケーションの Global.asax ファイルに Session_Start メソッドを実装し、データを Session オブジェクトに格納してセッション ID を修正するか、またはアプリケーションの別の部分でコードを使用できます。 Session オブジェクトに明示的にデータを格納するアプリケーション。
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx
したがって、基本的に、バックエンドでセッション オブジェクトにアクセスしない限り、リクエストごとに新しい sessionId が生成されます
編集
このコードは、ファイル Global.asax に追加する必要があります。Session オブジェクトにエントリを追加するので、期限が切れるまでセッションを修正します。
protected void Session_Start(Object sender, EventArgs e)
{
Session["init"] = 0;
}
Cladudio で示されているように Session オブジェクトが初期化されている場合でも、これが発生する可能性がある別の、より陰湿な理由があります。
Web.config に、<httpCookies>
設定されているが実際には HTTPS を使用していないエントリがあるrequireSSL="true"
場合: 特定の要求に対して、セッション Cookie は送信されません (または返されない可能性がありますが、どちらかわかりません)。リクエストごとにまったく新しいセッションになります。
これは難しい方法であることがわかりました。特定の変更がアプリケーションを壊したことがわかるまで、ソース管理でいくつかのコミット間を行ったり来たりするのに数時間を費やしました。
私の場合、セッション Cookieにプレフィックスを含むドメインが含まれていることがわかりましたが、ページをリクエストしていないときに. URLに
追加するとすぐに問題が修正されました。後で、Cookie のドメインをではなく に設定するように変更しました。www.
www.
www.
.mysite.com
www.mysite.com
私の問題は、web.configでこれを設定したことでした
<httpCookies httpOnlyCookies="true" requireSSL="true" />
これは、非 SSL (デフォルト) でデバッグする場合、認証 Cookie がサーバーに送り返されないことを意味します。これは、サーバーがクライアントへのリクエストごとに新しい認証 Cookie を (新しいセッションで) 送信することを意味します。
修正するには、requiressl を web.config で false に設定し、web.release.config で true に設定するか、デバッグ中に SSL を有効にします。
Neville の回答 (web.config で requireSSL = true を削除) を使用し、Joel Etherton のコードをわずかに変更して、ユーザーとページに応じて SSL モードと非 SSL モードの両方で実行されるサイトを処理するコードを次に示します (Iコードに戻って、まだ SSL でテストしていませんが、うまくいくと期待しています。
if (HttpContext.Current.Response.Cookies.Count > 0)
{
foreach (string s in HttpContext.Current.Response.Cookies.AllKeys)
{
if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
{
HttpContext.Current.Response.Cookies[s].Secure = HttpContext.Current.Request.IsSecureConnection;
}
}
}
私の問題は、Microsoft MediaRoom IPTV アプリケーションにありました。MPF MRML アプリケーションは Cookie をサポートしていないことが判明しました。web.configでcookielessセッションを使用するように変更すると、問題が解決しました
<sessionState cookieless="true" />
それに関する非常に古い記事があります: Cookieless ASP.NET
Session_OnStart が定義されている場合やセッションが初期化されている場合でも、リクエスト間で SessionID が変更される別の可能性は、URL ホスト名に無効な文字 (アンダースコアなど) が含まれていることです。これは IE 固有 (検証されていない) だと思いますが、URL がたとえば の場合http://server_name/app
、IE はすべての Cookie をブロックし、リクエスト間でセッション情報にアクセスできなくなります。
実際、各リクエストはサーバー上で個別のセッションを起動するため、ページに複数の画像やスクリプト タグなどが含まれている場合、これらの GET リクエストのそれぞれがサーバー上で異なるセッションになります。
非常に短いセッション タイムアウトがないことを確認してください。また、Cookie ベースのセッションを使用している場合は、セッションを受け入れていることも確認してください。
FireFox webDeveloperToolbar は、アプリケーションに設定された Cookie を確認できるため、このような場合に役立ちます。
セッション ID のリセットには多くの原因が考えられます。ただし、上記のいずれも私の問題とは関係ありません。ということで、今後の参考にさせていただきます。
私の場合、リクエストごとに作成された新しいセッションにより、無限のリダイレクト ループが発生しました。リダイレクト アクションは、OnActionExecutingイベントで発生します。
また、クライアント側でサイトをキャッシュしないようにするために、すべての http ヘッダーをクリアしています ( Response.ClearHeadersメソッドを使用したOnActionExecutingイベントでも)。しかし、そのメソッドは、ユーザーのセッションに関する情報を含むすべてのヘッダーをクリアし、その結果、Temp ストレージ (後でプログラムで使用していた) 内のすべてのデータをクリアします。そのため、Session_Start イベントで新しいセッションを設定しても役に立ちませんでした。
私の問題を解決するために、リダイレクトが発生したときにヘッダーを削除しないようにしました。
それが誰かを助けることを願っています。