2011-09-20 40 views
5

我有一個WCF服務,它有多個Web方法。我希望能夠攔截所有方法的請求並查看IP地址。 Id寧願不把邏輯放到每個被調用Web方法頂部的方法調用中,是否有辦法從一個地方攔截對這些方法的所有調用?如何攔截對WCF .svc服務中的方法的所有調用?

如果這是一個頁面,我會寫一個基本頁面對象,但不確定是否有在wcf調用中引發的事件?

+0

您可以使用在WCF [檢查員]檢查員(https://web.archive.org/web/20120207232924/http://cgeers.com:80/2008/11/09/wcf-extensibility-parameter -inspectors /) – dhinesh

+0

上面的評論鏈接來自@dhinesh似乎加載了惡意軟件的頁面,並要求我安裝Chrome擴展程序。我已經向主持人彙報過了。 – Volomike

+0

我想建議你刪除asp.net標籤,因爲你的問題比asp.net廣泛得多,對於C#編碼器和VB編碼器也可以非常有用。 – Volomike

回答

3

WCF允許您實現添加到堆棧的攔截器。一個例子見link。我不確定這是否允許您提取發件人IP,但我認爲這值得一試。

3

您可以實現IDispatchMessageInspector並執行此類操作。

public object AfterReceiveRequest(ref Message request, 
IClientChannel channel, InstanceContext instanceContext) 
    { 
     RemoteEndpointMessageProperty remoteEndpoint = request.Properties 
    [RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 

     //remoteEndpoint.Address will give you the address. 

     return null; 
    } 
+0

在'host.Open()'調用之前有沒有簡單的方法將它附加到WCF服務?我唯一看到的是我必須創建一個特殊的行爲,綁定和消息檢查器。我試圖解決這個問題,最終放棄了我的頭髮。然後我發現了'ServiceAuthorizationManager'。 – Volomike

1

有一個聰明的辦法與ServiceAuthorizationManager要做到這一點,這是遠遠超過了IDispatchMessageInspector的所有認真勤奮工作更輕鬆。

創建WCF服務項目類,像這樣:

public class MyServiceAuthorizationManager : ServiceAuthorizationManager 
{ 
    protected override bool CheckAccessCore(OperationContext operationContext) 
    { 
    string classMethod = operationContext.RequestContext.RequestMessage.Headers.Action; 
    if (classMethod.Contains("/transfer/Get")) 
    { 
     return true; // because someone is simply updating a client service reference 
    } 
    Console.WriteLine("Class Method Call: {0}",classMethod); 
    // do something with operationContext here as you need to inspect stuff 
    // return true if you want this class method call to succeed and go through 
    // return false if you want this class method to fail on the client 
    return true; 
    } 
} 

然後,在你的服務,你的host.Open()呼叫前右,將鏈接添加到MyServiceAuthorizationManager

ServiceHost host = new ServiceHost(typeof(MyProject.Service1)); 
host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager(); 
host.Open(); 

現在,當你測試你的客戶端連接時,你會注意到控制檯輸出的是什麼類的方法被調用。你也可以處理operationContext對象中的所有東西。

我使用這種方法是安全頭檢查。在我的客戶端中,我添加了一個標題。然後,在這個服務中,在這個CheckAccessCore()調用中,我確認這個自定義頭文件存在。如果不這樣做,那麼我將返回錯誤。這是保護黑客的又一層保護,對Named Pipes配置中的有限安全性也非常有用。如果您也想這樣做,那麼請撥打click here以獲取有關如何添加自定義標頭的更多信息,這些自定義標頭可以在服務上的每個客戶端的方法調用中自動發送。

注意,在這些之中,我沒有必要混淆行爲,聲明,聽衆或消息發送。我也不需要編輯我的WCF配置。

注意上面的/transfer/Get的字符串檢查。如果您將頭部檢查作爲像我一樣的安全機制,這非常重要。如果沒有這樣的條件,返回true,那麼你的WCF客戶端IDE不能更新其ServiceReference因爲IDE不知道這些額外的標頭(如果您要添加自定義標題,而不是指定在該頭WCF客戶端的app.config)。否則,您將收到錯誤The URI prefix is not recognized