wcf自定义绑定
wcf自定义绑定
一,创建自定义绑定
有时候我们需要创建自己的绑定,这在很多情况下不是出于特殊的安全要求和使用的传输协议。为了创建自定义的绑定,需要建立一组绑定元素。绑定元素是由System.ServiceModel.Channels.BindingElement派生而来的。
代码1,使用HTTP传输协议和Binary编码格式的自定义绑定:
<bindings>
<customBinding>
<binding name= " binHttp " >
<binaryMessageEncoding />
<httpTransport />
</binding>
</customBinding>
</bindings>
除了用配置方式创建一个自定义绑定,也可以采用编程方式。
代码2,用编程方式配置一个自定义绑定:
class Program
{
static void Main( string [] args)
{
CustomBinding binding = new CustomBinding();
binding.Elements.Add( new BinaryMessageEncodingBindingElement());
binding.Elements.Add( new HttpTransportBindingElement());
ServiceHost host = new ServiceHost( typeof (CarRentalService));
ServiceEndpoint serviceEndpoint =
host.AddServiceEndpoint( typeof (ICarRentalService),
binding,
" http://localhost:8080/CarRentalService " );
try
{
host.Open();
Console.WriteLine( " The car rental service is up and listening on the following addresses: " );
foreach ( var item in host.Description.Endpoints)
{
Console.WriteLine( " > [{0}] {1} " , item.Binding.Name, item.Address.Uri.ToString());
}
Console.ReadLine();
host.Close();
}
catch (CommunicationException ex)
{
host.Abort();
Console.WriteLine(ex);
}
catch (TimeoutException ex)
{
host.Abort();
Console.WriteLine(ex);
}
catch (Exception ex)
{
host.Abort();
Console.WriteLine(ex);
}
}
}
二,重用自定义绑定
有时,可能需要创建一个能够重复用于不同解决方案的自定义绑定。由于每个绑定都派生于System.ServiceModel.Channels.Binding这个抽象基类,我们只需建立自己的绑定类,并实现CreateBindingElement方法即可实现此目的。
代码1,由基类Binding创建一个可重用的自定义绑定:
public class NetTcpTextBinding : Binding
{
private TcpTransportBindingElement transport;
private TextMessageEncodingBindingElement encoding;
public NetTcpTextBinding()
: base ()
{
this .Initialize();
}
public override BindingElementCollection CreateBindingElements()
{
BindingElementCollection elements = new BindingElementCollection();
elements.Add( this .encoding);
elements.Add( this .transport);
return elements;
}
public override string Scheme
{
get { return this .transport.Scheme; }
}
private void Initialize()
{
this .transport = new TcpTransportBindingElement();
this .encoding = new TextMessageEncodingBindingElement();
}
}
代码2,使用NetTcpTextBing绑定:
NetTcpTextBinding binding = new NetTcpTextBinding();
ServiceHost host = new ServiceHost( typeof (Service1));
host.AddServiceEndpoint( typeof (IService1),
binding,
" net.tcp://localhost:10101/IService " );
host.Open();
如果需要通过配置文件使用自定义绑定,必须先扩展BindingCollectionElement抽象基类,然后再实现需要的方法。
代码3,实现NetTcpTextBindingCollectionElement:
namespace ConsoleApplication1
{
public class NetTcpTextBindingCollectionElement : BindingCollectionElement
{
public override Type BindingType
{
get { return typeof (NetTcpTextBinding); }
}
public override ReadOnlyCollection<IBindingConfigurationElement> ConfiguredBindings
{
get
{
return new ReadOnlyCollection<IBindingConfigurationElement>( new List<IBindingConfigurationElement> ());
}
}
public override bool ContainsKey( string name)
{
throw new NotImplementedException();
}
protected override Binding GetDefault()
{
return new NetTcpTextBinding();
}
protected override bool TryAdd( string name, Binding binding, Configuration config)
{
throw new NotImplementedException();
}
}
}
现在,如果要在配置文件中使用自定义绑定NetTcpTextBinding,就必须用绑定扩展(<bindingExtensions>)配置NetTcpTextBindingCollectionElement元素。总之,如果要在配置文件中使用自定义绑定,就需要先进行定义。
代码4,在配置文件中使用自定义绑定NetTcpTextBinding:
<system.serviceModel>
<services>
<service name= " WcfServiceLibrary2.Service1 " >
<endpoint address= " net.tcp://localhost:10101/IService "
binding = " netTcpTextBinding "
contract = " WcfServiceLibrary2.IService1 " >
</endpoint>
</service>
</services>
<extensions>
<bindingExtensions>
<add name= " netTcpTextBinding " type= " ConsoleApplication1.NetTcpTextBindingCollectionElement, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null " />
</bindingExtensions>
</extensions>
</system.serviceModel>
分类: wcf
标签: wcf
wcf
wcf ChannelFactory类
摘要: ChannelFacTory对象主要用在中间层,目的是提高系统的性能,并且不需要每次都为每个客户端实例化一个新的代理对象。ChannelFactory<T>类:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using Wrox.CarRentalService.Contracts;namespace Wrox.CarRentalService.ConsoleClient{ class Program { ... 阅读全文
posted @ 2013-03-30 17:20 月下老人 阅读(89) | 评论 (0) 编辑
wcf自定义绑定
摘要: 一,创建自定义绑定有时候我们需要创建自己的绑定,这在很多情况下不是出于特殊的安全要求和使用的传输协议。为了创建自定义的绑定,需要建立一组绑定元素。绑定元素是由System.ServiceModel.Channels.BindingElement派生而来的。代码1,使用HTTP传输协议和Binary编码格式的自定义绑定: <bindings> <customBinding> <binding name="binHttp"> <binaryMessageEncoding /> <httpTransport /> < 阅读全文
posted @ 2013-03-30 17:00 月下老人 阅读(410) | 评论 (0) 编辑
wcf设置多绑定
摘要: 我们经常会遇到这样的情形:访问服务的客户端可能来自各不相同的系统和应用程序。可以使用各不相同的绑定定义多个终结点,以允许不同的客户端平台用各自支持的传输协议来访问服务。显示声明多个绑定:<?xml version="1.0"?><configuration> <system.serviceModel> <services> <service name="MyService"> <endpoint address="http://localhost:8080/MyService&q 阅读全文
posted @ 2013-03-24 22:46 月下老人 阅读(63) | 评论 (0) 编辑
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息