2011-03-17 84 views
0

我正在使用由WPF應用程序託管的非常簡單的WCF項目。它基本上是作爲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"]; 

每個服務呼叫

是否有更通用的全能事件可以檢測到對我的服務的呼叫?可能有人被許多Behavior/ChannelDispatcher類型之一解僱,但我承認這些類型並不完全理解。

感謝您的幫助,湯姆

回答

2

使用IParameterInspector你可以連接到任何方法調用,檢查方法和/或參數。

沒有其他方法可以獲得您使用的傳入消息的額外信息(IP地址等)。這只是微軟恕我直言的一個糟糕的設計(見我的咆哮here)。

你可以找到一個例子here

+0

是的!而已!好東西,你顯然知道所有這一切裏面。我並沒有真正使用IParameterInspector,而是IDispatchMessageInspector.AfterReceiveRequest()實現似乎有用。我只是在綁定一個返回適當處理的數據的事件之後作爲一個行爲添加。謝謝! – Tom 2011-03-17 14:46:01

+0

很高興它爲你工作。我使用'IParameterInspector'來審計調用。 – Aliostad 2011-03-17 15:48:30