HTTP는 상태 없는 프로토콜입니다. 각 요청은 독립적이며, 그 실행과 결과는 이전 요청과 이후 요청과 직접적으로 관련이 없으며, 이전 요청에 대한 응답이나 후속 요청에 대한 응답에 직접적인 영향을 받지 않습니다.
실제로 우리 시스템은 사용자가 클라이언트 브라우저와 서버 간에 동일한 데이터(상태)를 여러 번 요청할 수 있도록 지원하며, 예를 들어 사용자의 로그인 계정 정보 등이 있습니다. 따라서 ASP.NET 상태 관리를 위한 많은 변수를 제공합니다: 애플리케이션 상태, 세션 상태, 뷰 상태 등.
HttpContext 객체는 단일 HTTP 요청에만 사용됩니다.이 클래스의 속성에는 요청 객체, 응답 객체, 세션 객체 등이 포함됩니다. 이것은 HttpContext 클래스의 Items 컬렉션으로, 키값 형태의 해시 테이블 객체를 포함하고 있습니다.
먼저, 단일 사용자 요청(단일 HTTPRequest에 유효한 HttpContext.Current.Items)에만 작동하는 HttpContext.Current.Items의 목적을 살펴보겠습니다. 이 요청이 완료되면, 서버 정보가 브라우저로 전송될 때 아이템 수집이 사라집니다. 세션 객체는 사용자의 세션용으로, 여러 사용자 요청에 대응하여 세션이 만료되면 정보가 사라집니다.
HttpContext.Current.Items의 수명 주기가 매우 짧은데, 어떤 상황에서 사용할 수 있나요? 여기서 언급된 점은, 모든 사용자 요청이 HTTP 런타임라인 HttpModule, HTTPHandler를 거쳐 이루어지기 때문에, HttpModule과 HTTPHandler 간 데이터 공유 시 HttpContext.Current.Items를 사용할 수 있음을 언급합니다. IHttpMoudle 메서드를 구현해 HttpMoudle을 통해 사용자 요청에 정보를 전달할 때, HttpContext.Current.Items를 사용해 다양한 요청 페이지와 Http모듈에서 데이터를 전송할 수 있지만, 요청이 종료되고 데이터가 게시되면 이 컬렉션의 데이터는 스스로 사라집니다. 아래 그림에서 볼 수 있듯이:
또한, 서버 페이지가 이동할 때(Server.Execute/Server.Transfer) HttpContext.Current.Items 사용해 두 폼 간에 데이터를 전달할 수 있습니다.
분명히 Server.Transfer를 Response.Redirect로 바꾸면, 새 페이지의 HttpContext.Current.Items 데이터를 받을 수 없습니다. 왜냐하면 다른 Http 요청이기 때문입니다. System.NullReferenceException: 객체 참조가 객체의 인스턴스로 설정되어 있지 않습니다.
|