2010-03-16 4 views
1

InProc 세션 상태에서 세션 변수의 여러 인스턴스를 검색하는 데 문제가 있습니다.동일한 asp.net 세션 변수의 여러 인스턴스 검색 중 문제가 발생했습니다.

다음 코드에서는 간단한 BusinessObject를 Page_Load 이벤트의 세션 변수에 유지합니다. 단추 하나를 클릭하면 동일한 BusinessObject의 선언 된 2 개의 인스턴스로 개체를 다시 검색하려고 시도합니다.

모든 것은 첫 번째 인스턴스에서 속성 중 하나를 변경할 때까지 훌륭하게 작동합니다. 두 번째 인스턴스도 변경됩니다.

정상적인 동작입니까? 나는 이것이 정적 인 행동을 보여주지 않는 새로운 사례라고 생각 했을까?

내가 잘못 가고있는 아이디어가 있습니까?

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

     If Not Page.IsPostBack Then 
      ' create a new instance of a business object and set a containg variable 
      Dim BO As New BusinessObject 
      BO.SomeVariable = "test" 
      ' persist to inproc session 
      Session("BO") = BO 
     End If 

    End Sub 

    Protected Sub btnRetrieveSessionVariable_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnRetrieveSessionVariable.Click 

     ' retrieve the session variable to a new instance of BusinessObject 
     Dim BO1 As New BusinessObject 
     If Not Session("BO") Is Nothing Then BO1 = Session("BO") 

     ' retrieve the session variable to a new instance of BusinessObject 
     Dim BO2 As New BusinessObject 
     If Not Session("BO") Is Nothing Then BO2 = Session("BO") 

     ' change the property value on the first instance 
     BO1.SomeVariable = "test2" 

     ' why has this changed on both instances? 
     Dim strBO1Property As String = BO1.SomeVariable 
     Dim strBO2Property As String = BO2.SomeVariable 

    End Sub 

    ' simple BusinessObject class 
    Public Class BusinessObject 
     Private _SomeVariable As String 

     Public Property SomeVariable() As String 
      Get 
       Return _SomeVariable 
      End Get 
      Set(ByVal value As String) 
       _SomeVariable = value 
      End Set 
     End Property 
    End Class 

답변

0

BO1과 BO2가 같은 객체입니다. BO1은 메모리의 일부 영역을 참조하는 이름입니다. BO2는 메모리의 동일한 영역을 참조하는 다른 이름입니다. 세션 ("BO")은 메모리의 동일한 영역을 참조합니다.

다른 오브젝트 BO1 및 BO2를 실제로 작성하려면 비즈니스 오브젝트 클래스에 Clone() 메소드를 구현하는 등 오브젝트 사본을 작성해야합니다.

+0

나는 이것이 사실일지도 모른다고 생각했지만 증명하기가 어려웠다. 내 Business Objects는 꽤 깊고 깊이있는 사본이 필요하기 때문에 Brad Adams가 제안한 것처럼 IClonable을 피하고 클래스에 내 자신의 Copy 메서드를 만들었습니다 (http://blogs.msdn.com/brada/archive/2003/04). /09/49935.aspx – sw1sh

0

당신은 두 개의 새로운 객체를 인스턴스화 한 다음 같은 객체 (세션 즉 하나)로 그들 각각을 설정, 그래서 당신이 기대하는 것처럼 당신의 행동은 정확하게하고 있습니다.

덧붙여 말하자면 사용자가 탭에서이 페이지 중 2 개를 열면 페이지가 어떻게 수행 될지 고려해야합니다. 그러면 세션의 비즈니스 개체가 문제를 일으 킵니까?

+0

감사합니다. Paddy, 나는 탭 문제에 대해 생각해 봤고 web.config 파일에 다음과 같은 내용이 있습니다. 이것은 모든 하이퍼 링크가 예상대로 작동하는지 확인하기 위해 조금 더 많은 작업을해야하지만 다른 탭에 다른 세션 ID를 부여하는 것으로 보입니다. – sw1sh

관련 문제