自定义绑定

当系统提供的某个绑定不符合服务的要求时,可使用 CustomBinding 类。所有绑定都是从绑定元素的有序集构造而来的。自定义绑定可以从一组系统提供的绑定元素生成,也可以包含用户定义的自定义绑定元素。例如,可以使用自定义绑定元素在服务终结点处使用新的传输或编码器。有关可运行示例,请参见Custom Binding Samples。有关更多信息,请参见 <customBinding>.

自定义绑定的构造

自定义绑定是使用 CustomBinding 构造函数并通过“堆叠”在一起的绑定元素的集合构造的,这些元素的特定顺序如下:

底层是一个必需的传输元素。可以使用自己的传输,或者使用 Windows Communication Foundation (WCF) 提供的以下传输绑定元素之一:

下表总结了每层的选项。

选项 必需

事务

TransactionFlowBindingElement

可靠性

ReliableSessionBindingElement

安全

SecurityBindingElement

编码

文本、二进制、消息传输优化机制 (MTOM)、自定义

传输

TCP、HTTP、HTTPS、命名管道(也称为 IPC)、对等 (P2P)、消息队列(也称为 MSMQ)、自定义

此外,可以定义自己的绑定元素,并将它们插在前面定义的任何层之间。

 

创建用户定义的绑定

有多种方式可以创建系统未提供的绑定:

  • 基于 CustomBinding 类(可向其中填充绑定元素的容器)创建一个自定义绑定。然后将自定义绑定添加到服务终结点。可以通过编程方式或者在应用程序配置文件中创建自定义绑定。若要从应用程序配置文件中使用绑定元素,该绑定元素必须扩展 BindingElementExtensionElement。有关自定义绑定的更多信息,请参见自定义绑定CustomBinding
  • 可以创建一个从标准绑定派生的类。例如,可以从 WSHttpBinding 派生一个类并重写 CreateBindingElements 方法,以获取绑定元素并插入自定义绑定元素或建立一个特定的安全值。
  • 可以创建一个新的 Binding 类型来完全控制整个绑定实现。

绑定元素的顺序

发送或接收消息时,每个绑定元素都表示一个处理步骤。在运行时,绑定元素会创建必要的通道和侦听器,用以生成传出和传入通道堆栈。

有三种主要的绑定元素类型:协议绑定元素、编码绑定元素和传输绑定元素。

协议绑定元素 – 这些元素表示对消息执行的更高级别的处理步骤。由这些绑定元素创建的通道和侦听器可以添加、移除或修改消息内容。给定的绑定可以具有任意数量的协议绑定元素,每一个元素都从 BindingElement 继承。Windows Communication Foundation (WCF) 包括几种协议绑定元素,其中包括 ReliableSessionBindingElementSymmetricSecurityBindingElement

编码绑定元素 – 这些元素表示消息与准备用于网络传输的编码之间的转换。典型的 WCF 绑定正好包括一个编码绑定元素。编码绑定元素的示例包括 MtomMessageEncodingBindingElementBinaryMessageEncodingBindingElementTextMessageEncodingBindingElement。如果未对绑定指定编码绑定元素,则使用默认的编码。当传输协议是 HTTP 时,默认编码为文本;对于其他传输协议,默认编码为二进制。

传输绑定元素 – 这些元素表示传输协议上编码消息的传输。典型的 WCF 绑定正好包括一个从 TransportBindingElement 继承的传输绑定元素。传输绑定元素的示例包括 TcpTransportBindingElementHttpTransportBindingElementNamedPipeTransportBindingElement

创建新的绑定时,添加绑定元素的顺序很重要。应始终按照以下顺序添加绑定元素:

选项 必需

事务流

System.ServiceModel.Channels.TransactionFlowBindingElement

可靠性

System.ServiceModel.Channels.ReliableSessionBindingElement

安全

System.ServiceModel.Channels.SecurityBindingElement

复合双工

System.ServiceModel.Channels.CompositeDuplexBindingElement

编码

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

是*

传输

TCP、命名管道、HTTP、HTTPS、MSMQ、自定义

*由于每个绑定都需要一个编码,因此,如果未指定编码,则 WCF 会添加一个默认编码。对于 HTTP 和 HTTPS 传输,默认编码为 Text/XML,对于其他传输,默认编码为二进制。

创建新的绑定元素

除了从 WCF 提供的 BindingElement 派生的类型外,还可以创自己的建绑定元素。这样,您就可以通过创建自己的、可与堆栈中其他的系统提供的类型组合的 BindingElement,自定义创建绑定堆栈的方式和进入其中的组件。

