1、 第 1 页 /共 31 页扩展性、外接接口、第三方接口指南版本:V1.0指定人:向延楷第 2 页 /共 31 页目录1.软件扩展性 .31.1 产生软件扩展性需求的原因 .31.2 可扩展性研究背景 31.3 可扩展性研究内容 .41.3.1 灵活的可扩展的体系结构 .41.3.2 灵活的设计 .51. 4 可扩展性解决方案 .71. 4. 1 SABEA 的层次结构 81. 4. 2 体系结构的特点 .91. 5 总结 .102.外接接口 .112. 1 引入外接接口的概念 .112. 2 如何选用外接接口 .112.2.1 JS 外接接口方式说明和优缺点 .112.2.2 HTTP 外接
2、接口方式说明和优缺点 122.2.3 WEB SERVICE 外接接口 122. 3 使用 WEB SERVICE 外接接口的优点 132. 4 当前系统已实现的外接接口 .142.4.1 一诚通接口实现规范 .142.4.2 三统一推接口实现规范 .183. 第三方接口指南 .203.1 联网接口定义 203.2 联网接口开发示例 20第 3 页 /共 31 页1.软件扩展性当前旅游电子门票业务的飞速发展促使我们必须通过开发具有良好可扩展性、伸缩性,易维护性的软件,迅速高效的满足客户复杂的需求。而对于当前业务的丰富程度及更新频率来讲,现在我们的客户由传统由门票站慢慢向小型媒体、门户查询网站等
3、多元化发展。所以我们所希望的系统应该这样的:在业务初期业务量较小的时候,可以用一个处理能力相当的系统来实现,对于以后日益增长的当业务量,又可以通过软件系统的扩展,提高处理能力,满足新的需求。并且在几乎不改变之前的代码基础上能较容易的添加新的功能,并且尽可能小的影响原有系统的业务逻辑。所以本系统依据当前需求的特征,定位于一个开放式、高可用、高扩展性的复杂应用系统。1.1 产生软件扩展性需求的原因一般人会觉得简单的系统比复杂的系统易于建造,易于维护,短小而且运行更快。但实际上简洁性的程序通常并不是容易达到的目标,因为团队在开发系统时更倾向于在程序中支持可能在未来才会存在的需求,这就使得系统变得复杂
4、且管理困难。然而,因为觉得未来可能会发生什么变化而使代码变得复杂并不是一个好的决策。所以新的开发理念营运而生,我们在编写程序时应该使程序在未来易于添加新的功能或修改现有的功能,而不是现在就增加这些功能。因此与其一开始就建造一个复杂的系统,不如考虑开发出一个具有高扩展性的系统,即便之后的业务再复杂也可以方便在缘由基础上进行拓展。 1.2 可扩展性研究背景 可扩展性是指软件扩展新功能的容易程度。可扩展性越好,表示软件适应“变化”的能力越强。可扩展性是由现代软件的商业模式决定的: (1) 社会的商业越发达,需求变化就越快。需求变化必将导致修改(或者扩展)软件功能,现代软件的规模和复杂性要比十年前的大
5、得多(对比一下操作系统的变化就明白了) ,如果软件的可扩展性比较差的话,那么修改(或者扩展)功能的代价会很高。 (2) 现代软件产品通常采用“增量开发模式” ,开发商不断地推出软件产品的新版本,从而不断地获取增值利润。如果软件的可扩展性比较差的话,每次开发新版本的代价就会很第 4 页 /共 31 页高。所以具有良好可扩展性的系统绝不是仅仅将新的功能加入系统而不考虑其它方面。具有良好可扩展性的系统要具备以下特性:(1) 方便地添加新功能。(2) 扩展后新旧系统之间具有良好的集成性。 (3) 扩展后系统仍能满足业务要求的性能,如及时性,可靠性等。(4) 安全性得到满足。由于扩展过程中很容易产生安全
6、问题,因此扩展过程中要有良好的安全解决方案。(5) 能够进行低成本扩展。 而一个具有可扩展的系统应该具备以下条件: (1) 有灵活的可扩展的体系结构作指导。(2) 采用灵活的设计。(3) 编写的代码具有可扩展性。 1.3 可扩展性研究内容 1.3.1 灵活的可扩展的体系结构 目前软件领域存在着面向过程,面向对象,面向服务三个主要的体系结构。就扩展性而言它们之间是一种逐渐灵活的关系。 (1) 面向过程是一种以事件为中心的编程思想,首先分析出解决问题的步骤,然后采用函数逐步调用实现的方式。使用这种体系结构,系统一旦做出修改则“牵一发而动全身” ,扩展性极差。(2) 面向对象技术是目前非常流行的方式
7、。它把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。它强调对象的“抽象” 、 “封装” 、 “继承”和“多态” ,以重用性、灵活性和扩展性为主要目标。随着面向对象技术的发展,又催生了基于对象的组件体系结构。在组件开发中,需要进行接口设计,这样软件实体就可以实现和公开其定义的关键部分。上述提到的抽象,封装,继承,多态,接口,组件都是利于扩展的概念和技术。另外还有一个与可扩展性相关的概念:面向切面的编程(AOP) 。面向方面本质上就是满足扩展的需求,可以在程序中自由扩展功能。如果说面向对象是纵向地分析、切割整个系统,那么可以认为
8、AOP 是横向地对系统作切片。面向方面可以弥补面向对象的缺陷,两种方式有机的结合在一起,可以更加有效地对系统进行分析。 (3)SOA 由一系列相互交互的服务组成,描述了服务之间的交互,并将服务映射到一个或多个具体技术的实现。面向服务是系统发布功能的一种方式,利用 Web Service 技术实现不同系统间有效地通信和协作。由于 Web Service 的平台中立性和语言中立性使得跨平台的第 5 页 /共 31 页互操作和系统的整合更加容易,因此与基于组件的架构模式相比,SOA 最大的优势在分布式环境领域。SOA 与传统软件结构的比较如下表所示:从上表中的对比中我们发现 SOA 面向流程,以业务
9、为中心,松耦合这些特性都支持系统的可扩展性。面向流程与面向对象的根本区别不仅仅是运营流程的不同,更重要的在于维系企业的基本结构不同。在一个以业务流程为中心的企业中,企业的基本组成单位是不同的业务流程,不存在刚性的部门,甚至业务流程本身也不是刚性的,而是随着市场的变化可以随时增减改变的;SOA 的显著特点是采用松耦合,对于组成整个应用程序的每个服务的内部结构和实现发生的逐渐的改变能够灵活适应,增强了系统的可扩展性。 通过上述分析面向服务的体系结构的优势是比较明显的。这种软件开发的理念值得推广,而且已经得到应用。SOA 更多的是涉及到系统的外部,简单地说就是发布功能。它并不关注系统内部结构的实现,
10、所以说面向服务与面向对象并不冲突,系统内部结构完全可以采用基于对象组件的软件体系结构。如果把 SOA 和面向对象的理念(而不是完全照搬和使用)灵活应用于以后的开发设计中,将会帮助我们设计出更加优秀的架构。1.3.2 灵活的设计正如上面所述 SOA 为应用的动态整合提供了一个非常好的思路,一个解决问题的方法。然而 SOA 也不是哪种情况都可以使用,下面总结了 4 种 SOA 不适用的场合: (1 )同构系统之间互联。(2 )实时、高性能的关键业务处理。(3 )系统架构不需要灵活性。(4 )紧耦合比松耦合的好处更多。 第 6 页 /共 31 页因此在针对要开发的系统时我们只需要借鉴 SOA 的先进
11、理念,而不需要完全照搬应套。下面针对 SOA 关键概念进行分析: 1服务本身的独立自主能力与服务之间的松耦合性 这是 SOA 的基本特征, SOA 非常强调架构中提供服务的功能实体的完全独立自主的能力。传统的组件技术一般采用宿主来存放和管理这些功能实体;当这些宿主运行结束时这些组件的寿命也随之结束。这样当宿主本身或者其它功能部分出现问题的时候,在该宿主上运行的其它应用服务就会受到影响。 在不同服务之间,SOA 要求保持一种松耦合的关系,也就是保持一种相对独立无依赖的关系。面向服务表示一种分离系统关注面的方法,其实质是将一个比较大的问题分解成一系列较小的、互相关联的子问题,从而降低问题的复杂度,
12、使得我们能够较从容地分析、解决和管理它。传统的面向对象的设计方法其实也是一种分离系统关注面的方法,只不过它是在对象层面来分离关注面,相对业务逻辑较远,而面向服务则是在服务层面来分离关注面,直接关注的是业务逻辑,从而使面向服务能够(至少在理论上 )更好地满足业务需求。 一个服务就是一个单独的代码模块。可以看到,SOA 的出现为企业系统架构提供了更加灵活的构建方式,如果企业架构设计师基于 SOA 来构建系统架构,就可以从底层架构的级别来保证整个系统的松耦合性以及可扩展性。 2构件技术 “基于构件技术提供网络服务”是 SOA 的重要思想起源,在 SOA 架构中,流动的应该是构件。没有构件化时,软件系
13、统的各个部分是紧密结合在一起的,因而会“牵一发而动全身” ,采用了构件化技术后,软件的各个功能模块就可以独立地实现、升级,而不会影响系统整体。基于构件的软件设计方法学把应用和实现分离,提供标准接口和框架,使软件开发变成构件的组合。基于构件的软件方法学是以接口为中心、面向行为、基于体系结构设计的,它要求:对构件要有明确的定义;用构件描述语言和规范,如 UML、微软 COM 构件技术中的 IDL、科泰世纪 CAR 构件技术的 CDL。 SOA 是一种基于对象的构件模型,它将不同的功能单元通过预先定义好的接口和契约联系起来。SOA 的构件模型决定了软件系统构架。在一个 SOA 系统中,提供具体服务的
14、是一个实现相应功能的构件。 作为面向服务的体系架构,当众多用户多次重用同一构件、或者需要在不同构件间进行互操作时,SOA 需要提供一套统一的软件标准或协议,这就是构件描述语言。 另外服务代表一段完整的业务单元,并且可以根据特定用户的需求组织成为更大和新的服务。服务可以由一个或多个构件组合而成。服务开发者必须考虑构件的粒度,以及构件的流程和组装,这样他们在改变服务的实现时,可以尽可能少的影响其它构件、应用和服务。而服务的设计者则更关心选择合适的服务,并将它们以可管理的方式组织,并最终将它们组装为完整的业务流程。第 7 页 /共 31 页3 编写的代码利于可扩展 随着需求的不断变更,开发者需要进行
15、大量的代码增删改等工作。为了提高工作效率,减少编码和测试时间,需要尽可能重用代码。设计模式主要在代码实现级别上有用,因此设计模式在你考虑代码实现时开始进入我们的视线。 设计模式是一种表达,记录和重用软件设计结构和设计经验的新方法,它描述了一个反复出现在特定设计语境中的特殊问题,并为问题的解决方法提供了一个经过充分验证的通用方式。一个软件设计模式一般包含如下信息: (1 )模式名称:每个模式必须有一个有意义的名称,用于简述模式的本质,可以通过模式名称来鉴别模式。(2 )问题:描述模式要解决的问题,即模式的意图或目标,它解释了设计问题和问题存在的前因后果,在特定的环境和使用动机下该模式所希望达到的
16、目标。(3 )语境:模式解决问题和解决方案出现的前提条件。(4 )解决方案:给出了模式的静态关系和动态规则,描述如何实现期待的结果,以指导构造,它明确说明了模式的结构,参与者和它们之间的协作关系。(5 )基本原理:给出模式中的执行步骤或规则的正确解释,说明模式如何解决其问题和实现其目标。(6 )效果:描述了模式应用的效果及使用模式应权衡的问题。 由于设计模式简化了软件的设计和实现过程,使软件系统的基础架构更加清晰;同时,设计模式可以直接用来指导面向对象系统中至关重要的建模问题,有效地处理需求变更,减少各类之间的耦合和依赖,为软件工程的应用和软件开发提供了良好的途径。 但是模式容易使代码复杂化,
17、而且没有严格的规则告诉我们什么时候使用模式比较好,它是一种直觉的判断。这种敏感来自于多年的经验,许多资历尚浅的设计人员/程序员不可能拥有。因此过多地使用设计模式将导致糟糕的程序,仅仅使用模式并不能确保成功,因此使用模式时需要慎重。1. 4 可扩展性解决方案 构建可扩展性系统的关键是系统架构具有灵活性、开放性和易配置性。这些特性具体体现在构建系统的各个功能部件之间合理的功能划分和相互之间松耦合的交互。针对以上分析,本文设计了一套解决方案,命名为基于 SOA 和设计模式的可扩展的体系结构(SOA and Design pattern Based Extensible Architecture,SA
18、BEA ) 。该框架以可扩展性为主要特征,实现处理逻辑之间灵活挂接和易配置,能够使服务随业务流程变化而快速适应,业务处理单元之间建立松耦合的交互关系,实现数据交换和服务的透明处理。 第 8 页 /共 31 页1. 4. 1 SABEA 的层次结构 SABEA 在整体设计上采用了分层的体系结构和 SOA 架构。本框架总体上分为 3 层:接入层;业务层和数据层。其结构如下图 1 所示:每一层都与相邻层保持松散耦合,都只通过定义明确的接口与其他层交互。每层的功能如下: 接入层:接入层包括第三方软件系统与系统自身之间的交互方式,交互平台以及业务逻辑组合。其主要责任是处理第三方软件客户需求,例如数据获取
19、,远程组件调用等、使得第三方系统对系统功能无缝接入。业务层:集中了系统的业务逻辑的处理,并以组件或接口进行发布,并为接入层提供调用服务的接口。 数据层:对业务层提供持久性机制。 第 9 页 /共 31 页1. 4. 2 体系结构的特点 1以服务为基础 SABEA 的核心功能是: (1) 用户的业务服务分解为基本服务的请求和对外公共服务业务。 (重点) (2) 服务的集成与组装。 (3) 服务的调用和执行。 服务作为本体系结构的基本单元,它是动态,可组合,可分解的。各个服务之间是一种互相包含,互相交叉的网状复杂结构。为了清楚地描述相互之间的关系,我们引入了子服务和元服务的概念。子服务是一个服务,
20、某个服务可以由多个子服务构成,也允许一个服务成为多个服务的子服务。我们将不可再分解的服务成为“元服务” 。因此元服务是系统中最基本的服务。实际上,判断一个服务是否为元服务是根据实际情况的变化而变化的,一个服务在某环境中可能是元服务,而在另一个环境中它可能还需要被继续分解。这完全取决于实际需要和服务粒度的划分。正是服务可以灵活的划分才能实现其体系结构和功能服务的可扩展性。 2以流程为中心 该体系架构的另一显著特点是以流程为中心。流程可以分解成一系列的步骤,每个步骤表示一个业务服务,即将服务看成流程的节点。第 10 页 /共 31 页1. 5 总结前面我们对系统扩展性进行了概括的讲解,通过产生对软
21、件扩展性的分析从而进一步研究其内容,最终产生了 SABEA 软件层次结构。就开发的目的来讲, 我们的软件也属于SABEA 范畴,该框架以优秀的扩展性为主要特征,在实现主要业务服务的同时也支持对第三方服务的无缝挂接,接下来我们会探讨在 SABEA 软件层次结构中接入层的如何挂接以及挂接的方式。第 11 页 /共 31 页2.外接接口2. 1 引入外接接口的概念在 SABEA 软件层次结构中,我们作为供应商提供第三方服务及作为客户去调用这些服务时,一般都是在接入层中进行。而如何使双方的服务无缝结合,这里就必须引入外接接口的概念。所谓外接接口,就是系统内部业务模型一种对外提供的方式,通过系统对外约定
22、的协议,第三方客户系统就可以间接调用系统组件及获取系统数据信息。外接接口设计在 Web 应用程序体系结构中扮演着最主要的角色。接口会随着时间而演变,接口变动时,负责不同层次工作的团队必须得进行协商,但是这些更改应该只牵涉到小部分当前开发的内容。在不会无意中破坏其他部分的情况下,我们能在单个层次内做的越多,生产效率就越高,灵活性也越高。2. 2 如何选用外接接口我们在开发软件初期, 曾经做过大量的试验来对比各个外接接口的调用方式,现以JS、HTTP、WEB SERVICE 三种外接接口的使用为例,总结如下:2.2.1 JS 外接接口 方式说明和优缺点对于所有外接接口类型来说,JS 外接接口是最“
23、经济”的,它不需要程序员要求很高的技术,并且本身不需要任何第三方库。而且对于浏览器来说,js 标签的 src 属性所指向资源就跟 img 标签的 src 属性所指向的资源一样,都是一个静态资源,浏览器会在适当的时候自动去加载这些资源,而不会出现所谓的跨域问题。这样我们就可以通过该属性将要访问的数据对象引用进当前页面而绕过 js 跨域问题。当然,前提是接口必须是返回一段 js 脚本,如一个 json 对象数组定义的脚本:modlist = “modname“: “mod1“, “usernum“: 200, “url“: “/widget/info/1“,“modname“: “mod2“, “
24、usernum“: 300, “url“ : “/widget/info/2“,第 12 页 /共 31 页;但 script 标签也有一定的局限性,并不能解决所有 js 跨域问题。script 标签的 src属性值不能动态改变以满足在不同条件下获取不同数据的需求,更重要的是,不能通过这种方式正确访问以 xml 内容方式组织的数据,当返回数据量比较大时,检索将非常困难,而且不易阅读。2.2.2 HTTP 外接接口方式说明和优缺点HTTP 外接接口在简单查询类业务业务运用的很广泛,如淘宝对快递公司快递单查询,在双方约定好访问协议地址之后,可在 IE 带上参数访问这个地址,就可以得到指定内容返回的
25、结果字符串(或 JSON 数据) ,例如访问 http:/地址:端口 /应用名称/getInfo.jsp?model=1928364021823name=amigo;room=407此接口并不是一劳永逸,虽然对安全性不是很高的情况下,此方法确实具有一定的可行性,但如果在金融和银行领域,试想黑客只要轻松通过穷举的方式得到用户的账号,就可以得到此账号里所有用户的信息,这样肯定是不合理的。2.2.3 WEB SERVICE 外接接口Web Service 是构建互联网分布式系统的基本部件, 它 是 一 个 应 用 程 序 , 它 向 外 界暴 露 出 一 个 能 够 通 过 Web 进 行 调 用
26、的 API。 这 就 是 说 , 别 人 能 够 用 编 程 的 方 法 通 过 Web 来 调 用 这 个 应 用 程 序 从 而 获 取 信 息 。 它通过标准通信协议,在互联网上以服务的方式发布有用的程序模块,目前大部分是用 SOAP(简单访问对象通讯协议)作为通信协议。从而极大的保证了通讯的效率和安全性(优于传统的 JS 和 HTTP),另外它提供非常完善的开发文档,来帮助用户构建应用程序。所以在大型项目的构建时,WEB SERVICE 始终是外接服务接口的不二之选。第 13 页 /共 31 页2. 3 使用 WEB SERVICE 外接接口的优点Web Service 的主要目标是跨
27、平台的可互操作性,为了实现这一目标,Web Service 完全基于 XML(可扩展标记语言)、 XSD(XML Schema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。因此使用 Web Service 有许多优点:1. 跨防火墙的通信如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服务器。要调用 Web Service,可以直接使用 SOAP 客户端,然后把它和应用程序连接起来。不仅缩短了开发周期,还减少了代码复杂度,并能够增强应用程序的可维护性。2. 跨程序语
28、言的应用程序集成在企业的各种应用系统中,很多系统不是使用相同的语言编写的,例如有的使用 Java,有的使用 php、C# 、asp。当各种系统之间需要交互时,可使用各种语言都通用的 WSDL 定义接口,对外将需要的接口暴露给指定的客户。XML Web services 提供了在松耦合环境中使用标准协议(HTTP、XML、SOAP 和 WSDL)交换消息的能力。消息可以是结构化的、带类型的,也可以是松散定义的。 3. 软件和数据重用Web Service 在允许重用代码的同时,可以重用代码背后的数据。使用 Web Service,再也不必像以前那样,要先从第三方购买、安装软件组件,再从应用程序中
29、调用这些组件;只需要直接调用远端的 Web Service 就可以了。另一种软件重用的情况是,把好几个应用程序的功能集成起来,通过 Web Service “暴露” 出来,就可以非常容易地把所有这些功能都集成到你的门户站点中,为用户提供一个统一的、友好的界面。可以在应用程序中使用第三方的 Web Service 提供的功能,也可以把自己的应用程序功能通过 Web Service 提供给别人。两种情况下,都可以重用代码和代码背后的数据。 第 14 页 /共 31 页2. 4 当前系统已实现的外接接口2.4.1 一诚通接口实现规范2.4.1.1 目标根据张家界市旅游局要求,森林公园核心景区工作员销
30、售团队票的过程如下:(1) 售票员在“一诚通”网站扫描行程单条码并输入验证码后,可以在电脑上看到行程单信息;(2) 售票员确认行程单信息,并询问导游真实购票数量;(3) 售票员在 IE 界面上输入真实的购票数量,并确认成交,此时,这些信息都将提交到“一诚通”系统;(4) 售票员在电子门票管理系统中重复输入行程单团队信息,再次输入购票数量;(5) 制票出票。从上述过程不难看出,行程单的信息虽然在“一诚通”系统中存在,并可以被查询和确认,却无法直接应用到电子门票系统,造成了售票员需要重复输入部分信息,增加工作量和失误。我们计划设计一个 IE 浏览器插件,通过插件调用 Web Service 实现“
31、一诚通”网页和电子门票系统的动态数据交换,解决售票员重复输入的问题,提高工作效率。2.4.1.2 设计原理IE(Internet Explorer)是一个独立的进程,运行 B/S 应用;插件是一个寄生程序,可以在 IE 启动时启动。电子门票系统是一个独立的进程,我们可以为其设计特定的运态数据交换接口,工作过程如下:(1) 售票员启动 IE,此时插件也伴随启动;启动电子门票系统并登陆,打开售票单;(2) 售票员登陆到“一诚通”系统,并进行正常的操作,确认行程单;(3) 在行程单确认完成界面,售票员点击 IE 上的“开始售票”按钮(此按钮是因插件启动而创建的) ;(4) 插件检索正在运行的电子门票
32、系统进程,若找到了正在运行的电子门票系统进程,则转(5) ,否则结束;(5) 从当前网页界面中检索以下信息:行程单号,旅行社,客源地,人数,导游证号,姓名等;(6) 向电子门票系统的约定接口发送消息;(7) 电子门票系统进程接收到插件发来的消息之后,创建新的售票单并填写行程单号,旅行社,客源地,人数,导游证号,姓名等信息;(8) 售票员制票等其他操作;(9) 结束。需要用到的关键技术:第 15 页 /共 31 页IE 插件技术,进程动态调用 web service 通讯技术。交复的过程:第 16 页 /共 31 页三 操作步骤和操作界面示意图(1) 售票员启动电子门票系统并登陆,打开售票单。(
33、2) 售票员启动“一诚通”系统,扫描行程单。(3) 售票员填入购买数量点击下一步进行确认(4) 电子门票系统会自动填写行程单号,旅行社,客源地,人数,导游证号,姓名等信息第 17 页 /共 31 页(5)售票员开始售票。三 安装示意图本插件含有以下 6 个文件,目前可以正常运行在 32 位(winXP、win2003、win7)操作系统下(1) 由于本插件需要.net framework2.0 环境,首先必须安装 dotnetfx.exe(2) 其次拷贝其他文件到 windowssystem32 文件夹(默认为 c 盘)(3) 执行 install.bat 之后安装完成(4) 执行 IE 阅览
34、器(目前只支持 IE 6/7/8) 、如果 IE 启动时也一并启动一个名为“一诚通辅助”的最小化窗体,则说明安装成功。在任务栏点击它可以看到相关的一些操作信息:(如下图)第 18 页 /共 31 页2.4.2 三统一推接口实现规范2.4.2.1 目标根据张家界市旅游局要求,旅游景区必须实现以下三点:(1)实现电子门票的税务监制,同时将税收监管过程深入到旅游业的经营环节中.(2)统一电子门票价格,规范旅游行业的价格管理.(3)统一电子门票宣传要素. 通过对旅游景区规范化管理,最终实现预定、发售、退票、库存等业务流程的电子化管理,售票动态过程实施及时监控,避免人工失误和财务漏洞。2.4.2.2 设
35、计原理为实现景区电子门票的税务监制,我们必须实现对地税数据仓库的动态数据交互,从而获取门票信息,规范化售票。 (相关结构如下图)第 19 页 /共 31 页所以, 我们针对性开发了地税数据仓库数据获取 webservice.介于其对多程序语种的支持,我们能够方便的并且整合进我们自己的电子门票系统当中,每隔经过设定的时间来从地税数据仓库来获取数据:(如下图)通过这些实时的数据,我们只需要在验票时实时查询这些数据,就可以辨别伪造票的可能性,并且能够对售票业务实时监管,将统计数据及时回馈给地税数据仓库。第 20 页 /共 31 页3. 第三方接口指南3.1 联网接口定义湖南中南金叶电子门票管理系统具
36、备开放式的联网接口,您只要使用重载这个接口,定义的基于.Net FrameWork 2.0 的所有程序,都将可以被本系统加载、识别和使用。您定义好的联网实体程序(DLL 文件)请在放置到安装目录InterFaceDll 下。下面是联网接口的定义,更多开发支持请向湖南中南金叶有限公司索取。namespace DigitalScience.TestLine.Connectpublic interface IConnectionSystem.Collections.Hashtable GetCarInformation(string s_cphm, string s_pzlb);int SendTe
37、stResult(string hpzl, string hphm, string clsbdh, string jyjg, string jyrq, string cjdw,string s_jccs);3.2 联网接口开发示例接下来,我们给出一个开发的示例,您可以作为参考。文件目录结构如下:app.config,提供连接的基本配置,代码如下CBusinessAgentBase.cs 远程服务的名称配置,代码如下using System;using System.Collections.Generic;using System.Text;namespace DigitalScience.Cl
38、ient.Businesspublic abstract class CBusinessAgentBaseprotected CClientAgent mClientAgent =new CClientAgent();第 22 页 /共 31 页protected string mRemoteServiceName = “DEFAULT“; / / 远程服务的名称/ public string RemoteServiceNamegetreturn this.mRemoteServiceName;setthis.mRemoteServiceName = value;#region 构造函数pub
39、lic CBusinessAgentBase(string s_remoteservicename)this.mRemoteServiceName = s_remoteservicename;public CBusinessAgentBase()CBusinessAgentBase()this.mClientAgent = null;#endregionpublic virtual DateTime GetServerTime(Guid obj_sessid)System.Object obj_temp = null;this.mClientAgent.CallService(obj_sess
40、id, this.mRemoteServiceName, “CBSYSTIME“, “GETTIME“, “ as object, out obj_temp);/this.mClientAgent.CallService(obj_sessid, this.mRemoteServiceName, “CBCKCKD_DS“, “UPDATE“, obj_parm, out obj_result);return (DateTime)obj_temp;第 23 页 /共 31 页CClientAgent.cs 通用客户端代理类,代码如下using System;using System.Collect
41、ions.Generic;using System.Linq;using System.Text;using DigitalScience.Business.Interface;using DigitalScience.Client.Business.BusinessClient;namespace DigitalScience.Client.Business/ / 通用客户端代理类/ public class CClientAgentprotected BusinessPlatformClient mClient = null;#region 构造和析构public CClientAgent
42、()this.mClient = new BusinessPlatformClient();CClientAgent()#endregion/ / 取得服务务版本/ / public string GetServerVersion()string s_version = “;mClient.Open();trys_version = this.mClient.GetServerVersion();mClient.Close();第 24 页 /共 31 页finallythis.mClient.Close();return s_version;/ / 取得服务器的描述/ / public st
43、ring GetServerInformation()string s_information = “;this.mClient.Open();trys_information = this.mClient.GetServerInformation();finallythis.mClient.Close();return s_information;#region CallService/ / 调用服务器的服务/ / 客户端 SESSION 的名称/ 服务的名称/ 业务组件的名称/ 业务组件类功能的名称/ 传入参数/ 传回的参数/ 返回值 0 表示调用成功,其他值为发生错误public voi
44、d CallService(Guid obj_sessionid, string s_servicename, string s_businessobjectname, string s_functionname, object obj_parm, out object obj_outresult)obj_outresult = null;第 25 页 /共 31 页BusinessPlatformClient obj_client = new BusinessPlatformClient();/打开到服务器的链接obj_client.Open();try#region 创建一个访问请求包CR
45、equestBag obj_request = new CRequestBag();obj_request.Encryped = false;obj_request.ServiceName = s_servicename;obj_request.SessionID = obj_sessionid;obj_request.BusinessObjectName = s_businessobjectname;obj_request.FunctionName = s_functionname;if (obj_parm = null)/如果没有参数obj_request.Parameter = null
46、;obj_request.Zipped = false;else/如果有参数byte bt_unzipbuf = CSerializer.Serialize(obj_parm);obj_request.Zipped = false;if (bt_unzipbuf.Length 256)byte bt_zipbuf = CZipProvider.Compress(bt_unzipbuf, 0, bt_unzipbuf.Length);if (bt_zipbuf.Length / 国标的接口/ public interface IGBInformationstring GBNameget;set;
47、string GBMemoryget;set;System.Collections.Hashtable GBRunnersget;第 28 页 /共 31 页int GBRunnerCountget;void DeleteGBRunners();IGBRunner CreateGBRunner(string s_gbsetanem,string s_valuename);void DeleteGBRunner(IGBRunner obj_gbset);void DeleteGBRunner(string s_gbsetname);IGBRunner GetGBRunner(string s_g
48、bsetname);System.Collections.Hashtable SelfDataCheck();(2) IGBParameterpublic interface IGBParameterstring ParmNameget;set;string ValueNameget;set;string Valueget;set;string ParmDisplayNameget;set;第 29 页 /共 31 页decimal MinValueget;set;decimal MaxValueget;set;bool PrimaryProjectget;set;IGBRunner GBRu
49、nnerget;set;bool HasTwoValueget;set;string SelfDataCheck();string DoCalculate(decimal dec_value);void SetParameterValue(string s_parmname, bool b_hastwovalues, decimal dec_minvalue, decimal dec_maxvalue);(3) IGBRunnerpublic interface IGBRunnerIGBInformation GBInformation第 30 页 /共 31 页get;set;string ValueNameget;set;string Valueget;set;string GBSetNameget;set;string GBNameget;string GBMemoryget;System.Collections.Hashtable