2010-05-07 6 views
1

웹 서비스 내부에서 세션 변수를 사용하여 QBWC라는 외부 응용 프로그램에 의한 연속적인 메소드 호출간에 상태를 유지합니다. 나는이 속성에 내 웹 서비스 메소드를 장식하여이 설정 : 내가 여기서 queueManager라는 사용자 지정 개체의 인스턴스를 저장하는 세션 변수를 사용하고웹 서비스에 저장된 객체의 예기치 않은 동작 세션

[WebMethod(EnableSession = true)] 

. QBChange 내 웹 서비스에 속하는 사용자 지정 비즈니스 개체입니다

[Serializable] 
public class QueueManager 
{ 
    ... 
    public Queue<QBChange> ChangeQueue { get; set; } 
    ... 

을 다음 여기서 queueManager는 다음과 같습니다 ChangeQueue라는 속성이 있습니다.

지금, 때마다 나는 내 웹 서비스의 메서드 호출을받을, 내가 여기서 queueManager 개체를 검색하려면이 코드를 사용하여 내 대기열에 액세스 :

QueueManager qm = (QueueManager)Session[ticket]; 

그때 나는 큐에서 개체를 제거, 과 같이, 세션 변수에 다시

qm.dequeue() 

을 사용하고 (이 대기열에있는 한 적은 개체를 포함하고 있기 때문에 수정) 그때는 수정 된 쿼리 관리자 오브젝트를 저장합니다

Session[ticket] = qm; 

동일한 티켓을 사용하여 다음 웹 서비스 메서드 호출을 준비합니다. 나는이 마지막 줄

//Session[ticket] = qm; 

을 주석 경우, 다음 웹 서비스 메서드 호출 사이의 큐의 크기를 감소, 정확히 같은 방식으로 동작 :

지금 여기 일입니다. 왜 그런가요?

웹 서비스가 요청되지 않고 세션 변수에 직렬화 된 양식에 포함 된 클래스를 업데이트하는 것 같습니다. 왜 그렇게했을까요? Queuemanager 객체를 deserialize 할 때, qm 변수는 Session [ticket] 변수 내의 직렬화 된 객체에 대한 참조를 보유합니까? 이것은 거의있을 것 같지 않습니다.

답변

0

모든 참조 유형 (예 : 클래스)은 참조로 메모리에 저장되고 세션 상태는 (일반적으로) 메모리에 저장되지만 파일이나 데이터베이스에도 저장할 수 있습니다. Session에 레퍼런스 타입을 저장할 때, 당신은 거의 항상 그것들이 Serializable이되도록해야한다.

QueueManager은 참조 유형이므로 모든 Session[ticket]은 메모리에 대한 참조를 보유하고 있습니다. Session 변수 자체로 IS 수정하려는 항목으로 다시 할당 할 필요가 없습니다. 내가 볼

Session["Foo"] = new Bar(); 
Bar rar = (Bar)Session["Foo"]; 
rar.Count = 1; 

if (((Bar)Session["Foo"]).Count == 1) 
{ 
    // Great success! 
} 
+0

:

이것은 당신이 무슨 일을하는지 단지 단순화 된 버전입니다. 세션 변수에 넣을 때 전체 객체가 실제로 직렬화되었다는 인상을 받았습니다. ViewState의 객체는 무엇입니까? 페이지 호출간에 완전히 직렬화 되었습니까, 아니면 ViewState가 객체에 대한 참조를 보유합니까? 당신이 말하는 것이 맞다면 Session에 객체를 배치하는 데 Serializable 속성이 필요한 이유는 무엇입니까? – draconis

+0

클래스가 세션에 직렬화 될 필요는 없습니다.세션 관리가 서버에 구성된 방법에 따라 다릅니다. ViewState를 통해 같은 방식으로 작동하지만 ViewState (StateBag)가 실제로 직렬화하고 객체를 직렬화 해제 할 때 클래스를 직렬화 할 수 있어야합니다. ViewState를 통해 클래스를 호출하고 캐스트하면 클래스가 deserialize됩니다. – GenericTypeTea

+0

귀하의 설명은 in-process 세션 상태에만 유효합니까 아니면 일반적인 것입니까? 세션 상태가 Out-of-process 모드 나 SqlServer 모드로 구성된 경우 개체에 대한 참조 만 세션 변수에 보관된다는 것은 사실입니까? – draconis

관련 문제