例如,如果实现一个 LoggingBindingElement 以提供将消息记录到数据库中的能力,则必须将其放置在通道堆栈中传输通道的上方。在此情况下,应用程序创建一个将 TcpTransportBindingElementLoggingBindingElement 组合在一起的自定义绑定,如以下示例中所示。

Binding customBinding = new CustomBinding(
new LoggingBindingElement(),
new TcpTransportBindingElement()
);

写入新的绑定元素的方式取决于元素的确切功能。一个示例(传输:UDP)提供了有关如何实现一种绑定元素的详细说明。

创建新的绑定

可以通过两种方式使用用户创建的绑定元素。上一节演示了第一种方式:通过自定义绑定。自定义绑定允许用户基于任意一组绑定元素(包括用户创建的绑定元素)创建自己的绑定。

如果在多个应用程序中使用绑定,则可创建自己的绑定并扩展 Binding。这样就避免了在每次使用时都需要手动创建自定义绑定。用户定义的绑定允许您定义绑定的行为并包括用户定义的绑定元素。然后将用户定义的绑定进行预包装:不必在每次使用时重新生成绑定。

用户定义的绑定至少必须实现 CreateBindingElements 方法和 Scheme 属性。

CreateBindingElements 方法返回一个新的 BindingElementCollection,其中包含绑定的绑定元素。此集合已经过排序,应首先包含协议绑定元素,接下来是编码绑定元素,再接下来是传输绑定元素。在使用 WCF 系统提供的绑定元素时,必须遵照自定义绑定中指定的绑定元素排序规则。此集合不得引用在用户定义的绑定类中引用的对象;因此,绑定作者必须在每次调用 CreateBindingElements 时返回 BindingElementCollectionClone()

Scheme 属性表示在绑定上使用的传输协议的 URI 方案。例如,WSHttpBinding 和 NetTcpBinding 从各自的 Scheme 属性中返回“http”和“net.tcp”。

有关用户定义绑定的可选方法和属性的完整列表,请参见 Binding

示例

本示例在派生自 BindingSampleProfileUdpBinding 中实现配置文件绑定。SampleProfileUdpBinding 最多包含四个绑定元素:一个用户创建的 UdpTransportBindingElement;三个系统提供的 TextMessageEncodingBindingElement CompositeDuplexBindingElementReliableSessionBindingElement

public override BindingElementCollection CreateBindingElements()
{
BindingElementCollection bindingElements = new BindingElementCollection();
if (ReliableSessionEnabled)
{
bindingElements.Add(session);
bindingElements.Add(compositeDuplex);
}
bindingElements.Add(encoding);
bindingElements.Add(transport);
return bindingElements.Clone();
}

双工协定的安全限制

不是所有绑定元素都彼此兼容。具体而言,安全绑定元素在用于双工协定时存在一些限制。

单步安全

通过将 <message> 配置元素的 negotiateServiceCredential 属性设置为 false,可以实现“单步”安全。在这种模式中,所有必需的安全凭据在一个消息中发送。

单步身份验证无法与双工协定一起工作。

对于请求-答复协定,只有在安全绑定元素下的绑定堆栈支持创建 IRequestChannelIRequestSessionChannel 实例的情况下,单步身份验证才可以工作。

对于单向协定,如果安全绑定元素下的绑定堆栈支持创建 IRequestChannelIRequestSessionChannelIOutputChannelIOutputSessionChannel 实例,则单步身份验证可以工作。

Cookie 模式安全上下文标记

Cookie 模式安全上下文标记不能与双工协定一起使用。

对于请求-答复协定,只有在安全绑定元素下的绑定堆栈支持创建 IRequestChannelIRequestSessionChannel 实例的情况下,Cookie 模式安全上下文标记才可以工作。

对于单向协定,如果安全绑定元素下的绑定堆栈支持创建 IRequestChannelIRequestSessionChannel 实例,则 Cookie 模式安全上下文标记可以工作。

会话模式安全上下文标记

如果安全绑定元素下的绑定堆栈支持创建 IDuplexChannelIDuplexSessionChannel 实例,则会话模式 SCT 适用于双工协定。

如果安全绑定元素下的绑定堆栈支持创建 IDuplexChannelIDuplexSessionChannelIRequestChannelIRequestSessionChannel 实例,则会话模式 SCT 适用于请求-答复协定。

如果安全绑定元素下的绑定堆栈支持创建 IDuplexChannelIDuplexSessionChannelIRequestChannelIRequestSessionChannel 实例,则会话模式 SCT 适用于单向协定。

派生自标准绑定

也许可以扩展一个现有的系统提供的绑定,而不用创建一个全新的绑定类。与上一个示例非常类似,必须重写 CreateBindingElements 方法和 Scheme 属性。

