"세션 상태에서 세션 ID를 만들었지 만 응용 프로그램에서 이미 응답을 플러시했기 때문에 저장할 수 없습니다."의 원인이됩니다.


80

이 결함이 간헐적으로 발생합니다.

Google에서 찾은 내용을 상당히 잘 요약 한 링크를 찾았습니다. http://www.wacdesigns.com/2009/02/03/session-state-has-created-a-session-id-but- 응답이 이미 응용 프로그램에 의해 플러시 되었기 때문에 저장할 수 없습니다.

기본적으로 웹 구성 설정 DisplayWhenNewSession을 설정하거나 Session_OnStart에서 Session.SessionID를 가져 와서 세션 상태를 시작해 볼 수 있다고 말합니다.

하지만 누구든지 :

a) 이것에 대한 설명이

또는 더 나은, b) 시도되고 테스트 된 수정 사항

http 응답 헤더에 영향을 미치는 작업을 수행 한 후 응답을 플러시 할 수 없다는 것을 알고 있습니다. 이렇게하면 매번 오류가 발생 하지만 간헐적입니다. SessionID는 ASPX 페이지 또는 Page_Load (내 모든 플러시가 호출되는 위치)의 어떤 것보다 먼저 페이지 응답의 시작 부분에서 ASP.NET에 의해 자동으로 생성되어야합니다.

업데이트 : 리플렉션에서 파일을 브라우저로 스트리밍 할 때 이런 일이 발생한다는 것을 알고 있습니다. 대부분의 브라우저는 실제로 검색 엔진 봇입니다. 다운로드를 시작한 다음 브라우저를 닫아이 오류를 재현 할 수 있으므로 브라우저는 다운로드 작업을 취소하기 전에 다운로드가 완료 될 때까지 기다리지 않을 것입니다. 다른 일반 페이지에서도 이것을 보았지만 99 %의 경우 다운로드 페이지입니다.


1
나는 똑같은 문제가 있습니다. 내가 그것을 본 유일한 이유는 Global.asax에 예외 처리를 넣었을 때였습니다. 매우 간헐적입니다. 누군가가 이것에 대한 답을 안다면 좋을 것입니다!
Scott Ferguson

6
링크가 끊어졌습니다. :-(
Casebash

답변:


85

나는 가지고있다!

global.asax 파일에서 다음을 수행합니다.

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

너무 쉽게. 효과가있다!


이 방법은 공개 / 보호 된 방법입니까-비공개로 유지되므로 보호해야한다고 생각합니다. 샘플이 완료 되었는가, sessionId가 저장되지 않았다는 사실은 괜찮다고 생각합니다. 중요한 것은 생성 트리거입니다. 맞습니까?
Chris Kimpton

감사. 나는 이것이 일반적으로 작동한다고 생각하므로 100 % 확실하지는 않지만 수락 된 답변으로 표시하겠습니다. 이것이 작동하지 않는 경우를 발견하면 누구든지 제발 의견을 줄 수 있습니까? 감사.
mike nelson

나는 단순히이 방법을 내 global.asax 파일에 추가하고 질문과 동일한 내 오류 메시지를 제거했습니다. 감사합니다.
vanhornRF

이것은 내 문제를 해결했습니다 (내가 플러시를 강요했습니다) 그러나 이것이 해결책으로 작동하는 이유를 알고 있습니까?
Amicable 2013-04-25

이 답변으로 많은 시간이 절약되었습니다. 결코 짐작하지 못했을 것입니다. 감사합니다!
HockeyJ 2014

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 (늦게?)에 의해 릴리스시 세션 ID가 저장됩니다.

이것이 바로 string sessionId = Session.SessionID; 트릭은 문제를 피하십시오.

초기화 동작으로 인해 응용 프로그램 시작시에만 나타납니다.

솔루션 / 트릭 :

  • 이미 말했듯이 Page_Load에서 플러시하지 마십시오.

  • 페이지에서 세션 상태 비활성화 (EnableSessionState)

  • 플러시 전에 SessionID 트릭을 사용하십시오.

  • 플러시 후 발생할 수있는 오류에 대해 신경 쓰지 않는다면 .Flush () 대신 Response.End ()를 사용하십시오.


6

여기서 문제 Page_LoadASP.NET 페이지 수명주기 개요 에 따르면 렌더링 단계 이전에.

PreRender단계가 끝날 때까지 페이지 출력을 트리거 할 수있는 작업을 수행하지 마십시오 .


고마워요. 오늘 밤에 대해 살펴 보겠습니다. 왜 간헐적인지 잘 모르겠습니까?
마이크 넬슨

부적절한 이벤트에서 조건부 Response.Write ()일까요?
Josh E

3

이 문제를 직접 겪은 후 발견 한 내용을 공유 할 것이라고 생각했습니다.

web.config 설정 DisplayWhenNewSession은 Codeplex의 특정 사용자 지정 컨트롤에만 적용되므로 관련이 없습니다 (죄송합니다. 링크를 잃어 버렸습니다).

다른 제안은 SessionId를 일찍 초기화하여 작동하는 것으로 보입니다. 나는 Reflector를 사용하여 코드를 파헤 쳤고 이것이 여기서 오류를 어떻게 방지하는지 잘 알 수 없었지만 확실히 우리에게는 효과가있었습니다!

이 버그를 겪는 것처럼 보이는 대부분의 사람들과 마찬가지로 우리는 앱 어디에서나 Response.Flush ()를 명시 적으로 호출하지 않습니다. 우리는 또한 기록을 위해 MVC를 사용하고 있습니다.


0

나는 이것이 매우 오래되었다는 것을 알고 있지만 다른 사람들에게 적용될 수있는 오류에 대한 또 다른 이유를 발견했습니다. MVC (.Net 4.0과 함께 MVC 4를 사용 중임)를 사용하고 web.config 요소를 사용하여 페이지를 버퍼링하지 않도록 설정 한 경우

<pages buffer="false">    

그런 다음 코드에서 세션 개체로 데이터를 푸시하려고하면 페이지가 자식보기 또는 세션 상태 액세스를 수행하는 작업 전에 렌더링을 시작했다면이 오류가 발생할 위험이 있습니다.

이러한 경우 위의 버퍼 설정을 true로 변경하여 오류를 수정할 수 있습니다. 또는 세션 액세스 코드를 하위 작업 / 하위보기가 아닌 기본보기로 이동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.