当前位置:文档之家› XML、Web服务和.Net框架

XML、Web服务和.Net框架

XML、Web服务和.Net框架
XML、Web服务和.Net框架

XML、Web服务和.NET框架

应用程序开发技术正发生着一次质的飞跃,从根本上大幅度提高开发人员的生产效率,它开启了一道通向全新概念的应用程序的大门。

在过去,开发人员一直通过集成本地系统服务来构建应用程序。在这种模式下,开发人员可以访问丰富的开发资源并能严格控制应用程序的行为。

如今,开发人员在很大程度上已挣脱了这种模式的束缚,致力于构建具有复杂结构的n层系统,这种系统能将网络中各处的众多的应用程序进行集成,并大大提升应用程序的价值。这样,开发人员便可集中精力挖掘软件独特的商业价值,而不必日夜为如何构建基本结构伤脑筋了。令人欣喜的局面将应运而生:软件投放市场的时间大大缩短、开发人员的编程效率明显提高,最为根本的是开发出质量上乘的软件。

我们正在进入一个崭新的计算时代,一个互联网时代,其核心技术是“可扩展标记语言”,即XML。XML创建出可供任何人从任何地方访问和使用的功能强大的应用程序。它极大地扩展了应用程序的功能,并实现了软件的不间断传输。在这种大环境中,软件已不完全是指那些从CD进行安装的程序,而是已经演变成了一种服务:类似于调用者的ID验证或按观看次数进行收费的电视,人们可通过通信媒体预定此类服务。

这一切,是通过将紧密耦合的、高效的n层计算技术与面向消息的、松散耦合的Web概念相结合来实现的。我们将这种计算风格称为Web服务,它的出现标志着人类已经迈入应用程序开发技术的新纪元。Web服务是一种应用程序,它可以使用标准的互联网协议,像超文本传输协议(HTTP)和XML,将功能纲领性地体现在互联网和企业内部网上。可将Web服务视作Web上的组件编程。

从理论上讲,开发人员可通过调用Web应用编程接口(API)(就像调用本地服务一样),将Web服务集成到应用程序中,不同的是Web API调用可通过互联网发送给位于远程系统中的某一服务。例如,Microsoft Passport服务使得开发人员能够对某应用程序进行验证。通过Passport服务编程,开发人员可以充分利用Passport的基本结构,通过运行Passport来维护用户数据库,以确保它的正常运行、定期备份等等。

松散耦合

在某个网络中分发应用程序逻辑,并不是一个全新的概念,在Web中分发并集成应用程序逻辑才是一个崭新的概念。

从前,分布式的应用程序逻辑需要使用分布式的对象模型,诸如:微软的分布式组件对象模型(DCOM)、对象管理集团的公用对象请求代理程序体系结构(CORBA)或Sun 的远程方法调用(RMI)。通过使用这种基本结构,开发人员仍可拥有使用本地模型所提供的丰富资源和精确性,并可将服务置于远程系统中。

这些系统有一个共同的缺陷,那就是它们无法扩展到互联网上:它们要求服务客户端与系统提供的服务本身之间必须进行紧密耦合,即要求一个同类基本结构。这样的系统往往十分脆弱:如果一端的执行机制发生变化,那么另一端便会崩溃。例如,如果服

务器应用程序的接口发生更改,那么客户端便会崩溃。

要求提供紧密耦合的基本结构,无可厚非,许多应用程序均是基于这种系统构建而成的。但是,当各个公司需要相互合作、或信息技术提供商扩大业务范围时,便很难实现单一而统一的基本结构。您根本无法保证您希望与之进行远程通信的管道的另一端,具备所有您需要的基本结构:对于它使用的操作系统、对象模型或编程语言,您可能一无所知。

相反,Web服务彼此是松散偶合的。连接中的任何一方均可更改执行机制,却不影响应用程序的正常运行。从技术角度讲,人们已转向使用一种基于消息的异步技术来实现高可靠性的系统性能,通过使用诸如HTTP、简单邮件传输协议(SMTP)以及至为重要的XML来实现统一的连接。

