zoukankan      html  css  js  c++  java
  • WCF绑定细节(2)——绑定,绑定元素

    绑定这块引出了很多细节。绑定解决了消息交换中的传输协议,传输,编码等问题。如果要公开WCF服务,就要公开终结点EndpointWCF服务信息交换就是Endpoint之间的信息交换。终结点三大元素:ABCA解决寻址问题,C解决协定(契约)问题,这里可以设置服务的功能集,这是我们真正用到的地方,B绑定是重中之重,解决了其中最重要的一系列问题。

    (一)系统提供了全面的绑定实现

    系统提供了相当全面的绑定:

    ·BasicHttpBinding 适用于符合WS-basic profileweb服务通信。例如基于.netWS。传输协议Http,消息编码:文本/xml。在配置文件里这个节点的名称就是第一个单词全小写,后边单词首字母大写。basicHttpBinding。其它的系统提供的绑定在配置文件中一般也按这个规则走。

    ·WSHttpBinding 非双工的。

    ·WSDualHttpBinding 双工的

    ·NetTcpBinding 跨计算机通信

    ·NetNamedPipeBinding 计算机内通信

    ·NetMsmqBinding 消息队列

    其它的省略。这里有几个详细的表(这几个表太好):

    ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs

    /wcf_con/html/2c243746-45ce-4588-995e-c17126a579a6.htm

     

    (二)绑定基类

    绑定在WCF实现上就是上边这些绑定,对应着各自的类。它们都由Binding类派生:

    public class BasicHttpBinding : Binding, IBindingRuntimePreferences

     

    Binding

    public abstract class Binding : IDefaultCommunicationTimeouts

    Binding类实现了IdefaultCommunicationTimeouts接口,这个接口用于定义通信的超时属性。它有4个属性:

     

    ·CloseTimeout  获取 close 方法(由通信对象调用)在超时之前的时间间隔。

    ·OpenTimeout  获取 open 方法(由通信对象调用)在超时之前的时间间隔。

    ·ReceiveTimeout  获取 receive 方法(由通信对象调用)在超时之前的时间间隔。

    ·SendTimeout  获取 send 方法(由通信对象调用)在超时之前的时间间隔。

     

    (三)绑定是分层的

    一个绑定对象对应着一组有序的集合,一组绑定元素对象的集合,而这些元素按层来分别处理各自的事务。因为WCF服务是基于消息交换,而这种交换是在终结点之间进行的,所以每个元素负责终结点通信的一个方面。例如:编码,传输,安全等等。

    它的层:

    选项

    是否必需

    事务流

    TransactionFlowBindingElement

    可靠性

    ReliableSessionBindingElement

    安全性

    对称、非对称、传输级

    形状更改

    CompositeDuplexBindingElement

    传输升级

    SSL 流、Windows 流、对等解析程序

    编码

    文本、二进制、MTOM、自定义

    传输

    TCP、命名管道、HTTPHTTPSMSMQ、自定义

     

    其中编码层和传输层是必要条件。

    这一层一层的绑定元素(Binding Element)就是BindingElement

    (四)绑定元素

    绑定元素在WCF实现上就是BindingElement

    它做为其它绑定元素的基类。绑定元素用于为各种类型的信道生成信道工厂和信道监听器以处理传出和传入消息的绑定元素。(有的叫通道,也有叫信道的,指得是一个意思,但理解上有一些不同。)

    由它派生的绑定元素实现:

    OneWayBindingElement

    TransportBindingElement

    CompositeDuplexBindingElement

    StreamUpgradeBindingElement

    PrivacyNoticeBindingElement

    UseManagedPresentationBindingElement

    ReliableSessionBindingElement

    SecurityBindingElement

    MessageEncodingBindingElement

    PeerResolverBindingElement

    TransactionFlowBindingElement

    ContextBindingElement

    从字面上可以大概能够看出每个元素的主要义务。

     

    (五)绑定的绑定元素

    这里看下几种系统绑定是由哪几个绑定元素组成的。

    在绑定基类中Binding有个CreateBindingElements方法,

    public abstract BindingElementCollection CreateBindingElements()

    它的功能就是:创建一个集合,该集合包含属于当前绑定的绑定元素,而由绑定基类实现的各个系统绑定都实现了这个方法。然后绑定元素(BindingElement)有个GetType方法,用于获取绑定元素实例(Type),然后就可以通过类型属性来得到详细信息了。

    1)现在看看BasicHttpBinding绑定包含哪些绑定元素:

    public void TestBasicHttpBindingElements()

    {

        BasicHttpBinding _binding=new BasicHttpBinding();

    BindingElementCollection _list =

    _binding.CreateBindingElements();

     

        foreach (BindingElement ele in _list)

        {

    Console.WriteLine(ele.GetType().FullName);

        }

    }

    结果:

    System.ServiceModel.Channels.TextMessageEncodingBindingElement

    System.ServiceModel.Channels.HttpTransportBindingElement

     

    它由2层组成。从字面上可以大概推断出一层用于消息编码,一层用于传输。绑定是分层的,最低要有两层:传输层与编码层。

    ·TextMessageEncodingBindingElement这个绑定元素的结构为:

    BindingElement

    MessageEncodingBindingElement

    TextMessageEncodingBindingElement

     

    它的定义为:

    public sealed class TextMessageEncodingBindingElement

    : MessageEncodingBindingElement,

    IWsdlExportExtension, IPolicyExportExtension

    ·HttpTransportBindingElement这个绑定元素的结构为:

    BindingElement

    TransportBindingElement

    HttpTransportBindingElement

     

    它的定义为:

    public class HttpTransportBindingElement

    : TransportBindingElement,

    IWsdlExportExtension, IPolicyExportExtension

     

    2WSDualHttpBinding绑定元素

    public void TestWSDuplexHttpBindingElements()

    {

        WSDualHttpBinding _binding = new WSDualHttpBinding();

    BindingElementCollection _list =

    _binding.CreateBindingElements();

     

        foreach (BindingElement ele in _list)

        {

    Console.WriteLine(ele.GetType().FullName);

        }

    }

     

    结果:

    System.ServiceModel.Channels.TransactionFlowBindingElement

    System.ServiceModel.Channels.ReliableSessionBindingElement

    System.ServiceModel.Channels.SymmetricSecurityBindingElement

    System.ServiceModel.Channels.CompositeDuplexBindingElement

    System.ServiceModel.Channels.OneWayBindingElement

    System.ServiceModel.Channels.TextMessageEncodingBindingElement

    System.ServiceModel.Channels.HttpTransportBindingElement

     

     

     

  • 相关阅读:
    使用golang访问kubebernetes
    使用 Rancher 管理现有 Kubernetes 集群
    Running powershell scripts during nuget package installation and removal
    How to Create, Use, and Debug .NET application Crash Dumps in 2019
    寻找写代码感觉(一)之使用 Spring Boot 快速搭建项目
    Selenium+Java之解决org.openqa.selenium.InvalidArgumentException: invalid argument报错问题
    Selenium环境搭建
    关于Xpath定位方法知道这些基本够用
    Web自动化之浏览器启动
    【翻译】编写代码注释的最佳实践
  • 原文地址:https://www.cnblogs.com/jams742003/p/1688700.html
Copyright © 2011-2022 走看看