UML软件工程组织

用.NET构建XML Web Service完成Lotus与异质系统的数据交互

younther(原作)(摘自中国软件)

摘要:使用.NET以及Lotus NotesCOM接口完成读取Lotus Notes的表与视图,通过.NET的强大功能创建Web Services,让数据以XML的形式存放,使得从异质的客户端(IE)可以通过发布的Web Services来访问和操作Lotus Notes数据库的文档和数据。

关键词:.NETLotus NotesXMLWeb Services<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Abstract: Visual Studio.NET and Lotus Notes’s COM interface are used to access the Tables and Views in the Lotus Notes database. The Visual Studio.NET created the Web Services and made the data transported by XML, then made all kinds of clients (such as IE) can access the Lotus’s database from the Web Services which been published.

Keyword: .Net; Lotus Notes; XML; Web Services

 

 

1 引言

在企业办公自动化开发这个领域,Lotus Notes/Domino作为消息与协作平台应用十分的普遍。该系统是先进的单一架构的文档数据库和电子邮件系统,提供了工作流自动化以及标准的Web服务、应用和开发环境,是实现企业级信息集成和知识管理的理想平台。在Lotus Notes系统中,数据以文档的形式存储,是非结构化的数据库,因此就带来了一个问题:异质系统怎么与Notes数据交互?

Lotus公司提供了很多诸如CORBACOMwindows API的访问接口,但是这些接口要么只支持本地的互操作,要么就是适用于紧密耦合的系统中,穿过不了防火墙和NAT。解决Notes数据库与异质系统的交互,而且跨越Internet,能够与不同的系统互操作,这就要求系统是松散耦合的,并且采用了开放的广为接受的标准。由此,我们提出了采用基于XMLWeb Service方案来解决这个问题。

 

2 解决方案的框架

  21 XML Web Service的结构和工作原理

XML Web Service是一个标准,是一个与具体的开发工具和平台无关的解决方案。它采用SOAP协议通过HTTP来调用。通常,开发者可以用自己喜欢的语言(VB 6或者VB.NET)来构建你的Web Service,然后用SOAP Toolkit或者.NET的内建支持来把它暴露给Web客户。于是,任何语言,任何平台上的客户都可以阅读其WSDL文档,以调用这个Web Service。客户根据WSDL描述文档,会生成一个SOAP请求消息。Web service都是放在Web服务器 (IIS) 后面的,客户生成的SOAP请求会被嵌入在一个HTTP POST请求中,发送到Web服务器来。Web服务器再把这些请求转发给Web service请求处理器。Web service请求处理器解析收到的SOAP请求,调用Web service,然后再生成相应的SOAP应答。Web服务器得到SOAP应答后,会再通过HTTP应答的方式把它送回到客户端。

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

1 Web Services结构

 

22 解决方案的框架

Lotus 公司提供了专用的应用程序接口供外部的应用程序操作Notes数据库,在这里我们用的是微软的开发平台,所以采用Lotus Domino objectCOM接口来操作Notes数据库。这个COM接口能让开发者在可以调用COM的任何开发环境里面访问Notes数据库,在这里笔者采用了微软最新的开发平台Visual studio .NETc#语言进行web service服务的开发。其实开发者可以选择任何一种支持COM接口、XMLHTTP协议的平台上做开发。通过在.NET平台上开发出来的服务交给IIS去发布,就完成了服务端的构建。在客户端开发者同样可以采用多样的开发平台,例如VBASP等等,只要能够接受和解析IIS发布的XML消息文档就可以作为客户端。 对比Xml web service的结构图,可以知道COM接口的调用是极为关键的,如果没有COM接口,Web service也就不可能访问Notes数据库了。

2 解决方案框图

3 解决方案的实施

我们用的开发平台:

 服务器:windows2000web服务器:IIS5.0Lotus Notes/Domino 5.0.3版;

 XML Web Service服务开发工具:Visual Studio.NET Beta2

 客户端:ASP web页面或者VB windows application

 

开发步骤:

 

1) Lotus Notes/Domino Notes数据库

新建一个Notes数据库或者利用原有的数据库。在这个数据库里面至少有一个表单,在表单里有一些域,用来存放一些条目的信息。再建立几个视图,视图主要是用来按照一定规则显示文档的。比如按照时间的顺序或按照文档的点击率。

 

2) 建立XML web service服务

打开Visual studio .NET Beta2版,新建项目->Visual c#ASP.NET web服务,删掉默认的ASMX文件,新建一个Web服务页面NewsPublish.asmx,打开NewsPublish.asmx.cs文件,这里将是我们编写源代码的地方。右键点击解决方案,添加引用,选择COM组件中的Lotus Domino Object组件,确定后就引用了COM组件,在我们的程序里面就可以访问Notes数据库了。好了,就可以开始编写代码提供方法调用服务了。在这里,笔者给出其中一个方法,GetNewByPostTime提供获取指定数目的新闻条目的服务,每个新闻条目只是有提交时间、作者、标题、分类、文档标识号码等基本的信息,没有具体的内容。以下是为部分源代码。

