질문: 일부 시스템에서 세션이 가끔 손실되는 이유는 무엇입니까?
답변: 방화벽이나 바이러스 백신 소프트웨어 등 시스템 환경과 관련이 있을 수 있습니다.
Q: Session.Abandon이 호출될 때 Session_End 메서드가 실행되지 않는 이유는 무엇입니까?
답변: 우선 Session_End 메소드는 InProc(in-process) 유형의 Session만 지원합니다. 둘째, Session_End 메서드를 활성화하려면 Session이 존재해야 하며(즉, Session이 시스템에서 사용된 경우) 최소한 하나의 요청이 완료되어야 합니다(이 요청에서 이 메서드가 호출됩니다).
Q: InProc 모드에서 사용할 때 세션이 자주 손실되는 이유는 무엇입니까?
답변: 이 문제는 일반적으로 프로세스 내 세션을 사용할 때 세션이 aspnet_wp 프로세스에 저장되기 때문에 애플리케이션이 재활용되면서 발생합니다. 프로세스가 재활용되었는지 확인하기 위해 세션이 자연스럽게 사라집니다. 재활용되었으므로 시스템의 이벤트 뷰어에서 정보를 확인할 수 있습니다.
구체적인 정보는 다음을 참조하세요.
ASP.NET 응용 프로그램에서 세션 변수가 간헐적으로 손실됩니다.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
1.0에는 작업자 프로세스가 재활용되고 다시 시작되는 버그도 있었습니다. 이 버그는 1.1과 sp2에서 수정되었습니다.
이 버그에 대한 자세한 내용은 다음을 참조하세요.
ASP.NET 작업자 프로세스(Aspnet_wp.exe)가 예기치 않게 재활용됩니다.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792
질문: 세션 시간이 초과되거나 중단된 후 새 세션의 ID가 원래 세션의 ID와 동일한 이유는 무엇입니까?
답변: SessionID는 클라이언트 브라우저의 인스턴스에 저장되기 때문에 Session이 Time Out되어 서버에서 Session이 다시 설정되면 브라우저에서 전달한 Session ID가 사용됩니다. 따라서 Session Time Out 이후에는 세션 ID는 재설정된 후에도 변경되지 않습니다.
Q: 요청마다 SessionID가 다른 이유는 무엇입니까?
답변: 이 문제는 세션에 정보를 저장하지 않아서 발생할 수 있습니다. 즉, 세션이 프로그램의 어느 곳에서도 사용되지 않습니다. 정보가 세션에 저장된 후 SessionID는 항상 브라우저와 관련되며 이때 SessionID는 변경되지 않습니다.
Q: ASP와 ASP.NET 간에 세션을 공유할 수 있습니까?
대답: 그렇습니다. 그러나 이는 비교적 복잡한 프로세스입니다. Microsoft는 공식 솔루션을 제공합니다. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET .aspQ
: 세션에는 어떤 유형의 개체를 저장할 수 있나요?
답변: 이는 사용된 세션 모드에 따라 다릅니다. InProc(InProc) 세션을 사용할 때 모든 개체를 쉽게 저장할 수 있습니다. InProc이 아닌 모드를 사용하는 경우에는 직렬화 및 역직렬화 가능한 객체만 저장할 수 있습니다. 이때 저장된 객체가 직렬화를 지원하지 않는 경우에는 이 모드(비InProc)의 Session에 저장할 수 없습니다.
Q: Session_End에서 Response.Redirect 및 Server.Transfer 메서드를 사용하여 페이지로 이동할 수 없는 이유는 무엇입니까?
답변: Session_End는 서버 내부에서 실행되는 이벤트 처리 함수입니다. 서버 내부의 타이머를 기반으로 합니다. 이벤트가 발생하면 서버에 관련 HttpRequest 개체가 없으므로 현재로서는 Response.Redirect 및 Server.Transfer 메서드를 사용할 수 없습니다.
Q: Session_End에서 HttpContext 개체를 가져올 수 있나요?
답변: 아니요. 이 이벤트는 어떤 요청(Request)과도 연관되지 않고 요청 기반 컨텍스트가 없기 때문입니다.
질문: 웹 서비스에서 세션을 어떻게 사용하나요?
답변: 웹 서비스에서 세션을 사용하기 위해서는 웹 서비스를 호출하는 측에서 추가 작업을 해야 하며, 웹 서비스 호출 시 사용되는 쿠키를 저장하여 보관해야 합니다. 자세한 내용은 HttpWebClientProtocol.CookieContainer 속성에 대한 MSDN 설명서를 참조하세요. 그러나 프레임워크 제한으로 인해 프록시 서버를 사용하여 웹 서비스에 액세스하는 경우 두 서버가 세션을 공유할 수 없습니다.
질문: 내 HttpHandler를 사용자 정의할 때 왜 세션을 사용할 수 없나요?
답변: 자체 HttpHandler를 구현할 때 Session을 사용하려면 IRequiresSessionState 및 IReadOnlySessionState 중 하나를 구현해야 합니다. 이러한 인터페이스에는 구현해야 할 메서드가 없으며 단지 마크 인터페이스일 뿐입니다. INamingContainer 인터페이스를 사용하는 방법.
Q: 웹팜을 사용할 때 다른 웹 서버로 리디렉션하면 세션이 손실되는 이유는 무엇입니까?
답변: 자세한 내용은 다음을 참조하세요.
PRB: SqlServer 또는 StateServer 세션 모드를 사용하는 경우 웹 팜에서 세션 상태가 손실됩니다
http://support.microsoft.com/default.aspx?scid=kb;en-us;325056Q
: Application_OnAcquireRequestState 메서드에서 내 세션이 유효하지 않은 이유는 무엇입니까?
답변: 세션은 HttpApplication.AcquireRequestState 이벤트가 호출된 후에만 유효합니다.
자세한 내용은 다음을 참조하세요.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhandlingpublicevents.asp
Q: 쿠키 없는 기능이 사용되는 경우 HTTP 페이지에서 HTTPS로 어떻게 연결합니까?
답변: 다음 방법을 시도해 보십시오.
String OriginalUrl = "/fxtest3/sub/foo2.aspx";
String ModifiedUrl = " https://localhost " + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
Q: global.asax의 해당 이벤트에서 세션이 유효합니까?
답변: Session은 AcquireRequestState 이벤트 이후에만 유효하며 이 이벤트 이후의 이벤트는 Session을 사용할 수 있습니다.
Q: 현재 세션에 저장된 모든 개체를 가져오는 방법은 무엇입니까?
답변: 모든 Session.Key를 탐색하여 얻을 수 있습니다. 코드는 다음과 같습니다:
ArrayList sessionCollection = new ArrayList();
foreach(Session.Keys의 문자열 strKey){
sessionCollection.Add(세션[strKey]);
}
Q: 다른 애플리케이션에서 세션을 공유할 수 있습니까?
답변: 직접 공유할 수 없습니다. ASP와 ASP.NET 간에 Session을 공유하는 방법을 참조할 수 있습니다.
Q: Session.Abandon과 Session.Clear의 차이점은 무엇입니까?
대답: 주요 차이점은 Session.Abandon을 사용할 때 Session_End 메서드(InProc 모드에서)가 호출된다는 것입니다. 다음 요청이 오면 Session_Start 메소드가 실행됩니다. Session.Clear는 세션의 모든 데이터만 지우고 세션을 종료하지 않으므로 해당 메서드는 호출되지 않습니다.
질문: Session의 상태 값에 순차적으로 접근하기 위해 Session은 잠금 메커니즘을 제공합니까?
답변: 세션은 리더/라이터 잠금 메커니즘을 구현합니다.
페이지에 세션에 대한 쓰기 가능 기능이 있는 경우(즉, 페이지에 <%@ Page EnableSessionState="True" %> 태그가 있음) 페이지의 세션은 요청이 완료될 때까지 쓰기 잠금을 유지합니다.
페이지에 세션에 대한 읽기 전용 기능이 있는 경우(즉, 페이지에 <%@ Page EnableSessionState="ReadOnly" %> 태그가 있는 경우) 페이지 완료를 요청한 세션은 읽기 잠금을 보유합니다.
읽기 잠금은 쓰기 잠금을 차단합니다. 읽기 잠금은 읽기 잠금을 차단하지 않습니다. 쓰기 잠금은 모든 읽기 및 쓰기 잠금을 차단합니다. 이것이 두 프레임의 동일한 페이지가 동일한 세션에 쓸 때 그 중 하나가 쓰기를 시작하기 전에 다른 것(약간 더 빠른 것)이 완료될 때까지 기다려야 하는 이유입니다.
Q: 원활한 세션 시간 초과는 무엇을 의미합니까?
답변: 원활한 세션 시간 초과는 페이지가 세션에 액세스(사용)하는 한 시간 초과가 새로 고쳐지는 것(재타이밍으로 이해될 수 있음)을 의미합니다. 즉, 시간 초과는 페이지 요청부터 다시 계산됩니다. 그러나 페이지에서 세션을 비활성화할 수는 없습니다. 현재 페이지의 세션에 자동으로 액세스하고 시간 초과를 새로 고칩니다.
질문: global.asax의 이벤트 처리 기능에서 세션이 유효하지 않은 이유는 무엇입니까?
답변: Session이 사용되는 이벤트 처리 기능에 따라 다릅니다. Session은 AcquireRequestState 이벤트 이후에만 유효합니다. 이 이벤트 이후의 모든 이벤트 처리 기능은 Session을 사용할 수 있지만 그 이전의 기능은 사용할 수 없습니다.
질문: 현재 애플리케이션의 세션에 의존하는 구성 요소를 작성할 때 Session["Key"]를 직접 사용하여 해당 값을 얻을 수 없는 이유는 무엇입니까?
답변: Session["Key"]는 실제로 페이지의 속성으로 제공되는 this.Session["Key"]이므로 구성 요소에서 이 속성을 직접 사용할 수 없습니다. 다음과 같은 방법으로 세션을 사용할 수 있습니다.
HttpContext.Current.Session["Key"] = "My Seesion Value";
Q: InProc 모드를 사용하여 세션을 저장할 때 현재 세션은 어디에 저장됩니까?
답변: IIS마다 처리 방법이 다릅니다.
IIS5를 사용하는 경우 세션은 aspnet_wp.exe의 프로세스 공간에 저장됩니다.
IIS6을 사용하는 경우 모든 응용 프로그램은 기본적으로 응용 프로그램 풀을 공유하며 세션은 w3wp.exe의 프로세스 공간에 저장됩니다.
Q: 세션 시간 초과 설정은 분 단위입니까, 초 단위입니까?
답변: 분입니다. 기본값은 20분입니다.
Q: 페이지에 오류가 발생하면 내 세션이 저장됩니까? Session_End에서 일부 정리를 처리해야 하는데 실패합니다. 이유는 무엇입니까?
답변: Session_End는 세션이 InProc 모드에서 실행 중일 때만 실행됩니다. Session_End에서 사용하는 계정은 aspnet_wp 작업자 프로세스를 실행하는 계정입니다(machine.config에서 설정할 수 있음). 따라서 통합 보안을 사용하여 Session_End 메소드로 SQL에 연결하면 aspnet_wp 프로세스의 계정을 사용하여 링크가 열리게 되며 이때의 성공 여부는 SQL 보안 설정에 따라 달라집니다.
질문: 쿠키 없음을 true로 설정한 경우 리디렉션할 때 세션이 손실되는 이유는 무엇입니까?
대답: 쿠키를 사용하지 않는 경우 상대 경로를 사용하여 프로그램의 절대 경로를 바꿔야 합니다. 절대 경로를 사용하면 ASP.NET이 URL에 SessionID를 저장할 수 없습니다.
예: myDirmySubdirdefault.aspx를 ..default.aspx로 바꿉니다.
질문: 세션이나 캐시에 SortedList를 저장하는 방법은 무엇입니까?
답변: 다음 방법을 참조하십시오.
SortedList x = 새로운 SortedList();
x.Add("Key1", "ValueA");
x.Add("Key2", "ValueB");
세션에 저장:
세션["SortedList1"] = x;
이를 얻으려면 다음 방법을 사용하십시오.
SortedList y = (SortedList) 세션["SortedList1"];
차헤도 마찬가지다.
Q: "세션 상태는 구성 파일이나 페이지 지시문에서 활성화SessionState가 true로 설정된 경우에만 사용할 수 있습니다."라는 오류 메시지가 나타나는 이유는 무엇입니까?
답변: 이 문제는 Microsoft Visual Studio .NET 개발 환경이 설치된 컴퓨터에 WSS(Window Sharepoint Server)를 설치한 후에 발생할 수 있습니다.
WSS ISAPI 필터는 모든 요청을 처리합니다. 가상 디렉터리를 통해 ASP.NET 응용 프로그램을 탐색할 때 ISAPI 필터는 폴더 디렉터리에 URL을 할당하지 않습니다.
해결 방법은 다음과 같습니다. WSS가 설치된 시스템에서 세션을 사용하지 마십시오.
자세한 내용은 다음을 참조하세요.
Windows SharePoint Services가 포함된 ASP.NET에서는 세션 상태를 사용할 수 없습니다.
http://support.microsoft.com/default.aspx?scid=kb;en-us;837376Q
: 세션 변수를 삭제하는 방법은 무엇입니까?
답변: 세션 변수를 삭제하려면 HttpSessionState.Remove() 메서드를 사용하면 됩니다.
Q: 애플리케이션이 실행되는 동안 애플리케이션 세션이 차지하는 메모리 양을 알 수 있는 방법이 있습니까?
대답: 아니요. 현재 이 값은 확인할 수 없습니다. 적어도 이에 대한 정보는 아직 본 적이 없습니다. 그러나 성능 모니터와 프로그램 코드를 통해 대략적인 값을 추정할 수 있습니다.
질문: 페이지에 프레임셋이 있는 경우 첫 번째 요청에서 각 프레임에 표시되는 페이지의 SessionID가 다른 것으로 나타났습니다. 이유는 무엇입니까?
대답: 그 이유는 프레임세트가 ASPX 페이지가 아닌 html 페이지에 배치되기 때문입니다.
일반적인 상황에서 프레임세트가 aspx 페이지인 경우 페이지를 요청하면 먼저 웹 서버에 요청을 보내고 SessionID를 얻은 다음 브라우저는 각각 프레임의 다른 페이지를 요청합니다. 모든 페이지의 SessionID는 동일하며, FrameSet 페이지의 SessionID입니다.
그러나 HTML 페이지를 사용하여 FrameSet 페이지를 만드는 경우 첫 번째 요청은 HTML 페이지가 됩니다. 페이지가 서버에서 반환되면 세션이 생성되지 않으므로 브라우저는 프레임에 페이지를 요청합니다. 페이지는 자체 SessionID를 생성하므로 이 경우 이 문제가 발생합니다. 페이지를 새로 고치면 SessionID는 동일하며 마지막으로 요청한 페이지의 SessionID가 됩니다.
Q: 동일한 SQL Server 서버의 서로 다른 데이터베이스에 서로 다른 애플리케이션의 세션을 저장할 수 있습니까?
답변: 예, 다음을 참조하십시오.
FIX: SQL Server 세션 상태에 대한 모든 애플리케이션에 하나의 SQL 데이터베이스를 사용하면 병목 현상이 발생할 수 있습니다.
http://support.microsoft.com/default.aspx?scid=kb;en-us;836680Q
: Session_End에서 유효한 HttpSessionState 및 HttpContext 개체를 얻을 수 있습니까?
답변: 이 메서드에서 HttpSessionState 개체를 가져올 수 있으며 Session을 사용하여 직접 액세스할 수 있습니다. 그러나 이벤트가 요청과 연결되어 있지 않아 HttpContext 개체를 얻을 수 없으므로 컨텍스트 개체가 없습니다.
Q: SQL Server 모드에서 세션을 사용할 때 내 세션이 만료되지 않는 이유는 무엇입니까?
답변: SqlServer 모드에서는 SQL Agent 등록을 통해 세션 만료가 완료됩니다. SQL Agent가 실행 중인지 확인하십시오.
Q: EnableSessionState를 "ReadOnly"로 설정한 후에도 InProc 모드에서 세션 값을 수정할 수 있습니다. 이유는 무엇입니까?
답변: EnableSessionState가 ReadOnly로 표시되어 있어도 사용자는 InProc 모드에서 세션을 계속 편집할 수 있습니다. 유일한 차이점은 요청 중에 세션이 잠기지 않는다는 것입니다.
Q: SQL을 연결할 때 비밀번호 지정을 방지하려면 어떻게 해야 합니까?
답변: 신뢰할 수 있는 링크를 사용하거나 암호화된 링크 문자열을 사용하십시오. 이에 대한 자세한 내용은 다음을 참조하세요.
ASP.NET 유틸리티를 사용하여 자격 증명 및 세션 상태 연결 문자열을 암호화하는 방법
http://support.microsoft.com/default.aspx?scid=kb;en-us;329290Q
: 내 수업에서 세션을 어떻게 사용해야 합니까?
답변: HttpContext.Current.Session을 사용할 수 있습니다. 구체적인 방법은 다음과 같습니다.
HttpContext.Current.Session["SessionKey"] = "SessionValue";
마찬가지로 이런 방식으로 Application 개체를 사용할 수 있습니다.
Q: SQL Server 모드로 전환한 후 요청이 중단되는 이유는 무엇입니까?
답변: 세션에 저장된 모든 개체를 SQL Server 모드로 저장할 수 있는지 확인하세요. 즉, 이러한 개체는 직렬화를 지원해야 합니다.
질문: 세션이 쿠키 없음으로 설정되면 어떤 영향을 미치나요?
답변: 쿠키 없음이 true로 설정되면 주로 다음과 같은 제약 조건이 적용됩니다.
1. 해당 페이지에서는 절대링크를 사용할 수 없습니다.
2. HTTP와 HTTPS 간 전환 외에도 애플리케이션에서 일부 다른 단계를 완료해야 합니다.
다른 사람에게 링크를 보내면 이때의 URL에 Session ID 정보가 포함되어 두 사람이 Session을 공유하게 됩니다.
Q: 세션을 데이터베이스에 저장할 수 있습니까?
답변: 물론 자세한 내용은 다음을 참조하십시오. http://support.microsoft.com/default.aspx?scid=kb;en-us;311209
--------------- -- ------------------------------------------------ -- ------------------------------------------------ -- -
Q: InProc 모드에서 사용할 때 세션이 자주 손실되는 이유는 무엇입니까?
추가 상황: Access 데이터베이스를 사용하는 경우 데이터베이스가 다운로드되는 것을 방지하기 위해 일부 사람들은 데이터베이스를 다운로드할 수 없도록 bin 디렉터리에 데이터베이스 파일을 넣는 것을 생각할 수 있습니다. 그러나 InProc 모드인 경우. , 이로 인해 세션이 손실될 수도 있습니다. 애플리케이션에 액세스할 때 데이터가 데이터베이스에 자주 기록되어 bin 디렉터리에 있는 데이터베이스 파일이 변경되고, bin 디렉터리를 수정하면 세션이 손실되기 때문입니다.
이 문제를 해결하려면 데이터베이스 파일의 저장 경로를 변경하거나 StateServer 또는 SqlServer 모드를 사용할 수 있습니다.
자세한 내용은 다음을 참조하세요.
PRB: ASP.NET InProc 세션 상태 모드를 사용하면 세션 데이터가 손실됩니다
http://support.microsoft.com/default.aspx?scid=kb;en-us;324772
------------------------------------- ----------
dnyz 블로그에서 선택한 Asp.net의 다중 프로젝트 공유 세션
http://dev.csdn.net/article/21/21714.shtm
1. d:MyProjectMyProject.sln과 같은 빈 솔루션 빈 솔루션을 만듭니다.
2. d:MyProject 아래에 웹 애플리케이션 루트 디렉터리 d:MyProjectWebMis를 생성하고 이를 http://localhost/WebMis 의 가상 디렉터리로 설정합니다.
3. d:MyProjectWebMisLogin 및 d:MyProjectWebMisCheckOut과 같이 WebMis 디렉터리의 모듈에 따라 새 디렉터리를 만듭니다.
4. VS.net의 모듈을 기반으로 다음과 같은 새 웹 애플리케이션을 생성합니다: http://localhost/WebMis/Login 및 http://localhost/WebMis/CheckOut
5. 생성 후 Login 및 CheckOut 디렉터리는 자동으로 가상 디렉터리로 설정됩니다.
6. WebMis 프로젝트에 로그인 및 체크아웃에 대한 프로젝트 참조 추가
7. IIS 관리자에서 Login 및 CheckOut의 가상 디렉터리를 삭제합니다.
8. 각 프로젝트의 global.asax를 삭제합니다(루트 프로젝트 제거).
9. 프로젝트의 web.config에서 다음 코드를 제거합니다(루트 프로젝트 제거).
<인증 모드="Windows" />
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
또는 web.config를 삭제하십시오(각 디렉터리에서 구성할 필요가 없는 경우).
10. 컴파일 후 실행할 수 있습니다.