147

ASP.NET ページのSessionオブジェクトのプロパティSessionIDが要求間で変わるのはなぜですか?

次のようなページがあります。

...
<div>
    SessionID: <%= SessionID %>
</div>
...

そして、ブラウザーに関係なく、F5 を押すたびに出力が変化し続けます。

4

14 に答える 14

239

これがまさにその理由だ

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;
}
于 2010-05-20T13:32:51.473 に答える
98

Cladudio で示されているように Session オブジェクトが初期化されている場合でも、これが発生する可能性がある別の、より陰湿な理由があります。

Web.config に、<httpCookies>設定されているが実際には HTTPS を使用していないエントリがあるrequireSSL="true"場合: 特定の要求に対して、セッション Cookie は送信されません (または返されない可能性がありますが、どちらかわかりません)。リクエストごとにまったく新しいセッションになります。

これは難しい方法であることがわかりました。特定の変更がアプリケーションを壊したことがわかるまで、ソース管理でいくつかのコミット間を行ったり来たりするのに数時間を費やしました。

于 2011-08-19T14:31:38.327 に答える
5

私の場合、セッション Cookieにプレフィックスを含むドメインが含まれていることがわかりましたが、ページをリクエストしていないときに. URLに 追加するとすぐに問題が修正されました。後で、Cookie のドメインをではなく に設定するように変更しました。www.www.
www..mysite.comwww.mysite.com

于 2013-03-14T15:18:41.677 に答える
5

私の問題は、web.configでこれを設定したことでした

<httpCookies httpOnlyCookies="true" requireSSL="true" />

これは、非 SSL (デフォルト) でデバッグする場合、認証 Cookie がサーバーに送り返されないことを意味します。これは、サーバーがクライアントへのリクエストごとに新しい認証 Cookie を (新しいセッションで) 送信することを意味します。

修正するには、requiressl を web.config で false に設定し、web.release.config で true に設定するか、デバッグ中に SSL を有効にします。

SSL をオンにする

于 2016-02-18T18:15:52.993 に答える
4

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;
                }
            }
        }
于 2013-01-20T00:26:59.640 に答える
2

私の問題は、Microsoft MediaRoom IPTV アプリケーションにありました。MPF MRML アプリケーションは Cookie をサポートしていないことが判明しました。web.configでcookielessセッションを使用するように変更すると、問題が解決しました

<sessionState cookieless="true"  />

それに関する非常に古い記事があります: Cookieless ASP.NET

于 2014-04-15T23:32:35.660 に答える
2

Session_OnStart が定義されている場合やセッションが初期化されている場合でも、リクエスト間で SessionID が変更される別の可能性は、URL ホスト名に無効な文字 (アンダースコアなど) が含まれていることです。これは IE 固有 (検証されていない) だと思いますが、URL がたとえば の場合http://server_name/app、IE はすべての Cookie をブロックし、リクエスト間でセッション情報にアクセスできなくなります。

実際、各リクエストはサーバー上で個別のセッションを起動するため、ページに複数の画像やスクリプト タグなどが含まれている場合、これらの GET リクエストのそれぞれがサーバー上で異なるセッションになります。

詳細情報: http://support.microsoft.com/kb/316112

于 2013-10-22T14:03:26.127 に答える
0

非常に短いセッション タイムアウトがないことを確認してください。また、Cookie ベースのセッションを使用している場合は、セッションを受け入れていることも確認してください。

FireFox webDeveloperToolbar は、アプリケーションに設定された Cookie を確認できるため、このような場合に役立ちます。

于 2010-05-20T13:27:10.303 に答える
0

セッション ID のリセットには多くの原因が考えられます。ただし、上記のいずれも私の問題とは関係ありません。ということで、今後の参考にさせていただきます。

私の場合、リクエストごとに作成された新しいセッションにより、無限のリダイレクト ループが発生しました。リダイレクト アクションは、OnActionExecutingイベントで発生します。

また、クライアント側でサイトをキャッシュしないようにするために、すべての http ヘッダーをクリアしています ( Response.ClearHeadersメソッドを使用したOnActionExecutingイベントでも)。しかし、そのメソッドは、ユーザーのセッションに関する情報を含むすべてのヘッダーをクリアし、その結果、Temp ストレージ (後でプログラムで使用していた) 内のすべてのデータをクリアします。そのため、Session_Start イベントで新しいセッションを設定しても役に立ちませんでした。

私の問題を解決するために、リダイレクトが発生したときにヘッダーを削除しないようにしました。

それが誰かを助けることを願っています。

于 2014-05-22T10:29:40.437 に答える