微软基于Web计算的框架结构分析
胡朝晖(编译)
三、Web服务的编写
这里我们可以写一个最简单的Web服务来说明这种新技术的使用,该Web服务以字符串的形式提供当前的服务器的时间(可以精确也可以不精确到秒)。程序是以标准的标记符"<%@...%>"开始的,在该标记符内,WebService告诉ASP.NET该页的代码是作为一个Web服务出现的。Language告诉ASP编译这个页所使用的语言是VB,然后ASP.NET就会使用Visual Basic.NET来进行代码的编译。CLASS属性告诉ASP.NET当前类对象的名称为TimeService。
具体的代码如下:
<%@ WebService Language="VB" Class="TimeService"%>
' 引入名字空间' 需要Web Service Imports System Imports System.Web.Services ' 建立一个新的类,该类必须继承系统提供的基类WebService Public Class TimeService : Inherits WebService '在类中建立我们所需要的函数,并标记为WebMethods Public Function <WebMethod()> GetTime (ShowSeconds as Boolean) As String ' 完成该函数的功能:发现当前的时间,格式化,并以字符串形式返回 Dim dt as DateTime If (ShowSeconds = TRUE) Then GetTime = dt.Now.ToLongTimeString Else GetTime = dt.Now.ToShortTimeString Endif End Function End Class
| 为了允许开发人员使用Web服务来开发客户端应用,需要在设计和开发的时候给他们提供一定的信息。比如,一个Web服务的客户端需要知道Web服务所暴露的方法和相关的参数以及所支持的协议,这个和一个标准的COM所携带的类型库的概念很类似。但是类型库是COM所专用的,而我们所提供的方法应该是和具体的体系结构无关的,所以需要编写一个通用的服务方法的描述。ASP.NET提供了一个可描述的服务,当编译一个WEB服务的时候,ASP.NET提供了一个文件列表用来说明服务所支持的协议,它所提供的方法和参数等等。这个文件是 XML形式编码并使用称为SDL(Service Descriptor Language)的语言进行描述的。可以通过http://WebServer/ specifiedDirectory /TimeService.asmx?SDL这样的形式来得到SDL语言。
当我们用VB或者VC来编写COM组件的时候,我们一般需要编写一个类型库来描述该COM组件所能提供的功能,而对ASP.NET来说,它能够自动的生成一个SDL文件,也可以先编写一个SDL文件,然后通过系统工具生成一个服务的模板文件。
一个典型的SDL文件具体内容如下:
<!-- 标准的XML头,描述版本信息和其他相关信息--> <?xml version="1.0"?> <!-- 元素serviceDescription是文件的根节点,里面的内容是对Web服务的描述 --> <!-- 值TimeService表示服务的名称 --> <serviceDescription name="TimeService"> <!-- 元素serviceDescription包括两个子元素,一个是协议描述,另外一个是文档的schema描述 --> <!-协议描述用来告诉客户端开发人员我这个Web服务所支持的协议,并告诉他请求和响应数据的编码格式 --> <!-这里我们描述了HTTP GET的操作,一般有三种方法HTTP GET,HTTP POST和SOAP三种方法 --> <httpget> <service> <requestResponse name="GetTime" href="http://WebServer/specifiedDirectory/TimeService.asmx/GetTime"> <request> <param name="ShowSeconds"/> </request> <response> <mimeXml ref="s1:string"/> </response> </requestResponse> </service> </httpget>
<!- 这里可以对其他的协议进行描述,比如httpget 和 soap -> <!- schema表示对服务的抽象定义,它和采用什么协议和它进行通讯无关 -> <!- 它实际上包含了对服务包含的函数的名称,参数和返回值的表示 ->
<schema> <element name="GetTime"> <complexType> <element name="ShowSeconds" type="boolean"/> </complexType> </element> <element name="GetTimeResult"> <complexType> <element name="result" type="string" nullable="true"/> </complexType> </element> </schema> </serviceDescription>
|
|
|