消息传递系统将通信的基本单元打包成自我描述型的数据包(又称作消息),并将其放到网络缆线中。消息传递系统与分布式对象系统之间的本质区别在于:要求发送方辨识接收方的基本结构的程度有所不同。在分布式系统中,发送方需对接收方的情况作出种种猜测:应用程序是如何激活或拆包的,调用的是什么样的界面,等等。

另一方面,消息传递系统会在缆线格式级上创建合同。发送方既不需考虑消息被接收后的情况,也不需考虑接发双方之间的通信情况,唯一需要考虑的是接收方是否能辩识发送的消息内容。

在缆线格式级上创建合同的优势不言而喻。例如,接收方可在任何时刻进行更改,而不会干扰发送方的消息发送,只要它仍可辩识原有消息的内容。另外,发送方无需任何特殊的软件即可与接收方通信:只要它发出正确格式的消息,接收方就可以响应。

缆线级的XML:SOAP

实现Web服务的异类基本结构以及在整个Web中实现Web服务的关键,是实现支持简单数据描述格式的技术。这种格式就是XML。Web服务必须使用XML来完成三件事情:基本的缆线格式、服务描述以及“服务发现”。

SOAP:在通信的最低级别,系统需要使用同一语言。特别,作为通信双方的应用程序需要遵守同一套通信规则:如何表示不同的数据类型(例如:是整数还是数组),以及如何表示命令(即:需要对数据进行何种操作)。另外,在必要的时候应用程序还需对该语言适当的扩展。简单对象访问协议(SOAP)是XML的实施工具,它提供了一套公共规则集,该规则集说明了如何表示并扩展数据和命令。

Web服务描述语言(WSDL)。双方应用程序在得到了如何表示数据类型和命令的规则后,需要对所接收的特定数据和命令进行有效的描述。仅仅说已接收到整数是不够的;比如,在接收到两个整数后,应用程序必须明确表述它可以对这两个整数执行乘法运算操作。Web服务描述语言(WSDL)是一种XML语法,开发人员和开发工具可使用它来表述Web服务的具体功能。

“SOAP发现”:在最高层,还需制定一套如何定位服务描述的规则:默认情况下,

用户或工具能在什么地方找到服务的功能描述?依据“SOAP发现”规格说明中提供的规则集,用户或开发工具可以自动找到服务的SCL描述。

一旦实现了这三种功能层,开发人员便可容易地找到Web服务,将它例示成一个对象后再集成进应用程序中,继而构建出一个具有丰富功能的基本结构。这样,得到的应用程序便能与Web服务进行反向通信了。

.NET框架:Web服务引擎

很显然,许多基本结构都需实现上述进程对开发人员和用户的透明化。.NET框架提供此基本结构。从.NET框架角度看,所有组件都可以是Web服务,而Web服务也仅是一种组件。实际上,.NET框架提取出微软组件对象模型(COM)的精华,将它们与松散耦合计算的精华有机地结合在一起,生成了强大、高效的Web组件系统:简化程序员的“管道”操作、深入地集成了安全性,引进了基于互联网的操作系统,极大地改善应用程序的可靠性和可扩展性。

.NET框架包含三个主要部分:公共语言运行时、具有多层次结构的统一的类库集合和高级版“活动服务器页面”(又名ASP+)

公共语言运行时

此名称不能准确反映它的全部功能。实际上,公共语言运行时在组件的开发过程中以及软件的运行过程中,都扮演着非常重要的角色。在组件运行过程中,运行时负责管理内存分配、启动或取消线程和进程、实施安全性策略、同时满足当前组件对其它组件的需求。在开发阶段,运行时的作用有些变化:与现今的COM相比,运行时的自动化程度大为提高(比如可自动执行内存管理),因而开发人员的工作变得非常轻松。尤其是,映射功能将使代码编写量锐减,这些代码是开发人员在将业务逻辑转化成可复用的组件进行编程时所需的。

对编程语言而言,运行时这个概念并不新奇:实际上每种编程语言都有自己的运行时。Visual Basic?开发系统具有最为明显的运行时(名为VBRUN),Visual C++?跟Visual FoxPro?、Jscript?、SmallT alk、Perl、Python和Java一样,有一个运行时MSVCRT。NET框架的关键作用是它提供了一个跨编程语言的统一的编程环境,这也是它能独树一帜的根本原因所在。

