簡體   English   中英

RequestInterceptor和MessageInspector有什么區別?

[英]What is the difference between RequestInterceptor and MessageInspector?

我在這里有兩個問題: -

1) Microsoft.ServiceModel.Web.RequestInterceptor and System.ServiceModel.Dispatcher.DispatchRuntime.MessageInspectors (IdispatchMessageInterceptor)之間的基本區別是什么

兩者似乎都是請求/消息攔截器,可用於在請求管道中實現自定義驗證/攔截器。

什么時候使用另一個?

2)還有如何在RouteTable.Routes.Add(new ServiceRoute())插入RequestInterceptor

我有這樣的課 -

public class AuthenticationInterceptor : RequestInterceptor
{
   //Authentication logic goes here......
}

和這樣的路線定義: -

RouteTable.Routes.Add(new ServiceRoute(routePrefix, new MyServiceHostFactory(container, (sh) => {
                foreach (System.ServiceModel.Dispatcher.ChannelDispatcher cd in sh.ChannelDispatchers)
                {
                    foreach (System.ServiceModel.Dispatcher.EndpointDispatcher ed in cd.Endpoints)
                    {
                        ed.DispatchRuntime.MessageInspectors.Add(new AuthenticationInterceptor());
                    }
                }
                return sh; })));

以下是MyServiceHostFactory的定義: -

public MyServiceHostFactory(IocContainer container, Func<ServiceHost, ServiceHost> createservicehost = null);

現在它拋出以下錯誤: -

The best overloaded method match for 'System.Collections.Generic.SynchronizedCollection<System.ServiceModel.Dispatcher.IDispatchMessageInspector>.Add(System.ServiceModel.Dispatcher.IDispatchMessageInspector)' has some invalid arguments

在這一行: -

ed.DispatchRuntime.MessageInspectors.Add(new AuthenticationInterceptor());

我知道為什么,這只是因為我試圖在MessageInspector中連接RequestInterceptor。 兩者都有不同的界面層次結構。

那我該怎么辦?

編輯:

另請注意,我不能將AuthenticationInterceptor邏輯更改為不受我控制的代碼。

以下是您的問題的答案(您需要閱讀第2點以了解攔截器和檢查員一點):

1.錯誤的解決方案 (您需要向其添加代碼邏輯)

在以下代碼中實現IDispatchMessageInspector。 請注意,以下類的名稱應更改為檢查器,但正如您所提到的,您無法更改它,因此您應在此處實現該接口。 否則,建議使用Matching Inspector后綴和實現創建另一個類。

public class AuthenticationInterceptor : RequestInterceptor, IDispatchMessageInspector
{
    //Authentication logic goes here......
    object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
    {
        //Your code here.
    }
    void IDispatchMessageInspector.BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
        //Your code here.
    }
}

2. RequestInterceptor和MessageInspectors之間的區別

在任何客戶端服務器通信中,可以有兩個重要的通信階段。 首先,當客戶端與服務器建立連接時,第二,當它們都進行通信時。

建立連接時,嘗試建立連接的客戶端不必是有效的客戶端。 它也可能是未經授權的請求,或者請求可能有效但不是針對目標服務器並且需要授權或連接重新路由。

重新路由的一個很好的例子是:

  1. 您希望區域客戶端/服務器避免跨區域通信,但是客戶端之一(有效)但嘗試連接到不同的區域服務器。

  2. 您希望服務器有選擇地決定是否允許為少數特殊用戶提供跨區域客戶端 - 服務器通信。

可能存在更復雜的重新路由場景,這超出了這個答案的范圍。

因此,在WCF中,Rest入門工具包為您提供了在連接建立階段攔截請求的額外功能。 攔截器(在您的情況下是AuthenticationInterceptor)應該對這些請求進行身份驗證,如果請求無效,它可以記錄必要的條目,並拒絕進一步處理來自此被拒絕的客戶端/會話的任何通信。

我們有一個RequestInterceptor的好處:

  1. 它有助於我們在很早的階段驗證傳入的請求。

  2. 它可以幫助我們構建自定義身份驗證器或重新路由組件。

  3. 它在請求階段本身阻止任何進一步的消息處理,這對於保持不必要的負載遠離WCF服務/服務器非常重要。

消息檢查器:當驗證請求並建立連接時,可以將MessageInspectors視為客戶端 - 服務器通信第二階段的一部分,因此,客戶端 - 服務器必須通過將消息傳遞給彼此來開始通信。 現在,在您的應用程序環境中,消息可能會使用二進制,xml或json序列化格式傳遞。 可能存在適用的加密。

一個例子是,消息可能從客戶端A到達並提供給服務器B現在服務器將它排隊到另一個服務器C,它可以等待來自另一個服務器D的更多信息。一旦服務器D提供了信息,服務器C隊列中的消息進一步加入從服務器B和服務器D收到的原始消息,將其提供給另一個服務進行反序列化並將其轉換為有意義的內容,可以將其返回給服務器B,B將其返回給客戶端A.

相當復雜,對吧? 但是,使用移動PIN通過信用卡支付的多服務器身份驗證在某種程度上也有類似的方式,但可能不完全相同,但更復雜。

在WCF中,攔截器和檢查員可以一起工作,他們的職責也不同。 攔截器驗證最終用戶/連接/重新路由,並且Inspector驗證/處理消息。

幾點:

  1. 您可以通過為客戶端實現IClientMessageInspector和在服務器端實現IDispatchMessageInspector來構建自己的消息檢查器。

  2. 如果您是客戶端和服務器組件的所有者,則可以在單個類中實現這兩個接口。

  3. 在這種情況下,您似乎需要實現IDispatchMessageInspector。

實現IDispatchMessageInspector的類不像我之前提到的那樣截取,而是用於“檢查”傳入消息和任何傳出消息,並且當消息從客戶端到達時,可以使用配置來掛接此Inspector。

請注意,此時在Inspector級別,任何到達的消息都已在各種通道堆棧級別處理,並分配給哪個WCF服務將處理此請求。 如果您在其間使用任何加密,則該消息已被解密。 但是,該消息尚未反序列化。

使用您的自定義Inspector可能是您的系統可能實現自定義序列化格式(如銀行中的SWIFT / FIX協議)或其他級別的zip / unzip編碼等。

此自定義檢查器可以反序列化數據並將其提供給組件COMP,這實際上意味着處理反序列化的數據。

IDispatchMessageInspector接口有兩個您需要實現的方法:

a)AfterReceiveRequest和

b)BeforeSendReply(ref Message,Object)。

AfterReceiveRequest是可以對數據進行解法化並將其提供給COMP的方法,而BeforeSendReply是再次序列化數據並對消息執行任何操作的方法。

您可以使用行為為Web服務接收的每條消息附加MessageInspectors。 自定義攔截器和檢查器都主要用於企業平台或高度可定制的平台。

希望這個答案可以幫到你。 您可以在以下鏈接上閱讀更多信息(可能您已經完成了第一個鏈接):

http://msdn.microsoft.com/en-us/library/ee391967.aspx

http://msdn.microsoft.com/en-us/library/aa717047(v=vs.110).aspx

問候卡加爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM