2012-05-02 1 views
3

저는 Intro to .NET 웹 서비스 과정을 밟고 있으며, 우리가 현재 배우고있는 것 중 하나는 IDisposable 인터페이스입니다. 비교적 간단한 예로서, MyMethod() 조작으로 서비스 (서버/클라이언트)를 작성했습니다. 이 메서드는 호출 될 때 간단히 trace 문을 인쇄합니다. 또한 서버 구현 된 버전에서 간단한 WriteLine 추적을 사용하여 Dispose() 메서드를 구현하여 내 서버에 IDisposable을 구현했습니다.서비스를 호출하지 않은 경우에도 내 서비스의 Dispose() 메서드가 호출되는 이유는 무엇입니까? (BasicHttpBinding 사용)

내 클라이언트에서는 ChannelFactory로 두 개의 프록시를 만듭니다. proxy1에 나는 MyMethod() 동작을 3 회 호출 한 후 폐기 proxy1에 대한 코드의 몇 라인을 가지고 :

var castedProxy = (IDisposable)proxy1; 
castedProxy.Dispose(); 

PROXY2에, 나는 다시 내가 캐스팅 Dispose()를 호출하지 않는이 시간을 제외하고는 MyMethod() 동작을 3 회 호출 . 나는 서버/클라이언트를 실행하면, 내가 얻을 같은 흔적 6 회 :

서버의 추적 + CurrentThread ID
MyMethod라는()의 추적 + CurrentThread ID
폐기()의 추적 + CurrentThread ID

제 질문은 이것입니다 : 왜 내가 처음에만 3 개의 트레이스를 사용 하긴하지만, 항상 Dispose() 부분의 트레이스가 발생합니까? 내 생각 엔, BasicHttpBinding을 사용할 때 세션 관리 자체가 없으므로 이전 Dispose() 호출을 인쇄하면서 이전 리소스가 그대로 남아 있다는 사실과 관련이 있다는 것입니다.

미리 알려 주시면 감사하겠습니다. :)

답변

3

클라이언트의 프록시와 서버의 서비스는 별개의 두 개체입니다.

서버의 경우 각 서비스 개체의 수명은 ServiceBehaviourInstanceContextMode에 의해 제어됩니다. 이 값을 PerCall으로 설정하면 각 호출에 대해 서비스 클래스의 새 인스턴스가 만들어져 삭제됩니다. WCF가이 작업을 수행합니다. ServiceBehaviour을 설정하기 만하면됩니다.

일반적으로 클라이언트와 서버는 서로 다른 프로세스에 있습니다. 그렇게 생각하면 클라이언트 프록시의 수명이 서비스의 수명을 제어하지 못하는 것입니다.

+0

귀하의 신속하고 통찰력있는 답변에 감사드립니다. 확실히 제 질문에 100 % 대답했습니다. : D –

+0

당신은 오신 것을 환영합니다 크리스 :) –

0

서버가 아니라 클라이언트에서 dispose를 호출합니다. WCF 서비스는 요청별로 구성되므로 클라이언트가 여전히 존재하는 경우에도 모든 호출에 대해 클래스가 만들어지고 삭제됩니다.

Dispose in service는 WCF에서 기본적으로 호출됩니다. 이것은 정상적인 동작입니다. 서비스가 IDisposable을 구현하면 서비스가 파괴 될 때 Dispose이 호출됩니다.

관련 문제