统一的编程类

.NET框架中的类为开发人员提供了一个统一的、面向对象的、层次化的、可扩展的类库集(API)。现今,C++开发人员使用的是微软基础类库,Java开发人员使用的是Windows?基础类库,而Visual Basic用户使用的又是Visual Basic API集。简而言之,.NET框架统一了微软当前各种不同的框架。这样,开发人员不再需要学习多种框架就能顺利编程。远不止于此的是,通过创建一个公共的跨编程语言的API集,.NET 框架可实现跨语言继承性、错误处理功能和调试功能。实际上,从Jscript到C++的所有编程语言,都是相互等同的,开发人员可以自由选择理想的编程语言。

高级版“活动服务器页面”(ASP+)

ASP+是使用 .NET框架提供的类库构建而成的,它提供了一个Web应用程序模型,该模型由一组控件和一个基本结构组成。有了它,Web应用程序的构建变得非常容易。开发人员可以直接使用ASP+控件集,该控件集封装了公共的、用于超文本标识语言(HTML)用户界面的各种小组件(诸如文本框、下拉菜单等等)。实际上,这些控件运行在Web服务器上,它们将用户界面转换成HTML格式后再发送给浏览器。在服务器上,控件负责将面向对象的编程模型呈现给Web开发人员,这种编程模型能提供面向对象的编程技术拥有的丰富功能。ASP+还提供一些基本结构服务(诸如会话状态管理和进程循环),这些服务进一步减少了开发人员要编写的代码量,并使应用程序的可靠性得到了大幅度提高。ASP+还允许开发人员将软件作为一项服务进行传送。通过使用ASP+ Web服务功能,ASP+开发人员只需进行简单的业务逻辑编程,而由ASP+基本结构负责通过SOAP传送服务。

尽管ASP+还未正式发行,但它已在改进应用程序功能方面创造出令人难以置信的奇迹:在现有基于ASP的应用程序性能基础上,性能优化了三倍之多,更为激动人心的是生产效率再度攀升。

.NET框架的核心要素

.NET框架有几个要素值得一提。首先是它的安全系统和配置系统。这两个系统协同工作,有力地遏止了运行不安全代码的可能性,并大幅度减少了号称“DLL Hell”的对应用程序进行配置时所面临的挑战。

安全系统是一个高度细化、基于事实的系统,它赋予开发人员和管理员多种代码处理权限(而不仅仅是“on”或“off”)。将来,还会根据代码本身的核心要素来决定如何实施上述权限。

例如,当.NET框架应用程序被下载到某一系统中时,它会申请一组权限(诸如对临时目录的写入权限)。运行时将收集有关应用程序的事实信息(诸如:它是从何处下载的、是否用了有效签名、甚至它访问系统的准确程度),并按管理策略决定是否允许应用程序运行。运行时甚至还可告之应用程序它无法授权申请的所有权限,并允许应用程序自行决定是否继续运行。

有这种安全系统作保障,许多应用程序配置问题便会迎刃而解。开发人员和管理员(最终是用户)所面临的最大挑战之一是版本的管理问题。如果在您新装了某个应用程序之后,一切都限于瘫痪状态,而在这之前系统一直运行得非常良好,那么最大的可能是新安装的应用程序重写了一些共享库,并极有可能修正了现有应用程序正使用的程序错误。这种情况出现的频率很高,以致人们将它称为:“DLL Hell”。

.NET框架拥有的几项高级功能可以彻底消除“DLL Hell”现象。首先,它有一个非常强大的内部命名系统,能够有效地防止两个库因互相重名而被错当为对方的情况发

生。除此之外,它还提供一项被称作“并行”配置的新功能。如果前例中新安装的应用程序确实重写了共享库,现有应用程序可对该库进行修复。等现有应用程序再次启动时,它会检查所有的共享文件。如果发现文件被更改,同时这些更改又是不兼容的,则它可以请求运行时提取一个它可以使用的版本。得益于强大的安全系统,运行时可以安全地执行该操作,这样应用程序就完成了本身的修复工作。

