【问题标题】:Multiple Message Inspectors for each service endpoint每个服务端点的多个消息检查器
【发布时间】:2017-01-05 23:18:46
【问题描述】:

如果 WCF 服务公开三个端点,那么我们可以为每个端点设置不同的消息检查器吗?如果是,那么我们如何在每个端点上应用?

【问题讨论】:

    标签: wcf


    【解决方案1】:

    首先,您应该创建一个端点行为来应用您想要的格式化程序。

    class CustomInspectorEndpointBehavior : IEndpointBehavior
    {
        public void ApplyDispatchBehavior(ServiceEndpoint endpoint,
            EndpointDispatcher endpointDispatcher)
        {
            endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CustomFormatter());
        }
    
        ...
    }
    

    或者,如果有一个通用逻辑,您可以使用服务行为类为每个端点应用一个行为:

    class MultipleInspectorsServiceBehavior : IServiceBehavior
    {
        public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
            ServiceHostBase serviceHostBase)
        {
                foreach (var endpoint in serviceDescription.Endpoints)
                    endpoint.EndpointBehaviors.Add(new CustomInspectorEndpointBehavior());
        }
    
        ...
    }
    

    最后,您可以从代码中应用端点行为...

    var host = new ServiceHost(typeof(TheService));
    
    foreach (var endpoint in host.Description.Endpoints)
        endpoint.EndpointBehaviors.Add(new CustomInspectorEndpointBehavior(c));
    

    (在服务行为的情况下)

    var host = new ServiceHost(typeof(TheService));
    
    host.Description.Behaviors.Add(new MultipleInspectorsServiceBehavior());
    

    ...或来自配置:

    <system.serviceModel>
      <extensions>
        <behaviorExtensions>
          <add name="customInspectorEndpointBehavior"
               type="CustomInspectorEndpointBehaviorExtensionElement, MyAssembly" />
        </behaviorExtensions>
      </extensions>
      <behaviors>
        <endpointBehaviors>
          <behavior name="behavior1">
            <customInspectorEndpointBehavior />
            <!--maybe some other behaviors-->
          </behavior>
          <behavior name="behavior2">
            <customInspectorEndpointBehavior />
            <!--maybe some other behaviors-->
          </behavior>
        </endpointBehaviors>
      </behaviors>
      <services>
        <service name="TheService">
          <endpoint address="address1" ... contract="..." behaviorConfiguration="behavior1" />
          <endpoint address="address2" ... contract="..." behaviorConfiguration="behavior1" />
          <endpoint address="address3" ... contract="..." behaviorConfiguration="behavior2" />
        </service>
      </services>
    </system.serviceModel>
    

    对于服务行为:

    <system.serviceModel>
      <extensions>
        <behaviorExtensions>
          <add name="multipleInspectorsServiceBehavior"
               type="MultipleInspectorsServiceBehaviorExtensionElement, MyAssembly" />
        </behaviorExtensions>
      </extensions>
      <behaviors>
        <serviceBehaviors>
          <behavior name="CustomServiceBehavior">
            <multipleInspectorsServiceBehavior />
          <!--maybe some others-->
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <services>
        <service name="TheService" behaviorConfiguration="ServiceBehavior">
          <endpoint address="address1" ... contract="..." />
          <endpoint address="address2" ... contract="..." />
          <endpoint address="address3" ... contract="..." />
        </service>
      </services>
    </system.serviceModel>
    

    在这里你应该创建一个BehaviorExtensionElement 来引用配置中的行为:

    class CustomInspectorEndpointBehaviorExtensionElement : BehaviorExtensionElement
    {
        public override Type BehaviorType
        {
            get
            {
                return typeof(CustomInspectorEndpointBehavior);
            }
        }
    
        protected override object CreateBehavior()
        {
            return new CustomInspectorEndpointBehavior();
        }
    }
    
    class MultipleInspectorsServiceBehaviorExtensionElement : BehaviorExtensionElement
    {
        public override Type BehaviorType
        {
            get
            {
                return typeof(MultipleInspectorsServiceBehavior);
            }
        }
    
        protected override object CreateBehavior()
        {
            return new MultipleInspectorsServiceBehavior();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2018-08-20
      • 2017-09-18
      • 2020-02-25
      相关资源
      最近更新 更多