当前位置: 首页 > news >正文

WCF 第四章 绑定 创建一个自定义绑定

有很多时候预先设置好的绑定不满足你的服务的需求。一般的场景包含了自定义安全和额 外传输协议,都不被WCF支持。一个例子是WCF中不支持UDP协议。对UDP协议的支持是以Windows SDK 中的例子来实现的。考虑到这些情况所以WCF提供了创建自定义绑定的能力。自定义绑定可以由代码或配置文件创建。一个自定义绑定的代码使用 System.ServiceModel.Channels命名空间中的CustomBinding 类来生成。这个类暴露了一个你可以添加绑定元素的绑定元素集合。这允许你构造一个基于一系列现有绑定元素的新的绑定。列表4.32 显示了一个由代码生成的自定义绑定。
列表4.32 使用代码创建一个自定义绑定
CustomBinding customBinding = new CustomBinding();
customBinding.Elements.Add(new BinaryMessageEncodingBindingElement());
customBinding.Elements.Add(new UdpBindingElement());
  一个自定义绑定可以使用customBinding元素在配置文件中创建。列表4.33 显示了一个用配置文件描述的自定义绑定。当使用配置文件时,一个自定义绑定必须总是使用一个命名绑定。
列表4.33 使用配置文件创建一个自定义绑定
01<?xml version="1.0" encoding="utf-8" ?>
02<configuration>
03  <system.serviceModel>
04    <bindings>
05      <customBinding>
06        <binding name="CustomBinding">
07          <binaryMessageEncoding />
08          <udpTransport />
09        </binding>
10      </customBinding>
11    </bindings>
12  </system.serviceModel>
13</configuration>
注意绑定确定了一个传输绑定元素和一个编码器。这是创建一个自定义绑定需要的所有内容。如果传输绑定元素确定了一个默认编码器,那么编码器就是可选的。改 变一个自定义绑定是如何工作的只是几行代码或者配置文件的问题。当使用配置文件的时候要小心,因为它可以被改变。如果你不打算在以后改变绑定,那么使用代 码创建你的自定义绑定。
   下面的配置文件内容可以与列表4.2~4.4中的示例程序一起使用。列表4.34中的配置文件信息使用customBinding绑定暴露 StockQuoteService服务。绑定在TCP传输协议与二进制编码的基础上暴露服务。自定义绑定与netTcpBinding绑定类似但是不支 持可信赖消息,事务和安全。
列表 4.34 customBinding 宿主配置
01<?xml version="1.0" encoding="utf-8" ?>
02<configuration>
03  <system.serviceModel>
04    <services>
05      <service name="EssentialWCF.StockQuoteService">
06        <host>
07          <baseAddresses>
08            <add baseAddress="net.tcp://localhost/stockquoteservice"/>
09          </baseAddresses>
10        </host>
11        <endpoint address=""
12            binding="customBinding" bindingConfiguration="customBinding"
13            contract="EssentialWCF.IStockQuoteService" />
14      </service>
15    </services>
16    <bindings>
17      <customBinding>
18        <binding name="customBinding">
19          <binaryMessageEncoding/>
20          <tcpTransport />
21        </binding>
22      </customBinding>
23    </bindings>
24  </system.serviceModel>
25</configuration>
  列表4.35 调用列表4.34中使用customBinding绑定的服务的客户端配置
列表4.35 customBinding 客户端配置
01<?xml version="1.0" encoding="utf-8" ?>
02<configuration>
03  <system.serviceModel>
04    <client>
05        <endpoint address="net.tcp://localhost/stockquoteservice"
06            binding="customBinding" bindingConfiguration="customBinding"
07            contract="EssentialWCF.IStockQuoteService" />
08    </client>
09    <bindings>
10      <customBinding>
11        <binding name="customBinding">
12          <binaryMessageEncoding/>
13          <tcpTransport />
14        </binding>
15      </customBinding>
16    </bindings>
17</system.serviceModel>
18</configuration>
  用户定义绑定
  绑定可以完全使用代码或配置文件定义或者它们可以通过继承自Binding类来创建。这种类型的绑定被称为用户定义绑定。你仍然需要为你的绑定确定绑定元素。
  一个自定义绑定和一个用户定义绑定间的基本不同是用户定义绑定是一个类的特殊实例,它执行了你创建一个绑定时的所有操作。如果你打算在很多应用中重用你的 绑定那么它是首选。如果你选择使用这个途径,作者强烈建议用户定义绑定支持使用一个绑定扩展创建的能力。一个绑定扩展通过配置文件暴露一个绑定类。创建一 个新类通过继承System.ServiceModel.Configuration命名空间里的 BindingElementExtensionElement类实现。
  提示 为你的自定义绑定提供一个绑定扩展
 严肃的考虑一下使用一个绑定扩展而不是<customBinding>配置元素来暴露你的自定义绑定。这将有助于帮助避免配置文件中的错误以及相关错误。


 

==========

转载自

作者: DanielWise
出处: http://www.cnblogs.com/danielWise/
 

转载于:https://www.cnblogs.com/llbofchina/archive/2011/06/29/2093031.html

相关文章:

  • 健康小常识
  • 似水流年 ? Chrome调试大全
  • 关于gulp复制文件时把整个目录结构都复制的问题解决
  • java 求集合真子集_高中数学第2讲:子集与并集
  • 网线传输速度测试_如何鉴定网线好坏?怎样测网线电阻?
  • 展示 用户画像_智能时代如何做好精准营销?从用户画像智能化开始
  • centos 一键安装ftp 配置_CentOS6一键安装vsftp脚本
  • ribbon基于接口配置超时_feign的ribbon超时配置和hystrix的超时配置说明
  • 怎么把好几行弄成一行_怎么在word文档里把很多行一下合并成一行
  • controller不跳转页面的几个原因_为什么很多人30岁了,还不结婚,有这几个原因...
  • clob存base64文件存不进去_cephfs:文件的扩展属性xattr
  • 山地车中轴进水表现_求山地自行车各部位上油的方法。特别是中轴和花鼓
  • matlab建立ar时间序列模型_请教matlab下建立AR模型的问题(附代码)
  • jpg图片使用pil的resize后_Python Pillow 和 cv2 图片 resize 速度的比较
  • 小白学vb还是python_小白学 Python(6):基础运算符(下)
  • 4. 路由到控制器 - Laravel从零开始教程
  • es6
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Javascript Math对象和Date对象常用方法详解
  • LintCode 31. partitionArray 数组划分
  • passportjs 源码分析
  • Vue 动态创建 component
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 观察者模式实现非直接耦合
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 深入浏览器事件循环的本质
  • 提醒我喝水chrome插件开发指南
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用Visual Studio开发以太坊智能合约
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 大数据全解:定义、价值及挑战
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​力扣解法汇总946-验证栈序列
  • #include
  • $.ajax()方法详解
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)UDP基本编程步骤
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)四层和七层负载均衡的区别
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .bat批处理出现中文乱码的情况
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET 使用配置文件
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET命令行(CLI)常用命令
  • /boot 内存空间不够