CN103793227B - 一种实现wcf服务的方法 - Google Patents
一种实现wcf服务的方法 Download PDFInfo
- Publication number
- CN103793227B CN103793227B CN201410031363.1A CN201410031363A CN103793227B CN 103793227 B CN103793227 B CN 103793227B CN 201410031363 A CN201410031363 A CN 201410031363A CN 103793227 B CN103793227 B CN 103793227B
- Authority
- CN
- China
- Prior art keywords
- service
- wcf
- interface
- contract
- net
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 31
- 230000007246 mechanism Effects 0.000 claims abstract description 5
- 238000004891 communication Methods 0.000 abstract description 20
- 238000005516 engineering process Methods 0.000 abstract description 5
- 239000003795 chemical substances by application Substances 0.000 description 6
- 230000006399 behavior Effects 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 3
- 101000680095 Homo sapiens Transmembrane protein 53 Proteins 0.000 description 2
- 102100022244 Transmembrane protein 53 Human genes 0.000 description 2
- 239000000344 soap Substances 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 238000001028 reflection method Methods 0.000 description 1
Landscapes
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
- Computer And Data Communications (AREA)
Abstract
本发明公开了一种实现WCF服务的方法,属于数据通信技术领域。该方法利用.NET的动态类型创建机制,动态生成代理类型,通过代理类型实现WCF支持的各种服务。与现有技术相比,本发明的实现WCF服务的方法对业务组件代码“零侵入”,可以大大提高业务组件的复用能力,具有很好的推广应用价值。
Description
技术领域
本发明涉及一种数据通信技术领域,具体地说是一种实现WCF服务的方法。
背景技术
Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口。
WCF是.NET框架的一部分,由 .NET Framework3.0 开始引入。在 .NETFramework2.0 以及前版本中,微软发展了 Web Service (SOAP with HTTPcommunication),.NET Remoting (TCP/HTTP/Pipeline communication) 以及基础的Winsock 等通信支持。由于各个通信方法的设计方法不同,而且彼此之间也有相互的重叠性(例如 .NET Remoting 可以开发 SOAP, HTTP 通信),对于开发人员来说,不同的选择会有不同的程序设计模型,而且必须要重新学习。同时,面向服务架构(Service-OrientedArchitecture) 也开始盛行于软件工业中,因此微软重新查看了这些通信方法,并设计了一个统一的程序开发模型,对于数据通信提供了最基本最有弹性的支持,这就是 WindowsCommunication Foundation。
WCF实际上是构建了一个框架,这个框架实现了在互联系统中各个Application之间如何通信。使得开发人员和架构师在构建分布式系统中,无需在考虑如何去实现通信相关的问题,更加关注于系统的业务逻辑本身。而在WCF Infrastructure中,各个Application之间的通信是由Endpoint来实现的。Endpoint包含以下4个对象:
Address: Address通过一个URI唯一地标识一个Endpoint,并告诉潜在的WCFservice的调用者如何找到这个Endpoint。所以Address解决了Where to locate the WCFService?
Binding: 一个Binding包含着丰富的信息,每种信息都描述了服务端和客户端交互过程中的一方面,
层次 | 备注说明 |
Transactions(事务) | TransactionFlowBindingElement,用于指定事务流程 |
Reliability(信赖) | ReliableSessionBindingElement,用于指定对会话方式 |
Security(安全) | SecurityBindingElement,指定安全方式 |
Encoding(编码) | Text, Binary, MTOM, Custom,指定数据传输格式 |
Transport(传输) | TCP, Named Pipes, HTTP, HTTPS, MSMQ, Custom,指定传输方式 |
如上表所示,Binding描述了这些层面的信息。
WCF 的基本概念是以契约(Contract) 来定义双方沟通的协议,契约必须要以接口的方式来体现,而实际的服务代码必须要由这些契约接口派生并实现。契约分成了四种:数据契约(Data Contract),订定双方沟通时的数据格式;服务契约(Service Contract),订定服务的定义;操作契约(Operation Contract),订定服务提供的方法;消息契约(Message Contract),订定在通信期间改写消息内容的规范。
Behavior: Behavior的主要作用是定制Endpoint在运行时的一些必要的Behavior。比如Service 回调Client的Timeout;Client采用的Credential type;以及是否支持Transaction等。
WCF 由于集合了几乎由.NET Framework 所提供的通信方法,因此学习曲线比较陡峭,开发人员必须要针对各个部份的内涵做深入的了解,才能够操控 WCF 来开发应用程序。除此之外,随着版本的演进,WCF对最新技术的支持方式也在不断修正和改进。譬如:从.NET4才提供WebScriptServiceHost,用来简化支持Ajax调用的Web服务的开发;
而在.NET4之前,可能需要采用上表中在实现类上标记AspNetCompatibilityRequirements属性的方式开发兼容Ajax调用的Web服务。
由前面对WCF基础框架的分析可见,开发人员无法只关注系统的业务逻辑本身,还是必须要关注很多技术细节,还要随着WCF的不断演进,有可能随时调整自己的代码,重新编译,发布业务组件的新版本。这带来了巨大的重复工作量,影响了软件系统的开发效率和系统稳定性。
下面以一个简单的WCF例子说明WCF开发的基本模式。
第一步 定义契约接口
如上表引用WCF的名字空间System.ServiceModel,并在接口上注明[ServiceContract]。
第二步 实现服务
如上表代码所示,写一个实现了契约的C#类。
第三步 配置ServiceHost
配置方法如上表所示。
由上述步骤可以很明显的感受到即使一个最简单的HelloWorld程序也需要开发人员了解WCF的很多知识点,并且开发人员的业务代码被WCF的属性标记“污染”。
发明内容
本发明的技术任务是针对上述现有技术的不足,提供一种实现WCF服务的方法。利用这种方法,开发人员完全不用了解WCF的技术细节,就可以把自己的业务代码发布为“服务”,开发人员编写的业务代码完全不依赖WCF运行时。
本发明的技术任务是按以下方式实现的:一种实现WCF服务的方法,其特点是利用.NET的动态类型创建机制,动态生成代理类型,通过代理类型实现WCF支持的各种服务。
动态生成代理类型的创建基于规则匹配,特定业务组件增加代理类型的特定属性标记,以实现WCF服务的特殊控制。
上述方法具体包括以下步骤:
(一)实现一个SOA服务框架:Portable Service,包含业务逻辑代码的简单.NET对象通过Portable Service发布为服务;
(二)当服务被初次调用时,Portable Service根据配置自动查找服务对应的简单.NET对象,并根据约定查找简单.NET对象实现的接口,把查找到的接口作为模板,动态创建一个WCF契约接口;
(三)Portable Service把上步骤(二)的简单.NET对象作为父类,自动创建一个实现了契约接口的服务反向代理类,所述服务反向代理类对服务契约的实现完全调用父类的业务逻辑代码;
(四)Portable Service创建WCF的ServiceHost,并使用动态创建的WCF契约接口和服务反向代理类来装配WCF的EndPoint,建立了EndPoint后,即可对外提供服务。
通过简单接口调用WCF服务:根据简单接口创建WCF契约接口,通过契约接口类型创建调用管道,然后再使用接口代理合并技术,把契约接口和简单接口合并到一个代理对象中。
上述方法实现过程如下:首先,实现一个轻量级的SOA服务框架:PortableService。Portable Service 是一个通讯服务框架,是一个服务容器。包含业务逻辑代码的“简单.NET对象”(即PONO,.NET借鉴Java中POJO术语,用PONO表示简单业务逻辑对象)通过Portable Service可以发布为服务。通过Portable Service发布的服务完全符合WCF技术规范。当服务被初次调用时,Portable Service会根据配置自动查找“服务”对应的“简单.NET对象”,并根据约定查找“简单.NET对象”实现的接口,把查找到的接口作为模板,动态创建一个WCF契约接口。接下来,Portable Service把上一步的“简单.NET对象”作为父类,自动创建一个实现了契约接口的类。这个派生的类,我们称之为“服务反向代理类”。“服务反向代理类”对服务契约的实现完全调用父类的业务逻辑代码。Portable Service然后创建WCF的ServiceHost,并使用动态创建的契约接口和“服务反向代理类”来装配WCF的EndPoint。建立了EndPoint后,就可以对外提供“服务”了。服务发布后,客户端就可以像调用普通的WCF服务一样去调用它。Portable Service还提供了一个调用服务的透明“管道”,使用这个管道,开发人员的代码就不需要依赖WCF的类库。
本发明的实现WCF服务的方法与现有技术相比具有以下突出的有益效果:
(一)对业务组件代码“零侵入”,一套业务组件就可以通过本方法支持多种服务架构,大大提高业务组件的复用能力;
(二)有别于常见的弱类型反射调用方式,该方法完全支持强类型参数;
(三)开发人员的代码不需要依赖WCF的类库,可以使用简单对象接口调用WCF服务。
附图说明
附图1是本发明方法的Portable Service动态类型技术原理图。
具体实施方式
参照说明书附图以具体实施例对本发明的实现WCF服务的方法作以下详细地说明。
实施例:
如附图1所示,本发明的实现WCF服务的方法利用.NET的动态类型创建机制,动态生成代理类型,通过代理类型实现WCF支持的各种服务。
其实现方案包含三部分:1) 动态类型创建器 2) 服务宿主工厂(PortableServiceHostFactory) 3)动态服务调用管道
1、动态类型创建器
动态类型创建器是一个工具类,它利用ILGenerator和TypeBuilder在内存中动态创建“服务反向代理类”,
创建的过程如上述伪代码所示。
动态类型创建器在内存中创建一个模块,接着配置TypeBuilder,然后调用typeBuilder.CreateType()创建代理类。
配置TypeBuilder的关键步骤是为类型标记上WCF的契约属性,从而创建出符合WCF契约规范的类型,如上表所示。
除标注WCF契约必须的属性外,Portable Service还支持根据配置标注扩展的属性。Portable Service内部实现了一个以容器“Box”为单位的匹配机制。可以把属性标记动态标注在类或者方法上。
如上表所示,在“规则盒”PortableSvcBox.Ajax中登记了webinvoke和ajaxAttribute两个动态属性。符合规则ruleAjax 的类型的反响代理类会被标注上ajaxAttribute所描述的属性。
有了这条动态标注属性的规则,就可以精细化控制“服务反向代理类”的创建,以满足特定的需求场景。
2、服务宿主工厂(PortableServiceHostFactory)
服务宿主工厂(PortableServiceHostFactory)负责服务的初始。业务组件在Portable Service中部署发布后,初次调用服务时,PortableServiceHostFactory派生自ServiceHostFactory,重写CreateServiceHost方法,调用 PortableServiceTypeResolver的ResolveType方法得到“服务反向代理类”的类型实例,如上表所示。
3、动态服务调用管道
Portable Service发布的服务兼容标准WCF服务,客户端可以采用标准的WCF服务调用方式。但是这种方式需要显式引用WCF的运行时。Portable Service还提供了一种更为简单的方式:动态服务调用管道。动态管道的使用方式与WCF的管道非常相似。区别在于WCF管道必须使用WCF契约接口初始化,而动态管道使用简单接口即可。
Portable Service中的工具类PortableChannelFactoryHelper创建动态调用管道。PortableChannelFactoryHelper的基本原理是根据简单接口为模板动态生成一个临时的WCF契约,但这个契约接口与模板接口没有派生关系,只是接口名称和方法签名一致。内部实现了一个“自定义管道工厂 ”。“自定义管道工厂 ”可以使用临时生成的WCF契约创建一个通信管道。这个通信管道与模板接口没有直接关系,所以还必须创建一个实现了模板接口和临时契约接口的“管道代理器”,这样就可以使用简单对象接口调用管道的服务了,
关键伪代码如上表。
下面以某HR系统用于员工查询的业务组件为例,详细描述本发明方法的实现过程。
开发人员首先定义组件接口IHRBizObject
定义方法如上表所示。
开发人员实现该业务组件
实现方法如上表所示。
开发人员完成上述代码后,就完成了编码工作。很明显,开发人员完全不用了解WCF的任何知识。
然后开发人员只需编写一个文本文件,扩展名为svc。把文件放到PortableService的WCF服务目录下即可的,
文本文件内容如上表所示。
做完上述三步后,服务端的编码就全部完成了,开发人员没有接触WCF的任何知识。接下来是客户端使用Portable Service的步骤,
客户端的代码如上表所示。
从本例看,可以确定从服务端到客户端,Portable Service都对WCF进行了透明封装,使开发人员的代码与WCF运行时框架完全解耦。开发人员可以只关注业务逻辑的实现了。
Claims (2)
1.一种实现WCF服务的方法,其特征在于:利用.NET的动态类型创建机制,动态生成代理类型,通过代理类型实现WCF支持的各种服务,动态生成代理类型的创建基于规则匹配,特定业务组件增加代理类型的特定属性标记,以实现WCF服务的特殊控制,包括以下步骤:
(一)实现一个SOA服务框架:Portable Service,包含业务逻辑代码的简单.NET对象通过Portable Service发布为服务;
(二)当服务被初次调用时,Portable Service根据配置自动查找服务对应的简单.NET对象,并根据约定查找简单.NET对象实现的接口,把查找到的接口作为模板,动态创建一个WCF契约接口;
(三)Portable Service把上步骤(二)的简单.NET对象作为父类,自动创建一个实现了契约接口的服务反向代理类,所述服务反向代理类对服务契约的实现完全调用父类的业务逻辑代码;
(四)Portable Service创建WCF的ServiceHost,并使用动态创建的WCF契约接口和服务反向代理类来装配WCF的EndPoint,建立了EndPoint后,即可对外提供服务。
2.根据权利要求1所述的实现WCF服务的方法,其特征在于,通过简单接口调用WCF服务:根据简单接口创建WCF契约接口,通过契约接口类型创建调用管道,然后再使用接口代理合并技术,把契约接口和简单接口合并到一个代理对象中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410031363.1A CN103793227B (zh) | 2014-01-23 | 2014-01-23 | 一种实现wcf服务的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410031363.1A CN103793227B (zh) | 2014-01-23 | 2014-01-23 | 一种实现wcf服务的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103793227A CN103793227A (zh) | 2014-05-14 |
CN103793227B true CN103793227B (zh) | 2018-03-13 |
Family
ID=50668944
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410031363.1A Active CN103793227B (zh) | 2014-01-23 | 2014-01-23 | 一种实现wcf服务的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103793227B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104486382B (zh) * | 2014-11-27 | 2017-09-22 | 珠海格力电器股份有限公司 | 一种wcf双工通信服务的创建方法及系统 |
CN108494606B (zh) * | 2018-04-19 | 2020-12-15 | 四川师范大学 | 一种基于wcf技术的数据服务框架搭建方法 |
CN108965375B (zh) * | 2018-05-21 | 2021-04-20 | 创新先进技术有限公司 | 服务调用代理控制系统、方法、服务器及可读存储介质 |
CN115914232A (zh) * | 2022-12-14 | 2023-04-04 | 四川师范大学 | 一种不动产数据混合存储服务建立方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101551742A (zh) * | 2008-03-31 | 2009-10-07 | 上海宝信软件股份有限公司 | 辅助构建面向服务应用系统的向导组件 |
CN101847100A (zh) * | 2010-06-08 | 2010-09-29 | 用友软件股份有限公司 | 扩展软件应用的方法和装置 |
CN102750145A (zh) * | 2012-06-05 | 2012-10-24 | 怯肇乾 | 一种网络系统软件体系框架及其实现方法 |
CN102789382A (zh) * | 2012-06-28 | 2012-11-21 | 用友软件股份有限公司 | 用于表单生成和运行的系统及方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8862975B2 (en) * | 2011-09-19 | 2014-10-14 | Microsoft Corporation | Web-based workflow service visualization and navigation |
-
2014
- 2014-01-23 CN CN201410031363.1A patent/CN103793227B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101551742A (zh) * | 2008-03-31 | 2009-10-07 | 上海宝信软件股份有限公司 | 辅助构建面向服务应用系统的向导组件 |
CN101847100A (zh) * | 2010-06-08 | 2010-09-29 | 用友软件股份有限公司 | 扩展软件应用的方法和装置 |
CN102750145A (zh) * | 2012-06-05 | 2012-10-24 | 怯肇乾 | 一种网络系统软件体系框架及其实现方法 |
CN102789382A (zh) * | 2012-06-28 | 2012-11-21 | 用友软件股份有限公司 | 用于表单生成和运行的系统及方法 |
Non-Patent Citations (1)
Title |
---|
Mocking a Wcf ServiceContract;larsw;《https://stackoverflow.com/questions/2855535/mockingawcfservicecontract》;20100518;第1页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103793227A (zh) | 2014-05-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100545851C (zh) | 使用命令行环境的远程系统管理 | |
CN101694618B (zh) | 适用于ajax框架的模型层与视图层数据自动映射方法 | |
US9501267B2 (en) | Generating a service component architecture (SCA) module with service oriented architecture (SOA) model elements | |
CN102375731B (zh) | 一种免编码集成应用软件平台系统 | |
US8448132B2 (en) | Systems and methods for modifying code generation templates | |
CN103793227B (zh) | 一种实现wcf服务的方法 | |
CN101593111A (zh) | 一种业务组件及基于业务组件的应用软件开发方法和系统 | |
CN104317591A (zh) | 一种基于OSGi的web界面框架系统及web业务处理方法 | |
CN104050261A (zh) | 基于Storm的可变逻辑的通用数据处理系统及方法 | |
CN105512304A (zh) | 在线生成互联网应用方法和系统集成方法及支撑平台 | |
CN101976199A (zh) | 面向对象的中间件分布式系统开发平台 | |
CN110764752A (zh) | 基于微服务架构实现Restful服务图形化服务编排的系统及其方法 | |
CN102662656A (zh) | 一种程序结构插件化方法及系统 | |
US20060020948A1 (en) | Real-time multi-modal business transformation interaction | |
JP2011512592A (ja) | 製造現場のサービス指向オートメーション・コンポーネントを柔軟性のあるitコーポレート・アーキテクチャへ取り入れるための方法およびシステム | |
CN105306542A (zh) | 一种用于集成Web服务的系统 | |
Evers et al. | Towards a reference architecture for model-driven business apps | |
CN103870280A (zh) | 基于flex与jsp的网页无缝结合处理方法 | |
CN103971225A (zh) | 一种工作流动态扩展方法及系统 | |
D'Ambrogio et al. | A Model Transformation Approach for the Development of HLA-based Distributed Simulation Systems. | |
CN115801882A (zh) | 旧线系统与微服务系统间信息交互方法和装置 | |
CN106844156B (zh) | 智能建筑综合管理平台系统中wcf通信消息拦截方法 | |
US10157360B1 (en) | Smart bricks information system | |
Zúñiga-Prieto et al. | An incremental and model driven approach for the dynamic reconfiguration of cloud application architectures | |
US20050261918A1 (en) | Business protocol policy injection |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information | ||
CB02 | Change of applicant information |
Address after: 250100 Ji'nan high tech Zone, Shandong, No. 1036 wave road Applicant after: Langchao General Software Co., Ltd Address before: 250101 Shandong Province, Ji'nan City hi tech Development Zone, Nga Road No. 1036 Applicant before: Shandong Universal Software Co., Ltd., Langchao Group Corp. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |