教育网络建设、管理与应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

基于Web Service技术实施业务整合的设计与实现

北京市第二中学 王甲春

在北京市大力推动基础教育信息化的进程下,越来越多的信息技术应用系统不断出现,给教师、学生、家长都带来了很大的方便。特别是从2002开始,北京市教委开始试点并推广CMIS(Campus Management Information System,北京市中小学校园管理信息系统),CMIS是北京市教育委员会根据国家教育部2002年颁布的《教育管理信息化标准规范(试行)》而研发的基础教育信息管理软件,是北京市教育信息化建设的重要组成部分。它以提高学校内部管理水平并适应当前素质教育的学校管理要求为目标,提供能够满足中小学校教育教学管理需要的全套解决方案,可轻松实现与上级教育部门应用软件的无缝链接,从而达到教育数据的一致性、标准性和规范性。

在CMIS规范电子学籍的基础上,各区县、各学校也开发了越来越多的应用系统,比如北京市东城区的蓝天工程网站、北京市第二中学的家校互动平台、选课系统等。目前这些众多的应用系统使用都较好,但是也暴露出一些不足。如果学生在同一学校转班或者转学时,个人信息的很多数据就需要在每个系统内重新设置,给负责的老师带来了麻烦。由于目前各区县以及各学校大部分采取从CMIS导出数据,再向各自开发的系统内导入数据的方式,所以越来越多的业务系统成为一个个独立的数据孤岛,即使是年级、班级、姓名、学籍号等基础数据也是互相独立的,并不能做到实时同步。一旦数据发生变化,需要手工在所有系统内进行单独调整,这必然会导致一系列麻烦的发生,甚至某些数据的错误。

如何进行不同业务的整合,即基础数据只有一份,所有系统都共享该基础数据,并无缝集成到每个独立的系统中?本文将利用Web Service技术,对这一问题进行一些研究与尝试,希望能给系统开发者提供一些参考,并给用户减轻一些人为造成的麻烦和数据错误。

一、Web Service概述

(一)Web Service定义及相关技术规范

根据W3C组织的描述,Web Service是基于通过网络支持计算机间的集成来设计软件应用程序的。它的接口用计算机可处理的格式(通常是WSDL)来描述。其他软件应用程序通过该接口描述的方式与Web Service交流,利用SOAP消息,通常是序列化的XML通过HTTP或其他网络标准传输。

从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web调用来实现某个功能的应用程序。从深层次上看,Web Service是一种新的Web应用程序分支,它们是自包含、自描述、模块化的应用,可以在网络(通常为Web)中被描述、发布、查找以及通过Web来调用。

在Web Service体系结构中,涉及多方面的技术规范,包括:XML、SOAP、WSDL、UDDI,它们构成一个互操作的协议栈。

1.XML和HTTP

XML(Extensible Markup Language,可扩展的标记语言)是Web Service平台中表示数据的基本格式。XML是一种界定文本数据的简便且标准的方法,它是开放的、自描述的。XML协议格式具备描述各种类型数据的能力,它使Web应用集成在数据层上达成了一致,解决了不同平台或系统、不同数据结构或模式之间的差异,使得原本复杂的数据层的集成变得简单起来。HTTP(Hyper Text Transfer Protocol,超文本传输协议)则是一个在因特网上广泛使用的协议,为Web Service部件通过因特网交互奠定了协议基础,并具有穿透防火墙的良好特性。

2.SOAP

SOAP(Simple Object Access Protocol,简单对象访问协议),它是用于交换XML编码信息的轻量级协议。SOAP属于服务调用协议,是Web Service体系结构中服务交互的基础架构。SOAP是一种独立的、通用的、基于XML标准的、文本对象的访问协议,用于在不同的系统中发送和接收XML数据,实现相互通信。Web Service实现了不同系统之间的相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现“基于Web无缝集成”的目标。

3.WSDL

