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

 
摘要: 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) 编辑
 
摘要: 一,创建自定义绑定有时候我们需要创建自己的绑定,这在很多情况下不是出于特殊的安全要求和使用的传输协议。为了创建自定义的绑定,需要建立一组绑定元素。绑定元素是由System.ServiceModel.Channels.BindingElement派生而来的。代码1,使用HTTP传输协议和Binary编码格式的自定义绑定: <bindings> <customBinding> <binding name="binHttp"> <binaryMessageEncoding /> <httpTransport /> <阅读全文
posted @ 2013-03-30 17:00 月下老人 阅读(410) | 评论 (0) 编辑
 
摘要: 我们经常会遇到这样的情形:访问服务的客户端可能来自各不相同的系统和应用程序。可以使用各不相同的绑定定义多个终结点,以允许不同的客户端平台用各自支持的传输协议来访问服务。显示声明多个绑定:<?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) 编辑
原文地址:https://www.cnblogs.com/Leo_wl/p/2992436.html