GetNewsByPostTime方法:

//返回新闻条目,存储在一个数组里面

//PageSize参数为新闻条目的数目

     public NewsItem[] GetNewsByPostTime(int PageSize)

         {

              Domino.IViewNavigator  vn;

              Domino.IViewEntry  h;

              Domino.IDocument doc;

              int index=0;

              NewsItem[] Result=new NewsItem [PageSize];

//连接Notes数据库

              vn=ConnectToNotesDb("","bbs.nsf","bufy_2001","All Documents",out h);

//获取每个新闻文档的信息

              do

              {

                   doc = h.Document;

                   Result[index]=new NewsItem ();

                   Result[index].Subject  =doc.GetFirstItem ("Subject").Text;

                   Result[index].Category =doc.GetFirstItem ("categories").Text ;

                   Result[index].PostTime =doc.Created.ToString ();

                   Result[index].Author =doc.GetFirstItem("From").Text ;

                   Result[index].NewsID =doc.NoteID .ToString ();

                   index++;            

                   h = vn.GetNextDocument(h);

              }

              while(h!=null&&index<PageSize);

              return Result;

       }

 

连接Louts数据库的方法:

//这个方法建立Notes的数据库连接并获取视图的句柄

        public Domino.IViewNavigator  ConnectToNotesDb(string pServer,string pDbFileName,string pPassword,string pNotesView,out Domino.IViewEntry h)

         {

              NotesSession s=new NotesSession ();

              Domino.IDatabase  db;

              Domino.IView  v;

              Domino.IViewNavigator  vn;

 

  s.Initialize (pPassword);

              db=s.GetDatabase (pServer,pDbFileName,false);

              v=db.GetView (pNotesView);

              vn=v.CreateViewNav(0);

              :h=vn.GetFirstDocument ();

 

              return vn;

     }

至此完成了web service服务的定义,在想发布的web service服务上标上[WebMethod],这样服务就可以被客户端访问了。

 

3) 客户端的构建

客户端可以有很多种方法可以构建,在这里只讲述用ASP web站点的连接方式。客户端想获取XML web service服务,除了要支持http的连接外,还要能够解析XML文档。ASP通过调用XMLHTTP组件接受XML消息,在应DOM来解析XML文档获取我们需要的信息。

在这里,笔者只列出ASP请求、接受XML服务和解析XML文档的源代码:

         Dim oXMLHTTP

         Dim oDOM

         Set oXMLHTTP=Server.CreateObject ("Microsoft.XMLHTTP")

         Set oDOM = Server.CreateObject("Microsoft.XMLDOM")

         '利用post方法完成xml web service服务的请求

         oXMLHTTP.open_ "POST","http://192.168.3.11/DominoXmlWebService/NewsPublish.asmx/GetNewsDetails",f_alse

         '利用Get方法完成xml web service服务的请求

         'oXMLHTTP.open_ "GET","http://192.168.3.11/DominoXmlWebService/NewsPublish.asmx/GetNewsByCount?_

NewsID="&newsID&"",false

         '设置post方法参数

         oXMLHTTP.SetRequestHeader_ "Content-Type","application/x-www-form-urlencoded"

         '发送post数据

    oXMLHTTP.send "NewsID="&newsID&""

    '如果用get方法,则发送方法如下

    'oXMLHTTP.send

Set oDOM=oXMLHTTP.responseXML

      Set theNode=oDOM.documentElement.childNodes(0)

      NewsID=theNode.ChildNodes(0).text

      Subject=theNode.ChildNodes(1).text

      Category=theNode.ChildNodes(2).text

      Count=theNode.ChildNodes(3).text

      PostTime=theNode.ChildNodes(4).text

      Author=theNode.ChildNodes(5).text

            Body=theNode.ChildNodes(6).text

 

至此,我们完成了所有的任务。

 

4 结论

利用XMl web service完成异质系统的数据互操作和应用程序集成不失为一个很好的方法,同时web service也是软件变服务实现的重要技术基础。为此,世界各大IT投入巨大的精力,像MicrosoftIBMSUN等,并且随着时间的推移和IT的发展,最终将有巨大的应用前景。但是XMl web service也并非适用与任何场合,一些技术还会在相当长的时间内存在的,形成相互并存甚至协作的局面。例如COM/DCOMCORBARMI/EJB等分布式组件技术。采用什么样的方案,就得看具体的应用了。

 

 


版权所有:UML软件工程组织