首页 > 编程 > .NET > 正文

ASP.NET Web Service

2024-07-10 13:11:56
字体:
来源:转载
供稿:网友

    现在internet正在不断地发展着,在互联网应用刚开始的时候,我们浏览的网页只是静态的,不可交互的。而现在随着技术的日益发展,将提供给网页浏览者一个可编程的web 站点。这些站点将在组织、应用、服务、驱动上更加紧密的结合在一起,这些站点将通过一些应用软件直接连接到另一个web 站点,这些可编程的web 站点相比传统的web站点来说,将变得更加能重复使用,也更加智能化!
  
    .net平台给我们提供了一种运行环境,即公用语言运行环境(clr,common language runtime)。对 clr来说,它提供了一种内置机制来创建一个可编程的站点,、对于web 程序开发者和vb 程序员来说,这将是一致、熟悉的。这种模型是可以重复使用,也可以再扩展。 它包含了开放的internet标准(http, xml, soap, sdl)。以便它能被网页浏览者访问。
    asp.net 使用.asmx 文件来对web services的支持。.asmx 文件和.aspx文件一样都属于文本文件。它包含在.aspx文件之中,成为asp.net应用程序的一部分。
  
    下面我们将举一个简单的例子来介绍.asmx文件,我们还是从"hello,world"这个经典的例子说起,代码如下:
  <!-- 文件名:webservice/sisam.asmx -->
  <%@ webservice language="vb" class="helloworld" %>
  imports system.web.services
  public class helloworld :inherits webservice
  public function <webmethod( )> sayhelloworld( ) as string
  return("hello world")
  end function
  end class
  
   说明:
  
    1.编码最开始必须进行webservice声明,从而定义这个文件为一个web service。而且,在同一行中设置好编程语言的类型。
  
    2.然后,引入名字空间system.web.services。注意,这个名字空间属于最基本的元素,必须要包含它。
  
    3.接着,声明service中的功能模块,也就是类模块,这里的类名叫helloworld。这个类来源于基类webservice,而且应该是public类型。
  
    4.最后,定义service的可访问方法。在表示方法的符号前面,要设置好自定义属性。对应于c#语言,属性值就是[webmethod];对应于vb,就是。如果没有设置这个属性,那么这个方法就不能从service中访问。一个局部应用可以使用任何的public类型的类,但是只有具备[webmethod]的类才可以通过soap被远程地访问。
  
    当对service的请求发生时,.asmx文件将自动地被asp.net运行环境所编译。随后的请求就可以由缓冲的预编译类型对象执行。
  
    为了测试编写好的代码,我们需用一个支持asp.net的web服务器。假设这个web服务器的名称叫做server1,其上有一个虚拟目录test。请跟随下面步骤开始测试:
  
  
    1.将代码保存为helloworld.asmx
  
    2.放到web服务器foo的虚拟目录bar下
  
    3.打开internet explorer5,在地址栏输入http://server1/test/helloworld.asmx
  
    这时,我们将看到关于这个web service的公用方法-也就是那些标记为webmethod属性的字符,并得知调用这些方法可以使用的协议,比如soap或者http get。
  
    在internet explorer的地址栏中输入http://foo/bar/helloworld.asmx?sdl后,将产生基于服务描述语言(service description language :sdl)语法的具备相同信息的xml文件。这个sdl文件非常重要,客户端就是使用它来访问service。

    从客户端进行访问:
  
    除了允许开发者使用的创建web services的技术以外,microsoft的.net框架给客户端提供了一套访问并使用web services的精致且高深的工具和代码。由于web services是基于如简单对象访问协议soap(simple object access protocol)和http这样的开放协议标准的,从而,我们就可以使用这种客户端技术使用非asp.net的web services。当然,这也需用高水平地合成asp.net web services和这种客户端技术。
  
    sdk中有一个工具叫做webserviceutil.exe,我们可以使用它来下载一个web services的sdl描述语言,并创建表达这个service的代理类。比如,当我们输入以下命令,就可以创建一个叫做helloworld.cs的代理类:
  
     webserviceutil /c:proxy /pa:http://somedomain.com/somefolder/helloworld.asmx?sdl 
  
    这个类看起来与前面创建的类非常相似。它包含一个方法sayhelloworld,该方法返回一个字符串。将这个代理类编译到一个应用程序中,然后调用这个代理类的方法,结果就是:通过http,这个代理类包装soap请求,然后接收soap编码响应,最后汇集成为一个字符串。
  
    请看关于web service的一个客户端例程:
  
  
    客户端访问的文件:clint.aspx,内容如下:
  
  
  <%@ import namespace="datatypesservice" %>
  
  <html>
  <style>
  div
  {
  font: 8pt verdana;
  background-color:cccccc;
  border-color:black;
  border-width:1;
  border-style:solid;
  padding:10,10,10,10;
  }
  
  </style>
  
  <script language="vb" runat="server">
  
  public sub page_load(sender as object, e as eventargs)
  
  dim d as datatypes = new datatypes()
  message1.innerhtml = d.sayhello()
  message1.innerhtml = message1.innerhtml & d.sayhelloname("bob")
  message3.innerhtml = message3.innerhtml & d.getmode()
  
  dim myintarray as integer() = d.getintarray()
  dim mystring as string = "contents of the array:<br>"
  
  for i = 0 to myintarray.length - 1
  mystring = mystring & myintarray(i) & "<br>"
  next
  
  message2.innerhtml = message2.innerhtml & mystring
  
  dim myorder as order = d.getorder()
  message4.innerhtml = message4.innerhtml & "<br>orderid: " & myorder.orderid
  message4.innerhtml = message4.innerhtml & "<br>price: " & myorder.price
  
  dim myorders as order() = d.getorders()
  message5.innerhtml = message5.innerhtml & "<br>orderid: " & myorders(0).orderid
  message5.innerhtml = message5.innerhtml & "<br>price: " & myorders(0).price
  
  end sub
  
  </script>
  
  <body >
  <h4>using datatypes with web services</h4>
  
  <h5>methods that return a primitive (string): </h5>
  <div id="message1" runat="server"/>
  
  <h5>methods that return an array of primitives (integers): </h5>
  <div id="message2" runat="server"/>
  
  <h5>method that returns an enum: </h5>
  <div id="message3" runat="server"/>
  
  <h5>method that returns a class/struct: </h5>
  <div id="message4" runat="server"/>
  
  <h5>method that returns an array of classes/structs: </h5>
  <div id="message5" runat="server"/>
  
  </body>
  </html>
  
  
    在客户端程序中,我们使用<%@ import namespace="datatypesservice" %>来引入datatypesservice这个我们自定义的名字空间。然后在程序中只是调用了datatypesservice中的方法。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表