结论

人们总是喜欢不厌其烦地发表诸如“互联网改变了一切”的陈词滥调。同样地,在谈论互联网给人类带来的影响时,总是情不自禁地使用广告式的夸张语,以表达对互联网的推崇。不过,互联网的确彻底改变了应用程序的开发模式和配置方式。将传输软件演变成一种服务还有待人们的共同努力,XML是实现这个梦想的重要手段。.NET框架是微软开发人员战略的核心内容,它旨在帮助开发人员轻松地构建、配置和运行Web 服务。

为什么需要W eb Service

在通过internet网购买商品后,你可能对配送方式感到迷惑不解。经常的情况是因配送问题找配送公司而消耗你的大量时间,对于配送公司而言这也不是一项增值服务。

为了解决这种问题,配送公司需要在不降低安全级别的情况下了解更多的递送信息,然而安全公司设计的安全系统却非常复杂。那么我们能不能只使用80端口(web 服务器端口)并且只通过web服务器提供信息呢?所以,我们建立了一个全新的web 应用程序以便从核心商业应用程序中获得数据。配送公司将为些东西付money,所有的公司都希望能够将注意力集中在核心商业应用上。

什么是W eb Service?

Web Service是一种构建应用程序的普通模型,并能在所有支持internet网通讯的操作系统上实施。Web Service令基于组件的开发和web的结合达到最佳,基于组件的对象模型,象:Distributed Component Object Model (DCOM), Remote Method Invocation (RMI), 和Internet Inter-Orb Protocol (IIOP) 都已经发布很长时间了,不幸的是这些模型都依赖于特殊对象模型协议。Web Service利用soap和Xml对这些模型在通讯方面作了进一步的扩展以消除特殊对象模型的障碍。

Web Service主要利用http和soap协议使商业数据在web传输,saop通过http 调用商业对象执行远程功能调用,web用户能够使用soap和http通过web调用的方法来调用远程对象。

*****图1*********

那么怎样使在位置a的用户明白位置b的Web Service的意思呢?这个问题可以通过和一个一致的共同标准来回答。描述性服务语言(Service Description Language (SDL)),soap订约语言(SOAP Contract Language (SCL) )和网络访问规范语言(Network Accessible Specification Language (NASSL) )都是为这个目的建立的相似语言,然而IBM和微软都同意Web Service Description Language (WSDL)作为Web Service 的标准语言。

Web Service部件的结构由Web Service Description Language.描述,wsdl1.1是一份Xml文档,描述了Web Service的属性和接口。新的规范可以在https://www.doczj.com/doc/566964624.html,/Xml/general/wsdl.asp了解到。

当前的任务

最好的学习方法是创建一个Web Service,我们以一个股票报价系统为例,纳斯达克和澳大利亚股票交易系统都是非常有名的例子,他们都提供了一个接口,用于输入公司代码和接受最终成交的股票价格。

我们复制一个相同的功能的Web Service。

我们的Web Service的输入参数是股票代码,Web Service通过调用中间层商业逻辑函数获得股票价格,商业逻辑函数保持以最小的部分集中在Web Service上。

Web Service开发工具

实现这个应用程序的核心部件将是微软 .net framework sdk,不过他现在还是一个试用版,你可以在微软站点下载,我的配置是:操作系统windows 2000 server,pIII300,300mb内存。

创建Web Service的首选集成开发环境(IDE)是visual https://www.doczj.com/doc/566964624.html,, 然而,你可以用任何一种文本编辑器(wordpad,notepad,visual studio6.0)轻易创建一个Web Service 文件。

创建W eb Service

我将用c#创建一个Web Service 叫SecurityWebService。一个Web Service文件的扩展名是:.asmx(就象https://www.doczj.com/doc/566964624.html,的文件扩展名.aspx那样),文件的第一行是:

这个语句的含义是:告诉编译器运行Web Service模式,还有c#类名。我们还需要访问Web Service名字空间,这也是引用系统名字空间的一次好实践。

SecurityWebService 应该继承了Web Service类的功能,因此我们有必要加入下面这行代码