WSDL(Web Service Description Language,Web Service描述语言)提供了一个能用机器阅读的基于XML的语言,用于描述Web Service及其函数、参数和返回值。WSDL是Web Service接口界面的跨平台工具。WSDL首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上,再定义端点。它将网络服务描述成一组端点,这些端点中包含对面向文档或面向过程信息的消息处理操作。因为WSDL是基于XML的,所以它既是机器可阅读的,又是人可阅读的。

4.UDDI

UDDI(Universal Description and Discovery Integration,统一的描述、发现和集成)是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。UDDI全球注册点记录的是Web Service信息,你可以不把Web Service注册到UDDI,但如果要让所有人都知道你的Web Service,最好还是注册到UDDI。

(二)Web Service应用优势

在本文探讨的业务整合问题上,使用Web Service技术具有非常大的优势。

1.强大的软件支持

操作系统离不开丰富的应用软件的支持。同样,Web Service这项技术只有通过日益广泛的应用才能体现出其价值,如今Microsoft、IBM、SUN、Borland等不同厂商都推出了完善的Web Service构建工具,在市场上也可以看到它们所创建的Web Service应用。

2.跨平台的应用

由于Web Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。Web Service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。所以开发人员可以用喜欢的任何语言(如C#、Java、Delphi等),在任何主流操作系统(如Windows、Linux、Unix等)平台上写Web Service,并且最终的应用架构可以是B/S形式也可以是C/S形式。

3.基础数据的规范化

利用XML统一数据描述格式,使信息描述规范化。为了发布基于基础数据应用系统的Web Service,首先就要对基础数据本身进行规范。此外,XML实现了表现形式和数据的分离,这允许它能够对来自不同应用系统的数据进行集成和处理,从而实施业务整合。

二、业务整合的体系设计

在本文描述的业务整合方案中,可以设定一些基础数据,对应一个基础数据库以及一个基础数据管理系统。如果是已有基础数据平台,只要在原有数据平台的基础上将需要暴露出来的功能封装成Web Service,这样这个应用程序既能被其他应用程序通过Web Service进行调用,又能保证它原有的应用不会受到影响。整个业务整合的方案体系可以用图1表示。

图1

三、业务整合的技术实现

(一)Web Service的实现

1.基础数据库

为了问题描述与设计方案的方便,这里选择使用Microsoft Access数据库软件设计数据库(data.mdb),需要共享的基础数据表student结构如图2所示。

图2

输入一些基本数据用于测试,必须要有一个惟一的字段比如学号,根据学号可以查出其他信息:

2.Web Service的发布

Web Service可以由Java、.Net和Delphi等任何技术开发,Delphi 7作为Window平台的Web Service基础环境与开发工具,将RAD便利性带人Web Service开发领域,简化了开发Web Service应用程序的复杂度,让开发人员专注于应用方面的开发,而无需顾及繁琐的Web Service规范等。它通过使用SOAP实现对Web Service的支持,它基于HTTP消息,开发的Web Service可以在多种平台上运行。

在Delphi 7集成开发环境中点击File | New | Other菜单,在Web Service选项卡中选择SOAP Server Application选项,选择需要创建服务的类型为CGI可执行文件,但在实际使用时,常常会选择一个更高效的Apache或ISAPI/NSAPI DLL类型。

先不自动创建SOAP接口模块,因为程序需要连接数据库,点击File | New | Other菜单,在Web Service选项卡中选择SOAP Server Data Module选项创建数据接口模块,接口名称为“testdataservice”,保存所有文件,工程上保存为“demo.dpr”。

在数据模块对应的单元文件内,Delphi自动生成了“testdataservice”这个Web Service的接口和实现代码。在数据模块上放置一个TADOConnection控件和一个TADOQuery控件。设置ADOConnection1的ConnectionString属性,将它连接到数据库data.mdb,设置ADOQuery1的Connection属性为ADOConnection1。创建一个学生信息类TStudent,用于记录学生个人信息:

        TStudent = class(TRemotable)
        private
          Fxuehao: String;
          Fnianji: String;
          Fbanji: String;
          Fxingming: String;
          Fxingbie: String;
        published
          property xuehao: String read Fxuehao write Fxuehao;
          property nianji: String read Fnianji write Fnianji;
          property banji: String read Fbanji write Fbanji;
          property xingming: String read Fxingming write Fxingming;
          property xingbie: String read F xingbie write Fxingbie;
        end;

Web Service接口提供一个函数,用于根据输入的学号得到学生的个人信息:

        function GetStudentInfo(const ID: String): TStudent; stdcall;

函数的具体实现代码如下:

      function Ttestdataservice.GetStudentInfo(const ID: String): TStudent;
      begin
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add('select * from student where xuehao='+''''+ID+'''');
        ADOQuery1.Open;
        Result:=TStudent.Create;
        Result.xuehao:=EncodeString(ID);
        Result.nianji:=EncodeString(ADOQuery1.FieldByName('nianji').AsString);
        Result.banji:=EncodeString(ADOQuery1.FieldByName('banji').AsString);
        Result.xingming:=EncodeString(ADOQuery1.FieldByName('xingming').AsString);
        Result.xingbie:=EncodeString(ADOQuery1.FieldByName('xingbie').AsString);
      end;

程序代码内的EncodeString函数在Encddecd单元定义。为了考虑不同平台不同语言间的通信,这里统一将字符串编码为base64格式,其他程序得到这个字符串需要进行还原操作。如果不进行统一编码,不同程序调用Web Service的时候,传递中会出现乱码的情况。

3.Web Service测试

编译程序,将生成的CGI程序demo.exe以及数据库文件data.mdb一起配置到IIS的根目录或者虚拟目录内。为了执行CGI程序,需要在IIS内将主目录的执行权限改为“脚本和可执行文件”(默认值是“纯脚本”)形式。

打开浏览器,在地址栏输入“http://127.0.0.1/demo.exe”就可以看到程序公开的Web Service信息,点击“Itestdataservice”链接可以查看它所公开的Web Service中的函数:

TStudent GetStudentInfo(string ID)

点击“Itestdataservice”后面的“WSDL”链接可以看到Web Service的XML格式描述。当然,直接访问“http://127.0.0.1/demo.exe/wsdl/Itestdataservice”也是同样可以浏览到该Web Service。

至此,Web Service发布完成,其他程序则可以调用它公开出来的“GetStudentInfo”函数来获取学生信息。

(二)C/S模式调用Web Service的实现

按照C/S模式的规范,如果你只是开发调用客户端,那么你可以使用几乎所有主流的编程工具来实现。下面还是以Delphi 7为例,首先创建一个普通的应用程序(c.dpr),然后在窗体上放置一个TEdit控件、一个TButton控件、四个TLabel控件和一个THTTPRIO控件(在WebServices控件面板上),设置THTTPRIO控件的URL属性为“http://127.0.0.1/demo.exe/soap/Itestdataservice”。

在Delphi 7集成开发环境中点击File | New | Other菜单,在Web Service选项卡中选择WSDL Importer选项——不管这个Web Service不是由Delphi所开发,都可以用该方法导入WSDL源,在向导中输入WSDL地址“http://127.0.0.1/demo.exe/wsdl/Itestdataservice”,Delphi会自动生成该Web Service对应的单元文件“Itestdataservice1.pas”,保存所有文件。

编写按钮单击事件的代码:

      procedure TForm1.Button1Click(Sender: TObject);
      var
        testobj:Itestdataservice;
      begin
        testobj:=HTTPRIO1 as Itestdataservice;
        Label1.Caption:='年级:'+DecodeString(testobj.GetStudentInfo(Edit1.Text).nianji);
        Label2.Caption:='班级:'+DecodeString(testobj.GetStudentInfo(Edit1.Text).banji);
        Label3.Caption:='姓名:'+DecodeString(testobj.GetStudentInfo(Edit1.Text).xingming);
        Label4.Caption:='性别:'+DecodeString(testobj.GetStudentInfo(Edit1.Text).xingbie);
      end;

程序代码使用了Encddecd单元定义的EncodeString函数,用于将Web Service公开的GetStudentInfo函数所返回的base64格式字符串还原为原始未编码的字符串。

运行程序,在编辑框输入学号,得到了学生的基本信息。因为本程序没有直接使用任何数据库操作,但是得到了基本数据,Web Service在C/S模式下调用成功。

(三)B/S模式调用Web Service的实现

按照B/S模式的规范,客户不需要安装任何其他程序,只要打开浏览器输入网址就可以进入应用系统,所以需要把该系统部署在Web服务器上。

本例以目前比较流行的ASP.net(C#)进行实现,首先确保在IIS基础上安装好Microsoft .net Framework以及Microsoft .net Framework SDK。

使用Dreamweaver 8创建ASP .net C#站点,在IIS主目录下新建目录“bsmode”,用于存放本例测试网页“index.aspx”。在Dreamweaver的“应用程序”面板的“组件”项添加Web Service组件,选择“使用WSDL添加”方式,根据WSDL地址“http://127.0.0.1/demo.exe/wsdl/Itestdataservice”,Dreamweaver将自动生成ASP .net C#代理类“Itestdataserviceservice.cs”。

编写“index.aspx”源码如下:

      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
      <title>B/S模式调用Web Service演示</title>
      </head>
      <script language="C#" runat="server">
        protected void Button1_Click(object sender, EventArgs e)
        {
          Itestdataserviceservice testobj = new Itestdataserviceservice();
          Label1.Text ="年级:"+Encoding.Default.GetString(
            Convert.FromBase64String(testobj.GetStudentInfo(TextBox1.Text).nianji));
          Label2.Text ="班级:"+Encoding.Default.GetString(
            Convert.FromBase64String(testobj.GetStudentInfo(TextBox1.Text).banji));
          Label3.Text ="姓名:"+Encoding.Default.GetString(
            Convert.FromBase64String(testobj.GetStudentInfo(TextBox1.Text).xingming));
          Label4.Text ="性别:"+Encoding.Default.GetString(
            Convert.FromBase64String(testobj.GetStudentInfo(TextBox1.Text).xingbie));
        }
      </script>
      <body>
        <form runat="server">
        <p>
        <asp:TextBox ID="TextBox1" runat="server" Text="20080305"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="获取信息"/>
        </p>
        <p>
          <asp:Label ID="Label1" runat="server" />
          <asp:Label ID="Label2" runat="server" />
          <asp:Label ID="Label3" runat="server" />
          <asp:Label ID="Label4" runat="server" />
        </p>
        </form>
      </body>
      </html>

程序代码使用了Convert.FromBase64String函数,用于将Web Service公开的GetStudentInfo函数所返回的base64格式字符串还原为原始未编码的字符串。

将“Itestdataserviceservice.dll”复制到网站的“bin”目录下,打开浏览器,在地址栏输入“http://127.0.0.1/ bsmode /index.aspx”就可以看到测试页面,在编辑框输入学号,得到了学生的基本信息,Web Service在B/S模式下调用成功。

四、总结

为了问题描述与设计方案的方便,这里主要介绍了Web Service的设计以及C/S模式、B/S模式下的调用方法,通过调用Web Service共享基础数据,实现了业务整合的基本框架,并且测试成功。Web Service所公开的函数GetStudentInfo可以进一步细化,例如输入一个不存在的学号或不规范的学号可以根据实际需求返回相应的提示信息。对于多个系统如网上选课系统、家校互动平台等,具体业务本身的设计则不是本课题需要探讨的问题。另外,在实际的应用中,对于基础数据本身的操作比如添加、删除、修改等,建议设置独立的系统或程序来完成。

参考资料

[1] 柴晓路.Web服务架构与开放互操作技术.北京:清华大学出版社,2002.

[2] 李维.Delphi 6/kylix SOAP/Web Service.北京:机械工业出版社,2002.

[3] 张艳琼,蔡瑞英.基于URP的数字校园解决方案.湖南师范学院学报,2007,(4):81-84.