WCF - 自定义绑定的更多相关文章

  1. WCF - 绑定后续之自定义绑定

    自定义信道基类 WCF是一个极具扩展性的通信框架 无论在服务模型层还是信道层 都具有很多扩展点 而信道层的扩展点主要体现在实现自定义信道以增强信道栈处理信息的能力 比如我们可以扩展信道层 实现一个自定 ...

  2. WCF自定义扩展,以实现aop!

    引用地址:https://msdn.microsoft.com/zh-cn/magazine/cc163302.aspx  使用自定义行为扩展 WCF Aaron Skonnard 代码下载位置: S ...

  3. WCF入门(八)---WCF服务绑定

    WCF服务绑定是一个集合,每个元素定义了服务与客户端进行通信方式的几个元素.传输元素和一个消息编码元素各自结合两个最重要的组成部分.这里是WCF服务绑定常用的列表. 基础绑定 基础约束是由basicH ...

  4. Maven自定义绑定插件目标:创建项目的源码jar

    <build> <plugins> <!-- 自定义绑定,创建项目的源码jar --> <plugin> <groupId>org.apac ...

  5. KnockoutJS 3.X API 第五章 高级应用(1) 创建自定义绑定

    您不仅限于使用内置的绑定,如click,value绑定等,您可以创建自己的绑定. 这是如何控制视图模型如何与DOM元素进行交互,并且为您提供了大量的灵活性,以便于以复用的方式封装复杂的行为. 注册绑定 ...

  6. 5.Knockout.Js(自定义绑定)

    前言 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义像grid ...

  7. 【Knockout】五、创建自定义绑定

    概述 除了上一篇列出的KO内置的绑定类型(如value.text等),你也可以创建自定义绑定. 注册你的binding handler ko.bindingHandlers.yourBindingNa ...

  8. Knockout应用开发指南 第五章:创建自定义绑定

    原文:Knockout应用开发指南 第五章:创建自定义绑定 创建自定义绑定 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定 ...

  9. Maven-07: 插件的自定义绑定

    除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,这种自定义绑定方式能让Maven项目在构建过程中执行更多更富特色的任务. 一个常见的例子是创建项目的源码jar包.内置的插 ...

随机推荐

  1. git介绍与使用

    git是去中心化版本管理工具,项目创建一个远程版本,将其clone到本地,会在本地创建一个本地仓,一个开发项目,在没有网络的时候依然可以提交修改到本地仓,当有网络的时候再提交到远程仓库.git可以快速 ...

  2. Objective-C 里面的类对象复用小结

    OC 提供了单继承 (Inheritance), Category, Extension, Protocol 这几种基本的类与对象层面的复用机制,作一小结. 在这几个机制中,继承提供了纵向的复用,可以 ...

  3. QPushButton注册事件过滤器后按钮消失

    版权声明:本文为博主原创文章,转载需要注明出处. RT,代码如下: ui.btn_set->installEventFilter(this); bool MousrHoverTest::even ...

  4. matlab化简符号表达式

    化简符号表达式计算机毕竟还是挺笨的, 经过一系列的符号计算后, 得到的结果可能只有它自己才能看懂, Matlab提供大量函数以用于符号表达式的化简. collect(f): 函数用途是合并多项式中相同 ...

  5. Jmeter中的参数化常用的几种方式

    Jmeter中的参数化常用的几种方式,这里讲一下前两个方式,最后一个在csv参数化里已详细讲解. 1.用户参数 2.函数助手 3.CSV Data Set Config  一.用户参数 位置:添加-前 ...

  6. dxf组码

    值 说明 -5 APP:永久反应器链 -4 APP:条件运算符(仅与 ssget 一起使用) -3 APP:扩展数据 (XDATA) 标记(固定) -2 APP:图元名参照(固定) -1 APP:图元 ...

  7. 打开windows服务

    #include <winsvc.h> void CXXXDlg::ServiceRun() { SERVICE_STATUS ssStatus; //获得ServiceControl M ...

  8. Jupyter IPython dead kernel and do not restart

    本人遇到的情况:dead kernel & try to restart failed 查看CMD发现这个库安装有问题 解决办法 1.pip uninstall backports.shuti ...

  9. HYSBZ - 2763 飞行路线(分层图最短路线)

    题目: Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价 ...

  10. JS 实现全屏预览 F11功能

    老是不通过,没办法,只能是重新发布了,反正我就是杠上了,大大小小写过很多前端特效,当然也经常在网上copy或者修改人家的代码,我觉得也挺好的,为什么?!因为我想这样,你能怎么办,打我?少废话,直接上代 ...