80

この障害が断続的に発生します。

私はGoogleで見つけたものをかなりよく要約しているこのリンクを見つけました:http: //www.wacdesigns.com/2009/02/03/session-state-has-created-a-session-id-but-応答がすでにアプリケーションによってフラッシュされたため、保存できません/

基本的には、Web構成設定DisplayWhenNewSessionを設定するか、Session_OnStartでSession.SessionIDを取得してセッション状態を開始することができると言っています。

しかし、誰かがします:

a)これについての説明があります

またはさらに良い、b)試行錯誤された修正がある

http応答ヘッダーに影響を与えるようなことをした後、応答をフラッシュできないことに気付きました。これを行うと、毎回エラーが発生しますが、これは断続的です。SessionIDは、ASPXページまたはPage_Load(すべてのフラッシュが呼び出される場所)の前に、ページ応答の最初にASP.NETによって自動的に作成される必要があります。

更新: 振り返ってみると、これはファイルをブラウザーにストリーミングするときに発生していることがわかりました。ほとんどのブラウザは実際には検索エンジンボットです。ダウンロードを開始してからブラウザを閉じることでこのエラーを再現できるため、ブラウザはダウンロードが完了するのを待ってからダウンロード操作をキャンセルしていると考えられます。これは他の通常のページでも見たことがありますが、99%の確率でダウンロードページです。

4

5 に答える 5

89

私は持っています!

global.asaxファイルでこれを行います:

void Session_Start(object sender, EventArgs e) 
{
    // Code that runs when a new session is started
    string sessionId = Session.SessionID;
}

とても簡単。できます!

于 2009-12-27T17:56:17.540 に答える
23

このエラーは次の場合に表示されるようです:

  • アプリケーション開始

  • Session_Start / Endイベントで何かをしている場合でも、Global.asaxを使用している場合

  • アプリケーションが応答のフラッシュを早すぎます

  • フラッシュ前にセッションを使用していません

リリース時にsessionIDを保存しようとすると、セッション状態によって発生します。

System.Web.SessionState.SessionIDManager.SaveSessionID(HttpContext context, String id, Boolean& redirected, Boolean& cookieAdded)
System.Web.SessionState.SessionStateModule.CreateSessionId()
System.Web.SessionState.SessionStateModule.DelayedGetSessionId()
System.Web.SessionState.SessionStateModule.ReleaseStateGetSessionID()
System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs)
System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Global.asaxが存在すると、SessionIDが呼び出されたときにHttpSessionStateの代わりにセッションが使用されていなくても、SessionStateModule(late?)によるリリース時にセッションIDが保存されると思います。

これが、 string sessionId=Session.SessionID;である理由です。トリックは問題を回避します。

初期化動作のため、アプリケーションの起動時にのみ表示されると思います。

ソリューション/トリック

  • すでに述べたように、Page_Loadでのフラッシュは避けてください

  • ページ上のセッション状態を非アクティブ化します(EnableSessionState)

  • フラッシュの前にSessionIDトリックを使用する

  • フラッシュ後に発生する可能性のあるエラーを気にしない場合は、.Flush()の代わりにResponse.End()を使用してください

于 2010-03-16T12:02:11.237 に答える
6

ここでの問題は、 ASP.NETページライフサイクルの概要Page_Loadによると、レンダリング段階よりずっと前に、ページ出力を引き起こすために何かをしていることである可能性があります。

PreRenderステージが終了するまで、ページ出力をトリガーする可能性のあることを絶対に行わないようにしてください。

于 2009-05-25T01:16:05.977 に答える
3

自分でこの問題に遭遇したばかりで、私は自分の発見を共有したいと思いました。

web.config設定のDisplayWhenNewSessionは、Codeplex上の1つの特定のカスタムコントロールにのみ適用されるため、関係ありません(リンクを失ってしまい申し訳ありません)。

もう1つの提案は、SessionIdを早期に初期化することで機能するようです。Reflectorを使用してコードを掘り下げたところ、これによってエラーがどのように防止されたかはよくわかりませんでしたが、確かに機能しました。

このバグに遭遇したように見えるほとんどの人のように、アプリ内のどこでもResponse.Flush()を明示的に呼び出していません。記録のために、MVCも使用しています。

于 2009-10-15T15:30:35.743 に答える
0

これは非常に古いことを認識していますが、他の人に当てはまる可能性のあるエラーの別の理由を見つけました。MVCを使用していて(私は.Net4.0でMVC4を使用していた)、web.config要素を使用してページをバッファリングしないように設定した場合

<pages buffer="false">    

次に、コードでデータをセッションオブジェクトにプッシュしようとすると、子ビューまたはセッション状態アクセスを実行するアクションの前にページのレンダリングが開始された場合に、このエラーが発生するリスクがあります。

このような場合、上記のバッファ設定をtrueに変更することでエラーを修正できます。または、セッションアクセスコードを子アクション/子ビューではなくメインビューに移動します。

于 2014-10-22T10:12:52.383 に答える