在 WCF REST 4.0 中使用 StandardEndpoints 时如何配置 MessageInspector

Posted

技术标签:

【中文标题】在 WCF REST 4.0 中使用 StandardEndpoints 时如何配置 MessageInspector【英文标题】:How do you configure a MessageInspector when using StandardEndpoints in WCF REST 4.0 【发布时间】:2011-09-12 15:43:00 【问题描述】:

我正在尝试创建和配置消息检查器以对 WCF Rest HTTP 请求执行一些身份验证。我正在使用 4.0,因此试图避开 WCF Starter Kit,尽管我已经设法让旧的 RequestInterceptor 以我想要的方式工作。使用 RequestInterceptor 的问题是我丢失了 WebHttpBehavior 提供的 automaticFormatSelectionEnabled 功能,我真的想保留这些功能。

所以我的问题是如何配置 Message Inspector 以使我仍然使用 WebHttpBehavior 并保留它的功能。

我的 web.config 看起来像这样

    <standardEndpoints>
  <webHttpEndpoint>
    <!-- the "" standard endpoint is used by WebServiceHost for auto creating a web endpoint. -->
    <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
    <!-- Disable the help page for the directory end point-->
    <standardEndpoint name="DirectoryEndpoint"/>
  </webHttpEndpoint>
</standardEndpoints>

【问题讨论】:

【参考方案1】:

处理这个问题的一种方法是创建三个对象。

    消息检查员,负责分析 请求/响应 服务行为,自动将检查器注入 管道 配置部分,允许在 web.config

首先通过实现 IDispatchMessageInspector 创建消息检查器 并将您的验证代码放入 AfterReceiveRequest 方法中:

public class HmacVerificationInspector : IDispatchMessageInspector


    #region IDispatchMessageInspector Members

    public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, 
        System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
    
            MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
            request = buffer.CreateMessage();
            Message dupeRequest = buffer.CreateMessage();

            ValidateHmac(dupeRequest);

            buffer.Close();

        return null;
    

    public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, 
        object correlationState)
    


    

    #endregion

在阅读消息时创建消息的缓冲副本很重要。消息只能打开一次,不创建副本会导致管道出现问题。如果失败,我的 ValidateHmac 实现会引发异常。这可以防止调用实际的服务。

其次,为您的检查员创建一个行为。我们将使用该行为将检查器注入 WCF 运行时。要创建行为,请从 IEndpointBehavior 派生一个类,使其看起来像这样

 public class HmacVerificationBehavior : IEndpointBehavior
    
        #region IEndpointBehavior Members

        public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        

        

        public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
        

        

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
        
            HmacVerificationInspector inspector = new HmacVerificationInspector();

            endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
        

        public void Validate(ServiceEndpoint endpoint)
        

        

        #endregion
    

请注意,我创建了我的检查器 (HmacVerificationInspector) 的一个新实例,并以编程方式将其注入运行时。

最后,最后一步是创建配置部分。我们可以使用它来应用 Web 配置中的行为(从而能够通过配置打开和关闭它)。新建一个类,继承 BehaviorExtensionElement 和 IServiceBehavior:

public class HmacVerificationConfigurationSection : BehaviorExtensionElement, IServiceBehavior

    #region IServiceBehavior Members

    public void AddBindingParameters(ServiceDescription serviceDescription, 
        System.ServiceModel.ServiceHostBase serviceHostBase, 
        System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, 
        System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
    

    

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
    

    

    public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
    

    

    #endregion

    public override Type BehaviorType
    
        get  return typeof(HmacVerificationBehavior); 
    

    protected override object CreateBehavior()
    
        return new HmacVerificationBehavior();
    

现在,要使用检查器,请将以下内容添加到您的 web.config(您可以将扩展名设置为任何您想要的名称)

<system.serviceModel>
        <extensions>
            <behaviorExtensions>
                <add name="hmacVerification" type="NamespaceHere.HmacVerificationConfigurationSection, AssembleyHere, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
            </behaviorExtensions>
        </extensions>
        <services>
            <service name="MySecureService">
                <endpoint address="" binding="webHttpBinding" contract="IMySecureService" behaviorConfiguration="web" />
            </service>
        </services>
        <behaviors>
            <endpointBehaviors>
                <behavior name="web">
                    <webHttp automaticFormatSelectionEnabled="true" />          
                    <hmacVerification />
                </behavior>
            </endpointBehaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
    </system.serviceModel>

几件事,首先你在行为扩展中注册配置部分。接下来,您将该配置用作端点行为,然后它将自动注入检查器,并且对该端点的所有请求都将通过您的检查器运行。如果要关闭检查器,请删除标签或选择不同的端点行为。还要注意 webHttp 行为的使用(这将允许您保持 automaticFormatSelectionEnabled。

希望对你有帮助

【讨论】:

你知道我认为这可能已经过时了。 相反,我认为它非常有帮助。谢谢。 关于 wcf 消息的更好帖子我已经阅读了很多时间。非常感谢。

以上是关于在 WCF REST 4.0 中使用 StandardEndpoints 时如何配置 MessageInspector的主要内容,如果未能解决你的问题,请参考以下文章

Autofac + WCF REST 4.0

如何使用 .Net 4.0 REST WCF 服务?

如何在 WCF 4.0 REST 服务上启用基本身份验证?

WCF 4.0 - 使用 REST 服务模板返回 JSON WebFaultException

公开 WCF 4.0 Rest 模板服务的元数据

WCF REST模式下的UriTemplate路径问题