웹 서비스 내부에서 세션 변수를 사용하여 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] 변수 내의 직렬화 된 객체에 대한 참조를 보유합니까? 이것은 거의있을 것 같지 않습니다.
:
이것은 당신이 무슨 일을하는지 단지 단순화 된 버전입니다. 세션 변수에 넣을 때 전체 객체가 실제로 직렬화되었다는 인상을 받았습니다. ViewState의 객체는 무엇입니까? 페이지 호출간에 완전히 직렬화 되었습니까, 아니면 ViewState가 객체에 대한 참조를 보유합니까? 당신이 말하는 것이 맞다면 Session에 객체를 배치하는 데 Serializable 속성이 필요한 이유는 무엇입니까? – draconis
클래스가 세션에 직렬화 될 필요는 없습니다.세션 관리가 서버에 구성된 방법에 따라 다릅니다. ViewState를 통해 같은 방식으로 작동하지만 ViewState (StateBag)가 실제로 직렬화하고 객체를 직렬화 해제 할 때 클래스를 직렬화 할 수 있어야합니다. ViewState를 통해 클래스를 호출하고 캐스트하면 클래스가 deserialize됩니다. – GenericTypeTea
귀하의 설명은 in-process 세션 상태에만 유효합니까 아니면 일반적인 것입니까? 세션 상태가 Out-of-process 모드 나 SqlServer 모드로 구성된 경우 개체에 대한 참조 만 세션 변수에 보관된다는 것은 사실입니까? – draconis