2013-07-30 3 views
0

몇 개의 .aspx 페이지가 관련된 프로세스가 있습니다. 몇 가지 정보를 하나 채우고, 응답하고, iframe이있는 다른 페이지로 이동하고, 웹 서비스를 통해 iframe의 일부 문서를 서버에 업로드하고, 문서 목록 및 업로드 상태를 확인합니다. 세 번째 페이지에서 모든 데이터를 데이터베이스에 저장하는 작업을 수행하십시오.세션 값 손실

1 페이지에서 2 페이지로 이동하기 전에 몇 가지 데이터를 세션 변수에 넣었습니다. 2 페이지에서 데이터를 검색하여 표시하고, 2 페이지의 iframe에있는 페이지 내에서 파일을 업로드하는 과정에서 더 많은 데이터가 Session 변수에 입력 된 다음 3 페이지에서 세션에서 데이터를 검색하여 데이터베이스

테스트 서버에서는이 모든 것이 완벽하게 작동합니다. 라이브 서버에서 나는 (무작위로) '참조로 설정되지 않은 개체'오류를 계속 발생시킵니다. 이는 세션 변수가 사라 졌음을보고하는 것 같습니다.

나의 이해는, 그

HttpContext.Current.Session["myvariable"] 
Session["myvariable"] 

는 ...에서 .aspx 페이지 내에서 효과적으로 같은 일. 난 그냥 ... 사용하여 내 세션 변수를 설정하고

Session["Variable1"] = "fred"; 

내 세션 변수를 잃는 것 같다 (무작위로, 때로는 프로세스가 라이브 서버에서 잘 작동) 왜 어떤 아이디어가?

웹 응용 프로그램과 대조되는 웹 사이트입니다. 프레임 워크 4.0을 사용하여 VS2010에서 개발

+0

테스트 서버에서 일반적으로 응용 프로그램을 빠르게 처리합니다 (잠깐 이유는 무엇입니까?). 사용자가 2 페이지를 제출하는 데 20 분 이상 (세션 시간 초과) 걸릴 수 있습니까? –

+0

@Hans Kesting - 아니요, 테스트 할 때 이런 일이 일어나고 있습니다. 몇 분 안에 1 ~ 3 페이지를 훑어 보겠습니다. –

답변

0

라이브 서버는 응용 프로그램 풀을 재활용하고 있습니다. 이는 응용 프로그램에 사용되는 메모리를 기본적으로 다시 설정합니다. 일반적으로 제한 시간을 설정할 수 있지만 응용 프로그램 풀이 재생되면 세션이 재설정됩니다.

해결 방법은 세션 상태에 SQL Server를 사용하는 것입니다.

이 시도 : http://support.microsoft.com/kb/317604

보충 링크 : http://www.codeproject.com/Articles/104082/Configuring-ASP-session-state-on-SQL-server

더 큰 공공의 호스트와 호스트하는 경우, 그들은 아마 이미 세션 상태를 처리하기 위해 자신의 SQL을 수험 공부를했고, 당신은 할 수 있어야한다 web.config 파일에서 SQL 세션 상태를 사용하기위한 변경.

챠오

1

세션을 잃어버린 이유를 여러 가지 이유가있을 수 있습니다.

그들 중 일부

은 다음과 같습니다

  1. 귀하의 sessionState의 시간 제한이
  2. 당신은 당신의 응용 프로그램 도메인이 폴더에있는 파일처럼 재활용
  3. 귀하의 응용 프로그램 App_Data
  4. 원인이 당신의 web.config 또는 다른 파일 형식을 업데이트 만료되었습니다 풀 재활용 재활용
  5. 실제로 복사하여 붙여 넣기 만하면 많은 파일로 사이트를 업데이트하면 ASP.NET이 자동으로 세션을 재활용합니다.

왜 이벤트 로깅을 할 수 있는지 알 수없는 경우 왜 응용 프로그램 풀이 재활용되고 있습니까?이유에 대해 알게되고 그에 따라 예방 조치를 취할 수 있습니다. 당신이 Application_End

public void Application_End() 
{ 
    HttpRuntime runtime = (HttpRuntime)typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null, CultureInfo.InvariantCulture); 

    if (runtime == null) 
     return; 

    string shutDownMessage = (string)runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null, CultureInfo.InvariantCulture); 

    string shutDownStack = (string)runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null, CultureInfo.InvariantCulture); 

    //Do Logging as per your need and implementation  
    //Logging.Write(TraceEventType.Error, shutDownMessage, shutDownStack); 
} 
0

온 다음 코드 블록을 기록 할 수 로깅을위한

좋은 posiblity은 당신이 세션 변수에 비 직렬화 객체를 저장하고 프로덕션 서버 (로드 밸런싱에 PROC에서 세션을 유지입니까?). 객체가 직렬화 가능하고 직렬화 가능하지 않은지 확인하십시오.

+0

관리자라는 개체가 있습니다. firstName, lastName 및 Email 속성이 있습니다. 그 개체의 목록을 만드는 중입니다 (결코 목록에 3 개 이상의 항목이 있음). 그리고 그 목록을 세션에 저장합니다. 내 '수퍼바이저'객체를 직렬화 할 수 있다고 말하고 있습니까? –

+0

개체가 proc에서 벗어나면 직렬화가 가능해야합니다. – Peter

+0

라이브 서버를 관리 할 수는 없지만 라이브 서버에서 세션이 '유지 관리되지 않는 상태'인지 어떻게 알 수 있습니까? –

0

세션이 그 가치를 잃을 수있는 조건이 하나 더 있습니다.

피들러 도구를 사용하여이 문제를 추적 할 수 있습니다.

대부분의 조건은 솔루션과 같이 소스와 같은 요소가있을 때 찾을 수 있습니다. 그 순간 서버는 프로젝트를 다시 시작하여 근거가 없거나 잃어버린 객체를 다시로드하려고 시도합니다. 프로젝트를 다시 시작하면 모든 세션 개체가 다시 설정됩니다.

감사합니다.