扩展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
原文:http://www.cnblogs.com/tyb1222/p/3517286.html