2009-09-24 20 views
2

아래에 내 global.asax Session_Start.net 세션 상태가 세션 ID를 만들었지 만 응답이 이미 응용 프로그램에서 플러시 되었기 때문에 세션 ID를 저장할 수 없습니다.

string myBrowser = Utils.SafeUserAgent(Request); 
foreach (string bannedbrowser in BrowserBan.BrowsersToBan) 
{ 
    if (myBrowser.IndexOf(bannedbrowser, StringComparison.OrdinalIgnoreCase) > -1) 
    { 
     HttpContext.Current.Response.Redirect("/bannedBrowser.htm"); 
     Session.Abandon(); 
     break; 
    } 

그것은 transcoders 내 사이트에 액세스하는 것을 방지합니다. 하지만 지금은 모든 오류가 발생하면

System.Web.HttpException: Session state has created a session id, but cannot 
    save it because the response was already flushed by the application. 
    at System.Web.SessionState.SessionIDManager.SaveSessionID(
     HttpContext context, String id, Boolean& redirected, Boolean& cookieAdded) 
    at System.Web.SessionState.SessionStateModule.CreateSessionId() 
    at System.Web.SessionState.SessionStateModule.DelayedGetSessionId() 
    at System.Web.SessionState.SessionStateModule.ReleaseStateGetSessionID() 
    at System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, 
     EventArgs eventArgs) 
    at System.Web.SessionState.SessionStateModule.OnEndRequest(Object source, 
     EventArgs eventArgs) 
    at System.Web.HttpApplication.SyncEventExecutionStep.System.Web 
     .HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, 
     Boolean& completedSynchronously) 
이것은 (예를 들어) Google Transcoder를 통해 액세스하려고 할 때만 발생하지만 왜 발생하는지 그리고 어떻게 방지 할 수 있는지 알고 싶습니다.

새로 고침 사용자 에이전트가 다시 평가할 수 있도록 세션을 포기해야합니다.

+0

: 당신이 (페이지에 액세스하는 특정 브라우저를 방지) 일을 할 것 같다 무엇 일 것 대부분의 상황에서 나쁜 습관을 고려했다. 아마도 스푸핑 될 수있는 클라이언트가 보낸 User-Agent 문자열을 사용하고있을 것입니다. 비 호환성 문제에 대해 사용자에게 경고하기를 원한다면 이는 합리적 일 것입니다. 하지만 당신이 사용하는 언어 ("금지 된 브라우저")에서 나는 이것이 비 호환성 경고 이상이라고 가정합니다. 이미 알고 계시고 이유를 말씀해주십시오. 함정을 명심해야합니다. –

+0

모바일 사이트이며 가끔은 Google 검색에서 사용자가 모든 것을 제거하고 사용자의 expri을 죽이는 구글의 웹 트랜스 코더를 통해 온다. 그리고 사람들/회원은 gogole 트랜스 코더를 프록시로 사용합니다. – nLL

+0

대답은 다음과 같습니다. http://stackoverflow.com/questions/904952/whats-causing-session-state-has-created-a-session-id-but-cannot-save-it-becau/1966562#1966562 – Adi

답변

2

세션을 취소하고 리디렉션하는 순서를 뒤집어 봤습니까?

Session.Abandon(); 
HttpContext.Current.Response.Redirect("/bannedBrowser.htm", true); 
+0

나는 이것을 한 적이 있지만 모든 트랜스 코더 요청에 오류가 발생하지 않기 때문에 결과를 보는 데 시간이 걸릴 것입니다. – nLL

+0

@JustLoren - 똑같은 문제가 있었고 해결책이 해결되었습니다 ;-) 덕분에. – MaYaN

4

this thread을 보았습니까? 내가 (다른 문맥에서)이 예외가 발생하여 다음과 고정

... 여담으로

void Session_Start(object sender, EventArgs e) 
{ 
string id = Session.SessionID; 
} 
+0

문자열에 세션 아이디를 지정하면 어떻게 도움이됩니까? 내가 일단 트랜스 코더라는 것을 알았다면 나는 세션 ID를 필요로하지 않는다. 트랜스 코드 인 경우 다음 요청을 확인해야하므로 플러시 된 세션 ID를 할당하고 싶지 않습니다. – nLL

+0

아마도'SessionID' get 접근자는 세션 ID에 접근 할 때 세션 ID가 초기화되게하는 부작용을 가지고 있습니다. 'Session_Start' 이벤트는 페이지 수명주기에 충분히 빠르기 때문에 세션 ID가 그 이후의 어떤 시점에 안전하게 저장되고 OP에서 오류를 생성하지는 않습니다. 그래서 요점은 세션 ID 문자열 값을 얻는 것이 아니라 단순히'SessionID' get 접근자를 실행시키는 것입니다. – JLRishe

관련 문제