自定义消息编码绑定实现

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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。代码如下;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

自定义消息编码绑定实现

上一篇:Sorting It All Out(拓扑排序,floyd)


下一篇:(一)MVC项目_准备工作