7

我在这里有两个疑问:-

1)两者的基本区别是什么Microsoft.ServiceModel.Web.RequestInterceptor and System.ServiceModel.Dispatcher.DispatchRuntime.MessageInspectors (IdispatchMessageInterceptor)

两者似乎都是请求/消息拦截器,可用于在请求管道中实现自定义验证/拦截器。

什么时候用一个对另一个?

RequestInterceptor2 )还有如何插入RouteTable.Routes.Add(new ServiceRoute())

我有这样的课-

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 逻辑更改为不受我控制的代码。

4

1 回答 1

10

以下是您问题的答案(您需要通读第 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的区别

在任何客户端服务器通信中,都可能有两个重要的通信阶段。首先,当客户端与服务器建立连接时,其次当它们都进行通信时。

建立连接时,尝试建立连接的客户端不一定是有效客户端。它也可能是未经授权的请求,或者请求可能是有效的但不是针对目标服务器的,并且需要授权或连接重新路由。

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

  1. 您希望区域客户端/服务器避免跨区域通信,但其中一个客户端(有效)但尝试连接到不同的区域服务器。

  2. 您希望服务器有选择地决定您是否希望允许少数特殊用户进行跨区域客户端-服务器通信。

可能存在超出此答案范围的更复杂的重新路由方案。

因此,在 WCF 中,Rest 入门工具包为您提供了在连接建立阶段拦截请求的额外能力。拦截器(在您的情况下为 AuthenticationInterceptor)应该对此类请求进行身份验证,如果请求无效,它可以记录必要的条目并拒绝处理来自该被拒绝的客户端/会话的任何通信。

拥有 RequestInterceptor 有很多好处:

  1. 它可以帮助我们在很早的阶段验证传入的请求。

  2. 它可以帮助我们构建自定义身份验证器或重新路由组件。

  3. 它在请求阶段本身阻止任何进一步的消息处理,这对于保持 WCF 服务/服务器的不必要负载非常重要。

Message Inspectors: MessageInspectors 可以被视为客户端-服务器通信第二阶段的一部分,当请求被验证并且连接建立良好时,因此这是客户端-服务器必须通过相互传递消息开始通信的时候。现在,在您的应用程序环境中,消息可能使用二进制、xml 或 json 序列化格式传递。可能有适用的加密。

一个例子是,有可能一条消息从客户端 A 到达并现在提供给服务器 B,服务器将其排队到另一个服务器 C,后者可以等待来自另一个服务器 D 的更多信息。一旦服务器 D 提供信息,服务器 C队列中的消息进一步加入从服务器 B 和服务器 D 接收的原始消息,将其提供给另一个服务以反序列化并将其转换为可以返回给服务器 B 和 B 将其返回给客户端 A 的有意义的东西。

很复杂,对吧?但是多服务器身份验证(例如使用移动 PIN 进行信用卡支付)在某种程度上以类似的方式工作,虽然可能不完全相同,但更复杂。

在 WCF 中,Interceptor 和 Inspector 可以一起工作,他们的职责是不同的。拦截器验证最终用户/连接/重新路由,检查器验证/处理消息。

几点:

  1. 您可以通过在客户端实现 IClientMessageInspector 和在服务器端实现 IDispatchMessageInspector 来构建自己的消息检查器。

  2. 如果您同时拥有客户端和服务器组件,则可以在一个类中实现这两个接口。

  3. 在这里,在您的情况下,您似乎需要实现 IDispatchMessageInspector。

实现 IDispatchMessageInspector 的类不会像我之前提到的那样进行拦截,而是用于“检查”传入消息和任何传出消息,并且当消息从客户端到达时,可以使用配置挂钩此 Inspector。

请注意,此时在 Inspector 级别,任何到达的消息都已在各个通道堆栈级别进行处理,并分配给 WCF 服务将处理此请求。如果您在两者之间使用任何加密,则该消息已被解密。但是,该消息尚未反序列化。

使用自定义检查器的一个用途是,您的系统可能会实现自定义序列化格式,例如(银行中的 SWIFT/FIX 协议)或其他级别的 zip/unzip 编码等。

这个自定义检查器可以反序列化数据并将其提供给您的组件 COMP,这实际上是为了处理反序列化的数据。

IDispatchMessageInspector 接口有两个需要实现的方法:

a) AfterReceiveRequest 和

b)BeforeSendReply(参考消息,对象)。

AfterReceiveRequest 是可以将数据反序列化并提供给 COMP 的方法,而 BeforeSendReply 是再次序列化数据并对消息执行任何操作的方法。

您可以使用行为为您的 Web 服务收到的每条消息附加 MessageInspector。自定义拦截器和检查器都主要用于企业平台或高度可定制的平台。

希望这个答案对您有所帮助。您可以在以下链接上阅读更多信息(可能您已经阅读了第一个链接):

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

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

问候卡哈尔

于 2014-06-28T19:47:42.053 回答