现在我们使用面向对象的编程技巧创建一个类,c#的类与c++和java非常相似,用C#建一个类件象去公园散步那样简单,而且不需要任何技巧。

C#的基本数据类型设计的非常聪明,因此,如果我们返回"int," "float," 或者"string" ,那么将自动将他们转变成标准Xml输出。不幸的是,在大多数例子中我们需要将获得的数据集合看成一个单一的实体(single entity)。现在我们举一个例子。

我们的SecurityWebService 股票报价系统需要用户输入股票代码,并且还将返回完整的公司名和现行股票价格,所以对一只股票而言我们有三个信息块。

1、公司代码(string)

2、公司名(string)

3、价格(double)

当我们提交股票时,我们需要提取所有三种数据,有几种方法来完成这项工作,最好的方法是将他们绑定到一种可被枚举的数据类型内,我们在c#中可用"struct"来完成,c#中的"struct"和c++中的结构很相似。

我们可以通过模块创建Web Service,代码如下:

public double Price;

}

public class SecurityWebService : WebService

{

private SecurityInfo Security;

public SecurityWebService()

{

Security.Code = "";

https://www.doczj.com/doc/566964624.html,panyName = "";

Security.Price = 0;

}

private void AssignV alues(string Code)

{

// This is where you use your business components.

// Method calls on Business components are used to populate the data.

// For demonstration purposes, I will add a string to the Code and

// use a random number generator to create the price feed.

Security.Code = Code;

https://www.doczj.com/doc/566964624.html,panyName = Code + " Pty Ltd";

Random RandomNumber = new System.Random();

Security.Price = double.Parse(new System.Random(RandomNumber.Next(1,10)).NextDouble().Format("##.##",null)); }

[WebMethod(Description="This method call will get the company name and the price for a given security code.",EnableSession=false)]

public SecurityInfo GetSecurityInfo(string Code)

{

AssignV alues(Code);

SecurityInfo SecurityDetails = new SecurityInfo();

SecurityDetails.Code = Security.Code;

https://www.doczj.com/doc/566964624.html,panyName = https://www.doczj.com/doc/566964624.html,panyName;

SecurityDetails.Price = Security.Price;

return SecurityDetails;

}

}

记住所有用户都能通过http访问Web Service,也许你会谈到代码中的机密商业数据和不希望其他人知道的数据,怎样保守数据机密。解决方法是保护商业逻辑功能块,只允许访问表示层,在c#中可以通过使用关键字"[Web Method]"来达到这个目的,我们看看下面的代码:

这个函数显示给公众,description标记用于描述Web Service的功能,由于我们不能存储任何会话数据,我们就将消除会话状态。

这个商业逻辑函数不被公众所知,我们不希望敏感的商业信息被公布在web上(注意:甚至将private改为public,公众仍然看不见,为什么呢?,这是由于没有使用[Web Method]关键字。)

我们可以在这个函数中利用商业逻辑获得最新的股票报价,为了这个目的,我在代码中添加了文本框以便输入公司名称,价格由一个随机函数产生。

我们把这个文件以SampleService.asmx保存在IIS目录下。我将他保存在虚拟目录"/work/aspx"下,在WEB浏览器中的相似如下图:

这个WEB页是由.NET framework生成的,我们没有创建这个页(这是由系统自动生成的,我们没有为他写任何一行代码,这附图是先前代码的副产品),准备使用的功能对单一的Web Service是相当合适的。

使用https://www.doczj.com/doc/566964624.html,和config.web文件可以很轻松的改变该页。不过要注意那个SDL规范的链接(即使我们我们使用WSDL,.NET 版仍然引用了SDL,这个问题在下一个版本中有希望矫正),这是Web Service的一个描述文件目的是创建一个代理对象,这基本上给出Web Service的一个大致介绍,如果你对这些都比较熟悉,你可以只看"Web-only"方法,SDL规范对所有私有函数和属性都未描述,SecurityWebService 类的SDL规范在例程A中看到。

怎样使用W eb Service

现在我们能够使用这个Web Service了,让我们输入一个值获得一个假的价格。

