zoukankan      html  css  js  c++  java
  • 自定义消息编码绑定实现

      扩展WCF 消息编码绑定,需实现MessageEncodingBindingElement,MessageEncoder,MessageEncoderFactory.如果希望通过配置的方式应用我们实现的绑定,则还需要实现BindingElementExtensionElement。

      首先从消息编码绑定实现开始;实现MessageEncoderBindingElement

     public abstract class CommonMessageEncodingBindingElement : MessageEncodingBindingElement
        {
            protected MessageEncodingBindingElement innerBindingElement;
    
            protected CommonMessageEncodingBindingElement() : this(new TextMessageEncodingBindingElement())
            {
            }
    
            protected CommonMessageEncodingBindingElement(
                MessageEncodingBindingElement textMessageEncodingBindingElement)
            {
                innerBindingElement = textMessageEncodingBindingElement;
            }
    
            public MessageEncodingBindingElement InnerBindingElement
            {
                get { return innerBindingElement; }
                set { innerBindingElement = value; }
            }
    
            public override MessageVersion MessageVersion
            {
                get { return innerBindingElement.MessageVersion; }
                set { innerBindingElement.MessageVersion = value; }
            }
    
            public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
            {
                context.BindingParameters.Add(this);
                return context.BuildInnerChannelFactory<TChannel>();
            }
    
    
            public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
            {
                context.BindingParameters.Add(this);
                return context.BuildInnerChannelListener<TChannel>();
            }
    
            public override bool CanBuildChannelFactory<TChannel>(BindingContext context)
            {
                return innerBindingElement.CanBuildChannelFactory<TChannel>(context);
            }
        }
    

      其次;实现MessageEncoder。代码如下;

    public abstract class CommonMessageEncoder:MessageEncoder
        {
            public MessageEncoder encoder;
    
            protected CommonMessageEncoder(MessageEncoder messageEncoder)
            {
                encoder = messageEncoder;
            }
    
            public override string ContentType
            {
                get { return encoder.ContentType; }
            }
    
            public override string MediaType
            {
                get { return encoder.MediaType; }
            }
    
            public override MessageVersion MessageVersion
            {
                get { return encoder.MessageVersion; }
            }
        }
    

      再次;实现ServerMessageEncoderFactory

     internal class ServerMessageEncoderFactory : MessageEncoderFactory
        {
            private readonly MessageEncoder encoder;
    
            public ServerMessageEncoderFactory(MessageEncoderFactory messageEncoderFactory)
            {
                encoder = new ServerMessageEncoder(messageEncoderFactory.Encoder);
            }
    
            public override MessageEncoder Encoder
            {
                get { return encoder; }
            }
    
            public override MessageVersion MessageVersion
            {
                get { return encoder.MessageVersion; }
            }
        }

    最后通过配置应用到WCF 。配置实现开始;实现BindingElementExtensionElement.

    public class ServerBindingExtension : CommonBindingElementExtensionElement
        {
            public override Type BindingElementType
            {
                get { return typeof (ServerMessageEncodingBindingElement); }
            }
    
            protected override BindingElement CreateBindingElement()
            {
                ServerMessageEncodingBindingElement serverMessageEncodingBindingElement =
                    new ServerMessageEncodingBindingElement();
                ApplyConfiguration(serverMessageEncodingBindingElement);
                return serverMessageEncodingBindingElement;
            }
        }
    

      服务端配置;

    <system.serviceModel>
        <extensions>
          <bindingElementExtensions>
            <add name="myCustomerBinding" type="Hosting.ServerBindingExtension,Hosting"/>
          </bindingElementExtensions>
        </extensions>
        <bindings>
          <customBinding>
            <binding name="customerBinding">
              <myCustomerBinding/>
              <httpTransport/>
            </binding>
          </customBinding>
        </bindings>
        <services>
          <service name="Service.AddService">
            <endpoint address="http://127.0.0.1:8088/AddService" 
                      binding="customBinding" 
                      contract="Contract.IAdd" bindingConfiguration="customerBinding" ></endpoint>
          </service>
        </services>
      </system.serviceModel>

    客户端配置;

    <system.serviceModel>
        <extensions>
          <bindingElementExtensions>
            <add name="clientBinding" type="Client.ClientBindingExtension,Client"/>
          </bindingElementExtensions>
          <behaviorExtensions>
            <add name="clientEndpoint" type="Client.ClientMessageInspector,Client"/>
          </behaviorExtensions>
        </extensions>
        <behaviors>
          <endpointBehaviors>
            <behavior>
              <clientEndpoint />
            </behavior>
          </endpointBehaviors>
        </behaviors>
        <bindings>
          <customBinding>
            <binding name="customerBinding">
              <clientBinding />
              <httpTransport></httpTransport>
            </binding>
          </customBinding>
        </bindings>
        <client>
          <endpoint address="http://127.0.0.1:8088/AddService"
                    binding="customBinding"
                    contract="Contract.IAdd"
                    name="customEndpoint" bindingConfiguration="customerBinding"></endpoint>
        </client>
      </system.serviceModel>

        服务端运行图;

      客户端调用效果;

    代码;http://download.csdn.net/detail/tyb1222/6842555

  • 相关阅读:
    http-proxy-middleware与express.json()的bug
    20+前端常用的vscode插件(总结推荐)
    图解翻转单向链表,超详细(python语言实现)
    pytest + allure2.x 踩坑-报告无数据
    Pycharm+pytest+allure打造高逼格的测试报告
    Appium Appium Python API 中文版
    appium模拟键盘事件
    AppiumDesktop控制手机和安卓模拟器
    Appium环境搭建超详细教程
    Fiddler抓包工具总结
  • 原文地址:https://www.cnblogs.com/tyb1222/p/3517286.html
Copyright © 2011-2022 走看看