最近在做区域医疗中PIX时, 需要让PIX Manager同时支持HL7的V2和V3版本。思路是利用WCF来同时支持V2版本的c/s架构式的消息协议和V3版本WebService的Soap协议。

 实现步骤

1.发现WCF默认不支持原始字节流传输, 即访问WCF的Server端的消息都已被MSFT封装(内部是xml),即使用各种MessageEncoder也不可以, WCF会把需要传输的数据封装到xml的body部分。
2.经过试验, 想要实现传输原始字节流, 从下到上必须实现自定义IChannel,自定义ChannelBase,自定义RequestContext,自定义Listener和Factory,自定义TransportBindingElement,自定义MessageEncoder,自定义MessageEncoderFactory,自定义MessageEncoderBindingElement, 自定义Binding,以上部分组合即可以实现Channel级接受原始数据。
3.如果想要把自定义Channel的实现封装成Endpoint, 还需要实现ChannelDispatcherBase和ServiceHostBase
4.如果WCF宿主在Windows服务或者IIS中,还需要实现ServiceHostFatoryBase

实现过程中需要注意几点:
1.默认Channel都是Message结构, 即WCF封装的消息结构,无法接受原始数据流, 因此必须实现自定义Channel。
2.如果实现自定义Channel,则默认的Endpoint不支持此Channel, 因为ServiceHost内部默认调用DispatcherBuilder 的 GetSupportedChannelTypes, 此方法返回默认的几个Channel, 比如IReplyChannel,IRequestChannel,IInputChannel等等。
3.可以利用Behavior来对Service,Endpoint,Contract等等各个级别进行过滤, 需要利用MessageFilter
4.使用Behavior时, 在调用Service的Open方法之前加入。
5.在实现ServiceHostBase时,重载的CreateDescription必须返回新的ServiceDescription。另外out IDictionary<string, ContractDescription> implementedContracts 的输出参数也必须实现, 基本思路就是根据要加入的Service类型,反射后得到利用ContractDescription.GetContract得到Service声明的接口的各个ContractDescription,然后添加到字典里。字典的key为ContractDescription.ConfigurationName
6.在实现ServiceHostBase时, 构造里必须调用InitializeDescription(new UriSchemeKeyedCollection(baseAddresses));, 不然后续的AddServiceEndpoint会失败。
7.自定义实现的此原始Socket数据流Channel的ServiceHost可能和其他的默认ServiceHost有冲突, 无法共存, 即此ServiceHost只能监听自定义Channel而无法初始化默认Channel的BuildChannelListener。 解决办法是:(1)创建2个ServcieHost, 比如PIX,一个ServiceHost支持V2,另一个支持V3. (2)就是在ServiceHost的InitializeRuntime里调用Base.InitializeRuntime,但是由于此方法会把Endpoints里的所有channel都初始化,而系统不支持其他自定义Channel接口,导致初始化失败。使用此方法时就需要把自定义channel的endpoint放到最后调用AddServiceEndpoint。然后在出现异常时, 主动调用自定义Binding的BuildChannelListener,然后通过自定义ChannelDispatcher,把Listener放到ServiceHost里。
8.在实现自定义ChannelBase时, 内部使用TcpListener和TcpClient来接受Client发来的请求,然后利用NetworkStream来解析byte数组。BufferManager来负责数据的缓冲区。
9.实现自定义Router时, 即把接受字节流路由到对应方法时, 可以根据自己业务规则, 解析字节流, 然后根据ServiceHost.Description.Endpoints的ContractDescription.Operations获取对应方法后, 调用传参。

参考链接:
9.通用的自定义ChannelBase如何实现:http://www.cnblogs.com/artech/archive/2008/07/09/1238626.html