点击Invoke按钮,将显示一个下面这样的新窗口和Xml文档。

这显示了Web Service怎样发布信息,我们需要设计一个客户端来显示Xml文档,这个客户端应该是:

1、一个Web 页

2、控制台或Windows应用程序

3、能和移动电话交互的WML或Wmlscript

4、能在PDA上使用的Palm或Windows ce应用程序

在后面我将解释建立客户端的过程

可以通过http get方法直接调用Web Service,在这个例子中将不通过上面的web 页和点击invoke按钮获得Xml文档,我们直接用http get方法调用Xml文档,那么语法应下:

所以对我们这个例子而言,语句将是:

这与点击invoke按钮效果一样,将产生同样的结果。

现在我们知道怎样创建并使用一个Web Service,但我们的工作还只完成了一半。怎样使客户端发现Web Service呢?在internet网上通过什么途径搜索Web Service呢?是否通过象雅虎搜索引擎那样的搜索引擎呢?为了解决这些问题我们需要为Web Service创建一个"discovery" 文件。

创建"discovery" 文件

发现Web Service是询问并定位Web Service描述的过程,是访问Web Service 的预备过程,客户端通过发现Web Service的过程获得Web Service的存在,大小,怎样和他交互,"discovery" 文件是一个扩展名为:.disco的Xml文档。不必强制性地要求为每个Web Service创建一个"discovery" 文件,下面是本文例子的"discovery" 文件实例:

配置W eb Service

配置Web Service非常简单,与https://www.doczj.com/doc/566964624.html,应用文件相似,将.asmx和.disco文件复制到相应的目录下就行了。

Web Service的将来

Web Service的将来是非常光明的,现在不单是微软在发展Web Service技术,IBM 和SUN也致力于发展Web Service,SOAP toolkits已经可以在Apache 和Java Web servers上使用,不过我相信对于Web Service还需要做一点工作,尤其是Web Service 发现过程,她实在是太原始了。

Web Service将在WEB上映入一些新的观念,有一点我相信是付费浏览,就象付费电视一样,我们建立WEB站点并对用户收费,就象付费电视一样,用户只需要付一点费用,这在商业上是可行的。

附实例A

<?Xml version="1.0" ?>

<serviceDescription Xmlns:s0="https://www.doczj.com/doc/566964624.html,/"

name="SecurityWebService" targetNamespace="https://www.doczj.com/doc/566964624.html,/"

Xmlns="urn:schemas-Xmlsoap-org:sdl.2000-01-25">

<soap Xmlns="urn:schemas-Xmlsoap-org:soap-sdl-2000-01-25">

<service>

<addresses>

<address uri="http://localhost/work/aspx/SampleService.asmx" />

</addresses>

<requestResponse name="GetSecurityInfo"

soapAction="https://www.doczj.com/doc/566964624.html,/GetSecurityInfo">

<request ref="s0:GetSecurityInfo" />

<response ref="s0:GetSecurityInfoResult" />

<info>This method call will get the company name and the price for a given

security code.</info>

</requestResponse>

</service>

</soap>

<httppost Xmlns="urn:schemas-Xmlsoap-org:post-sdl-2000-01-25">

<service>

<requestResponse name="GetSecurityInfo"

href="http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo">

<request>

<form>

<input name="Code" />

</form>

</request>

<response>

<mimeXml ref="s0:SecurityInfo" />

</response>

<info>This method call will get the company name and the price for a given

security code.</info>

</requestResponse>

</service>

</httppost>

<httpget Xmlns="urn:schemas-Xmlsoap-org:get-sdl-2000-01-25">

<service>

<requestResponse name="GetSecurityInfo"

href="http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo">

<request>

<param name="Code" />

</request>

<response>

<mimeXml ref="s0:SecurityInfo" />

</response>

<info>This method call will get the company name and the price for a given security code.</info>

</requestResponse>

</service>

</httpget>

<schema targetNamespace="https://www.doczj.com/doc/566964624.html,/" attributeFormDefault="qualified"

elementFormDefault="qualified"

Xmlns="https://www.doczj.com/doc/566964624.html,/1999/XmlSchema">

<element name="GetSecurityInfo">

