2009-04-02 2 views
12

새 클라이언트가 WCF 호스트 서비스에 연결할 때 이벤트를 발생 시키려면 어떻게해야합니까?클라이언트가 WCF 호스트 엔드 포인트에 연결할 때 발생하는 이벤트

편집 : 내가 찾고있는 것은 새로운 세션이 생성되거나 클라이언트를 위해 새로운 채널이 생성 될 때 이벤트를 얻는 것입니다. 예를 들면 다음과 같습니다. 세션 종료를 위해 :

OperationContext.Current.Channel.Closed += new EventHandler(Channel_Closed); 

그래서 세션 iitiation에 대해 사용해야하는 것은 무엇입니까?

답변

5

내가 가장이 만들어진 후 서비스 리스너 (들)에 새 channel initializer을 추가하여 이루어집니다 달성하기 위해 노력하고 무엇을 생각합니다.

기본적으로 인터페이스를 구현하는 클래스를 만든 다음 서비스 호스트에 추가합니다. 당신이 자기 호스팅하는 경우 이것은 매우 간단하다 :

당신은 세션 별 인스턴스 모드를 사용하고 있기 때문에
public class MyHook : IChannelInitializer 
{ 
    public void Initialize(IClientChannel channel) 
    { 
    // Do whatever. 
    } 
} 

var host = new ServiceHost(typeof(MyService), MYBASEADDRESS); 
host.AddServiceEndpoint(typeof(IMyService), new WSHttpBinding(), MYSERVICEADDRESS); 
host.Open(); 

// There will be one per endpoint; you can enumerate them if needed etc. 
var dispatcher = host.ChannelDispatchers[0] as ChannelDispatcher; 
dispatcher.ChannelInitializers.Add(new MyHook()); 

, 당신은 각각의 새로운 세션을 위해 만든 새로운 채널, 클라이언트가 연결하는 첫 번째 시간을 얻을 것이다. 채널 디스패처는 새로 생성 된 채널을 가져 와서 특정 서비스 객체 인스턴스 (주소 매칭 등)와 연관시키는 것을 담당하는 객체입니다. 서비스가 연결되기 전에 새 맞춤 채널의 각 맞춤 이니셜 라이저가 실행됩니다.

+0

감사합니다. 그건 내 질문에 정확히 대답 해. – galets

+0

추가 정보는 http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/14/wcf-extensibility-initializers-instance-context-channel-call-context를 참조하십시오. aspx 특히 WCF 4.0의 경우 호스트가 열린 상태로 전환 된 후에 예외가 발생하기 때문에 제안 된 방법이 작동하지 않습니다 –

0

설정에 따라 달라집니다 - "통화 별"대화를합니까? 그럼 당신은 실제로 "클라이언트가 지금 연결된"메시지를 얻지 못합니다 ....

세션 기반 대화를합니까? "ServiceHost"클래스에는 "Opening"과 "Opened"의 두 가지 이벤트가 있습니다. 특히 여러분이 서비스를 자체 호스팅하는 경우 연결할 수 있습니다.

이 이벤트를 트래핑하여 정확히 달성하기를 원하십니까?

마크는

+2

세션 기반. 서비스 호스트는 서비스 호스트가 시작될 때 Opened 이벤트를 발생시킵니다 (예 : host.Open() 호출시). 새 클라이언트가 연결될 때가 아닙니다. – galets

+1

InstanceContextMode.Single 인 경우 조언이 있습니까? – arconaut

관련 문제