2011-03-17 7 views
0

WPF 응용 프로그램에서 호스팅되는 매우 간단한 WCF 프로젝트를 사용하고 있습니다. 기본적으로 내 PC에서 데이터를 정리하는 REST 서버로 작동합니다. IIS가없고 SingleInstance로 실행됩니다. 어떤 IP가 MyService에 액세스하고 있으며 어떤 WebMethod가 호출하려고하는지 알고 싶습니다.글로벌 WCF ServiceHost 요청 이벤트 캡처

좋아, 그래서 서비스 클래스 자체에서 선언 된 내 서비스의 일부로 이벤트를 가질 수 있습니다. (제발 m_에 대한 어떤 불꽃) 여기가는 도착 일부 코드는 모두가 예상대로 정확하게 작동의) : 내 응용 프로그램이 알 수 있도록

MyService ds = new MyService(); // It's not really called this :) 
ds.Request += new EventHandler(ds_Request); // I want to avoid this 
ds.SomePropertySetFromMyRehostingClient = "something"; // SingleInstance now required 

m_Service = new ServiceHost(ds, new Uri(GetServerHostUri())); 
m_Service.Description.Behaviors.Find<ServiceBehaviorAttribute>().InstanceContextMode = InstanceContextMode.Single; 
m_Service.BeginOpen(new TimeSpan(0, 0, 5), new AsyncCallback(EndStartService), null); 

그런 다음 각 서비스 방법에서,이 이벤트를 발생시킬 수 사람 그것을 사용하려고했습니다. 똑똑하지만 얼굴을 보자. 이것은 끔찍한 일이다. 각 서비스 호출에 대한

var who = OperationContext.Current.IncomingMessageProperties.Via; 
var what = OperationContext.Current.IncomingMessageProperties["UriTemplateMatchResults"]; 

:

나는의 라인을 따라 뭔가를 작성해야합니다.

내 서비스 호출을 감지 할 수있는 좀 더 일반적인 catch-all-event가 있습니까? 내가 충분히 이해하지 못하는 많은 Behavior/ChannelDispatcher 유형 중 하나에 의해 해고당한 사람이있을 것입니다. IParameterInspector를 사용하여 당신의 도움, 톰

답변

2

에 대한

덕분에 당신은 어떤 메소드 호출에 끼어 방법 및/또는 매개 변수를 검사 할 수 있습니다.

사용중인 메시지 이외의 추가 정보 (IP 주소 등)를 가져 오는 다른 방법은 없습니다. 이것은 Microsoft IMHO의 나쁜 디자인입니다 (내 호언을 참조하십시오 here).

예 : here을 찾을 수 있습니다.

+0

예! 그게 다야! 좋은 물건, 당신은 분명히 이것 모두를 안다. 실제로 IParameterInspector를 사용하는 것이 아니라 IDispatchMessageInspector.AfterReceiveRequest() 구현이 트릭을 수행하는 것처럼 보였습니다. 적절히 처리 된 데이터를 반환하는 이벤트를 바인딩 한 후이를 Behavior로 추가하기 만하면됩니다. 감사! – Tom

+0

그것이 당신을 위해 일해 주셔서 감사합니다. 감사 호출에'IParameterInspector'를 사용합니다. – Aliostad