WCF知识点(应用WCF支持原生Socket访问, 原始字节流传输)的更多相关文章

  1. Nginx集群之WCF分布式身份验证(支持Soap)

    目录 1       大概思路... 1 2       Nginx集群之WCF分布式身份验证... 1 3       BasicHttpBinding.ws2007HttpBinding. 2 4 ...

  2. [WCF编程]1.WCF入门示例

    一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...

  3. 【WCF】利用WCF实现上传下载文件服务

    引言     前段时间,用WCF做了一个小项目,其中涉及到文件的上传下载.出于复习巩固的目的,今天简单梳理了一下,整理出来,下面展示如何一步步实现一个上传下载的WCF服务. 服务端 1.首先新建一个名 ...

  4. WCF入门一[WCF概述]

    一.什么是WCF WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架.它使得开发者能够建立一个跨平台的.安全.可信赖.事务性的解决方案,且能与已有系统兼容协作 ...

  5. 【WCF】基于WCF的在线升级

    一.前言       前不久因公司产品需要完成了在线升级功能,因为编程技术不精,不敢冒然采用Socket方法实现在线升级,所以使用比较方便稳妥的WCF方式 如果考虑并发能力的话还是Socket> ...

  6. WCF服务与WCF数据服务的区别

    问: Hi, I am newbie to wcf programming and a little bit confused between WCF Service and WCF Data  Se ...

  7. 让ie6 7 8 9支持原生html5 websocket

      让ie6 7 8 9支持原生html5 websocket   从github上的 web-socket-js(socket.io好像也是用这个做的他们的flash替代传输方式)改过来的.不过值得 ...

  8. 用原生socket发送HTTP数据包

    分享一个写扫描器和POC时的小技巧. 有时候有的漏洞需要一些特殊的数据包,比如说畸形的HTTP头.畸形的Multipart.畸形的chunk包等,此时用编程语言自己的HTTP库可能构造不出这种数据包, ...

  9. memcached基于socket访问memcache缓存服务器

    memcached基于socket访问memcache缓存服务器 操作memcache常用三种方法: .memcache基于php_memcache.dll扩展(php扩展) .memcached基于 ...

随机推荐

  1. Android----SharedPreferences(存储数据)

    SharedPreferences详解 我们在开发软件的时候,常需要向用户提供软件参数设置功能,例如我们常用的微信,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存,如果是在windo ...

  2. 机器学习实战之SVM

    一引言: 支持向量机这部分确实很多,想要真正的去理解它,不仅仅知道理论,还要进行相关的代码编写和测试,二者想和结合,才能更好的帮助我们理解SVM这一非常优秀的分类算法 支持向量机是一种二类分类算法,假 ...

  3. 转载 -- 基于原生JS与OC方法互相调用并传值(附HTML代码)

    最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点就是方法的互相调用而已. 本文叙述下如何进行原生的JavaScript交互 本 ...

  4. Navicat Premium创建事件计划调用MySql存储过程

    1.检查事件计划,操作:工具——命令行界面——执行命令 show variables like '%event_scheduler%'; (分号不能丢)—— event_scheduler  ON 表 ...

  5. BZOJ 1597: [Usaco2008 Mar]土地购买 斜率优化

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MB Description 农夫John准备扩大他的农场,他正在考虑N ...

  6. 【spring配置】——spring整合Quartz定时器

    第一种:为普通java类中的某个方法配置跑批任务 MethodInvokingJobDetailFactoryBean CronTriggerBean SchedulerFactoryBean 1.定 ...

  7. 九度OJ 1008:最短路径问题 (最短路)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8064 解决:2685 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费 ...

  8. 九度OJ 1082:代理服务器 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1871 解决:574 题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务器的IP地 ...

  9. 【题解】HNOI2013比赛

    [题解][P3230 HNOI2013]比赛 将得分的序列化成样例给的那种表格,发现一行和一列是同时确定的.这个表格之前是正方形的,后来长宽都减去一,还是正方形.问题形式是递归的.这就启示我们可以把这 ...

  10. 【C语言天天练(十)】结构体

    引言:数据常常以成组的形式存在.在C中,使用结构能够把不同类型的值存放在一起. 结构的声明有两种 1.struct SIMPLE{ int a; char b; float c; };然后用标签SIM ...