<complexType>

<all>

<element name="Code" Xmlns:q1="https://www.doczj.com/doc/566964624.html,/1999/XmlSchema" type="q1:string" nullable="true" />

</all>

</complexType>

</element>

<element name="GetSecurityInfoResult">

<complexType>

<all>

<element name="result" type="s0:SecurityInfo" />

</all>

</complexType>

</element>

<complexType name="SecurityInfo">

<all>

<element name="Code" Xmlns:q2="https://www.doczj.com/doc/566964624.html,/1999/XmlSchema" type="q2:string" nullable="true" />

<element name="CompanyName" Xmlns:q3="https://www.doczj.com/doc/566964624.html,/1999/XmlSchema" type="q3:string" nullable="true" />

<element name="Price" Xmlns:q4="https://www.doczj.com/doc/566964624.html,/1999/XmlSchema" type="q4:double" />

</all>

</complexType>

<element name="SecurityInfo" type="s0:SecurityInfo" />

</schema>

用.NET创建Web Service客户端

简介

本文是怎样创建.NET Web Service的后续篇,建议读者先看怎样创建.NET Web Service 一文。

SOAP的发展在挑战Internet极限。SOAP和HTTP使你能够在外部系统上登录并执行远程调用,我们来设想一下,你在墨尔本使用web浏览器,就能够通过Internet 调用放在西雅图公司总部大型机上的方法,这种体系结构使共同工作的web服务器在实现他们的商业逻辑的同时不会危及它们的安全机制。

Microsoft .NET体系结构中非常强调Web Service,构建Web Service接口对.NET Framework开发工具有很大的吸引力,因此很多讲建立Web Service机制的文章都是使用.NET Framework开发工具的。

在这篇文章中我们将谈论下面几个方面的问题

1、客户端怎样和Web Service通信的

2、使用已存在的Web Service创建代理对象

3、创建客户端。这包括:

Web 浏览器客户端

Windows应用程序客户端

WAP客户端

最好的学习方法是建立一个基于真实世界的实例。我们将使用一个已存在的Web Service,这个Web Service从纳斯达克获得股票价格,客户端有一个简单的接口,该接口的外观和感觉集中了建立接口的多数语句。

客户端描述

三种客户端都接受客户输入的同一股票代码,如果请求成功,将显示公司名和股票价格,如果代码不可用,将显示一个错误信息。客户端都设置有"Get Quote" 和"Reset"按钮以初始化用户的请求。

开发中的注意事项

我使用visual https://www.doczj.com/doc/566964624.html,作为我的集成开发环境,beta版没有结合.NET Mobile Web,因此,我们需要使用文本编辑器创建wap客户端,下一个版本的visual https://www.doczj.com/doc/566964624.html, 将整合入.NET Mobile Web 。

客户端怎样与W eb Service通讯

我们先复习一下Web Service的功能,在我得上一篇文章中曾展示一幅图(如图一),a点的用户将通过Internet执行远程调用调用b点web 服务器上的东西,这次通讯由SOAP和HTTP完成。

我们实际执行了b 点web 服务器上的方法吗?对于新手来说这是一个关键问题,由此你可以想到一系列的安全威胁,作为系统管理员我们不可能让随便什么人使用我们的web资源,让怀有恶意的人破坏敏感数据,而且也不能不提到带宽问题。我们还记得这是一个分布式应用程序,因此我们还不得不关心数据的配置。

为解决这些问题,我们需要复制在用户web 服务器上的对象行为,在我们的例子中,我们需要复制b点Web Service针对a点的功能,这就意味着我们要创建充当原始web servcie行为的代理对象(proxy object),这个代理对象象原始Web Service那样具有所有的数据接口。那么我们怎样得到公共数据接口的呢?

各位是否还记得Web Service代码中的关键字Web only,每一个Web only的方法都会被复制到代理对象中,这样将保护我们的敏感数据,避免受到来自Web Service终端(比如:b点)的有恶意的黑客的攻击。这种方法我们称为在a、b之间进行的"对象数据同步交换",这一过程称为创建"对象代理".

现在看看图1的修正版,如下图:

代理对象是Web Service的基础慨念,所以创建Web Service的第一步是创建代理对象,然后我们可以通过多种平台(Web浏览器, WAP, Personal Digital Assistant [PDA], SOAP客户端)从代理对象获得数据。

创建代理W eb Service对象

在.NET Framework中携带了一个创建代理对象的工具"WebServiceUtil.exe",在MS_DOS快捷窗口使用这个工具创建代理对象。

语法如下:

上面的是必须要的参数,现在解释一下其他重要参数:

下图是一个创建代理对象的例子

这个命令在当前目录下创建了一个叫LiveQuote.cs的文件。这是一个在WebServiceClients名字空间中的C#文件,当你创建客户端时,将认识到WebServiceClients名字空间的重要性。现在编译C#类,便产生了一个连接客户端工程的DLL文件。,将其置于"bin" 目录下。

这样就在bin目录下创建了一个叫LiveQuotes.dll的文件。如果想了解有关编译c#类的情况可以参考.NET SDK帮助文档。

用这两个命令创建了一个代理对象,现在我们准备从Web Service获得数据。代理对象具有所有的公共接口,可访问任何商业逻辑函数,我们甚至不需要注册DLL文件就可以办到。我们只需要编译源代码并插入bin目录下的dll文件即可。这一切对于Web 服务器访问DLL文件足够了。

如果你不熟悉https://www.doczj.com/doc/566964624.html,的配置机制你也许会感到困惑,不注册dll文件是为了让操作系统验证它。我们仅将它放在bin目录下.NET Framework在运行时将带上它。

现在我们创建客户端,创建一个客户端的步骤是:

1、创建一个代理对象的实例

2、在代理对象上执行方法调用

3、捕获从Web Service返回的xml格式的数据

4、写一个特殊的客户端控件显示结果

创建W eb 页客户端

Web服务监听器监听HTTP GET, HTTP POST和SOAP 方法调用。首先我们用Visual https://www.doczj.com/doc/566964624.html,创建一个Web 工程

打开new project对话框,在project type栏选择visual c# project,在template栏中选择web application,创建一个新工程并在默认的web服务器下创建一个虚拟目录LiveQuotes_Clients,系统同时在DriveName/wwwroot目录下创建一个相同名字的物理目录。

2)右击工程的"References",在弹出的菜单中单击add References

点击"project"选项,导航到代理对象DLL

3)使用T oolbox Web form controls创建https://www.doczj.com/doc/566964624.html,文件,如果你学过vb,那么这是一件非常轻松的工作。

我将默认文件名WebForm1.aspx修改为Client_WebForm_POST.aspx,当我向web 窗体插入控件时,后台自动在一个叫Client_WebForm_POST.cs的文件中生成c#代码,当引用dll文件时,我们希望系统能自动插入相关代码,但是它没有这样做,这是https://www.doczj.com/doc/566964624.html,试用版的一个小故障,我们需要手工输入下面这行代码以访问WebServiceClients名字空间。

代理对象livequotes.DLL属于WebServiceClients名字空间,因此我们需要通过代码访问WebServiceClients名字空间,我们还需要写一些代码处理用户交互事件,比如点击按钮:

public void btn_GetQuote_Click (object sender, System.EventArgs e)

{

LiveQuotes ProxyLiveQuotes = new LiveQuotes();

try

{

label_PriceV alue.Text =

ProxyLiveQuotes.MSNGetLastQuote

(txt_CompanyCode.T ext).T oString();

label_NameV alue.T ext =

ProxyLiveQuotes.MSNGetCompanyName

(txt_CompanyCode.T ext).T oString();

}

catch

{

label_PriceV alue.Text = "0.0";

label_NameV alue.T ext = "The Company data is not available";

}

}

public void btn_Reset_Click (object sender, System.EventArgs e)

{

label_PriceV alue.T ext = "0.0";

label_NameV alue.T ext = " ";

}

完整的代码见附录1,由于可能输入错误的公司代码,因此我们用try..catch捕获错误并处理例外。

4)点击Debug ->Start开始编译代码并显示浏览器

相关主题
文本预览
相关文档 最新文档