作者:孟宪会       出自:【孟宪会之精彩世界】      发布日期:2003年6月18日

简介

.NET最强大的一个方面之一就是可以利用它创建Web服务。一个Web服务就是一个网站所提供的供其它网站调用的外部接口。举个例子来说,某个金融公司可以为与它的贸易伙伴通过Web服务提供详细的股票报价,这些信息可以是通过Web页面进行读取和显示的,也可以是从客户的桌面电脑的应用程序里读取的。

本文就对Web服务的其中两个方面进行说明:一是如何创建Web服务;二是如何使用Web服务。作为例子,我们以来自ASPFAQs.com(http://www.aspfaqs.com/aspfaqs/)的FAQS(常见问题解答)的Web服务来解释如何创建一个Web服务。

创建Web服务

在你创建一个Web服务之前,你首先必须问问自己:“我要向我的用户提供什么服务?”。本文的目标就是创建这样一个Web服务:让其它的用户在他们自己的网站上显示来自ASPFAQs.com的常见问题解答(FAQS)的列表。比较理想的功能是限制其他的网站只能够查看FAQS分类和按分类排列的FAQS,如果你想查看一个问题的答案,就让用户去访问提供服务的网站http://www.aspfaqs.com。本文例子的Web服务最终向其他网站提供如下的功能:

1,浏览所有FAQ分类的列表
2,浏览某一分类里的所有FAQS。
3,浏览某一个FAQ的问题,但不包含答案。

创建一个Web服务是很简单的,首先创建一个.asmx文件(你可以用Visual Studio .NET或你自己喜欢的任何文本编辑器,推荐使用Web Matrix,它有创建Web服务的模板),Web服务作为一个普通的类进行创建,在方法的前面有一个宏,表明这个方法是通过Web服务来访问的。()>

就ASPFAQS.com的Web服务来说,首先创建三个通过Web服务访问的方法,GetCategories, GetFAQsInCategory和GetFAQ,分别实现上面提出的任务1,2,3。并创建一个私有方法GetDataSet,按传递过来的SQL查询组装成一个DataSet。下面就是实现的代码:

<%@ WebService Language="VB" Class="ASPFAQs" %>
    Imports System.Web.Services
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Configuration
    
    Public Class ASPFAQs
    
      ' 创建私有功能方法GetDataSet
      Private Function GetDataSet(strSQL as String) as DataSet
        '1. 创建一个SqlConnection连接对象
        Dim myConnection as New SqlConnection(ConnectionString)
    
        '2. 创建COMMAND对象,传入SQL参数
        Dim myCommand as New SqlCommand(strSQL, myConnection)
    
        myConnection.Open()
    
        '3. 创建DataAdapter对象
        Dim myDataAdapter as New SqlDataAdapter()
        myDataAdapter.SelectCommand = myCommand    
    
        '4. 生成DataSet并关闭连接
        Dim myDataSet as New DataSet()
        myDataAdapter.Fill(myDataSet)
        myConnection.Close()
        
        '返回DataSet
        Return myDataSet  
      End Function
        
      ' 创建实现实现三个任务的方法
      <WebMethod()> Public Function GetCategories() as DataSet
        Return GetDataSet(SQL Query) '这里的参数SQL用来得到所有FAQ分类
      End Function
    
    
      <WebMethod()> Public Function GetFAQsInCategory(catID as Integer) as DataSet
        Return GetDataSet(SQL Query) '这里的参数SQL用来得到某分类(catID)的所有FAQ
      End Function
      
    
      <WebMethod()> Public Function GetFAQ(FAQID as Integer) as DataSet
        Return GetDataSet(SQL Query) '这里的参数SQL用来得到某FAQ(FAQID)的信息
      End Function
    End Class

正如前面所说的那样,三个通过Web服务访问的方法都有前导符,在.asmx文件的第一行有一个@WebService标明所使用的语言和类名。这个Web服务名为ASPFAQs,和类同名。一旦创建好了.asmx文件,就把它保存到可通过Web访问的目录下,然后就可以通过Web浏览器进行访问。例如:假如Web服务文件名字是ASPFAQs.asmx,并保存到/WS目录下,这样任何人就可以通过http://aspnet.4guysfromrolla.com/WS/ASPFAQs.asmx进行访问,就可以看到Web服务使用的所有公共方法,你还可以提供输入参数看到返回的结果。()>

需要说明的是:你在进行需要参数的Web服务的方法的调用时,不必担心传入参数的类型是否正确,Web服务代码会自动确保传入参数类型的正确性,在上面的例子中参数类型为整型,如果恶意的用户企图向Web服务传入象0 'malicious SQL statement这样的参数,就会返回错误的信息:annot convert 0 'malicious SQL to System.Int32. Parameter name: type --> Input string was not in a correct format。然而,如果你传入字符串类型的参数,你应当记住把单个撇号(’)替换成两个连续的撇号('')。

使用Web服务

上面,我们创建了Web服务,下面就看看别的网站如何使用这个Web服务。为了方便起见,我们把使用Web服务的客户网站叫做“消费者”,把提供Web服务网站就“生产者”。最本质的东西就是消费者必须知道要调用生产者的什么方法。如果需要参数的话,这些参数必须转换成XML格式进行传入,消费者向生产者发送HTTP请求,并指明要调用的方法和参数,参数可以是通过QueryString形式的SOAP请求或者是以POST的请求头的形式进行传递。

生产者收到发送过来的请求后,对输入参数进行解包,并调用指定类的适当的方法。如果调用完成,就把结果返回,进行打包,然后发送回消费者。消费者收到响应结果,进行解包,就完成了Web服务的调用。

很明显,其实我们在使用Web服务时一点也不用担心发送的HTTP信息的语义,为了达到这样的目的,我们可以使用一个叫做Proxy的类,Proxy的作用是充当消费者应用程序或Web页面和生产者实际Web服务之间的中间过程。对生产者Web服务的每一个方法来说,同时也在Proxy类里有一个相同的方法,Proxy的职责就是处理所有传送的复杂消息,这种复杂性在Proxy类里被隐藏起来的,我们只需要简单地调用该类的方法即可,不必关心语义的事情。

此时你也许很迷惑,但这种迷惑也是可以理解的,这本身就是一个很令人迷惑的话题。要理解的最基本的事情就是:当调用Web服务时消费者和生产者之间的HTTP通信可能是复杂的,而且可能会需要编写不少的代码。我们更愿意看到的是,使用Web服务的页面调用Web服务时就象使用一个本地的组件一样方便,为了实现这一目标,我们使用Proxy类,它的公用接口与Web服务的方法相对应。如果你此时还感到迷惑的话,请看看这个演示文档http://aspnet.4guysfromrolla.com/code/ConsumeWS.ppt,它将向你解释如何使用Web服务。

利用Visual Studio .NET创建Proxy类

在Visual Studio .NET里创建Web服务使用的Proxy类是件轻而易举的事情,在ASP.NET Web项目里,在“引用”上单击右键,选择“添加Web引用”,这时会弹出一个对话框,要你输入一个URL地址,请输入http://aspnet.4guysfromrolla.com/ws/ASPFAQs.asmx,然后你就会看到这个Web服务的描述(就象你在Web浏览器里直接看到的那样),最后单击“添加引用”按钮,Visual Studio .NET会自动为你创建一个Proxy类,并且进行编译。当你把它添加进你的工程里时,Proxy类的名称空间可能就是你的网站地址,比如:com.4guysfromrolla.aspnet,当然你还可以任意改成其他的任何名字。从你的Web页面里通过Proxy类调用Web服务就象你使用本地组件进行调用一样方便。假设你想显示ASP.NET类别(category ID为22)FAQS的列表,我们可以通过调用Web服务的GetFAQsInCategory方法,在参数里传入22,并把返回的DataSet绑定到一个DataGrid,代码可能象如下的写法那样:

'.aspx 页面中的其他HTML内容
    <asp:datagrid id="dgCategoryFAQs" runat="server" />
    
    Private Sub Page_Load(sender as Object, e as EventArgs)
      '创建Proxy类的实例
      Dim consumeWebService as com._4guysfromrolla.aspnet.ASPFAQs
      Set consumeWebService = New com._4guysfromrolla.aspnet.ASPFAQs
      
      '把GetFAQsInCategory结果绑定到dgCategoryFAQs
      dgCategoryFAQs.DataSource = consumeWebService.GetFAQsInCategory(22)
      dgCategoryFAQs.DataBind()
    End Sub

检查一下上面的代码,你可能不明白对com._4guysfromrolla.aspnet.ASPFAQs Proxy类的调用实际上就是远程Web服务的调用,当调用Proxy类的GetFAQsInCategory方法时,会进行复杂的数据通讯(HTTP的请求/响应)。

结论

在本文里,我们讲述了如何创建Web服务,并如何在ASP.NET页面里使用它。微软公司实际上在.NET里已经简化了创建和使用Web服务的过程。创建一个Web服务简单到只需创建.asmx文件,然后为Web服务的方法写一点代码,并添加宏,那些代码看上去就和本地组件代码一样。使用Web服务也是很简单,这还要归功于Proxy类的使用。如前所述,利用诸如Visual Studio .NET那样的工具来创建一个Proxy类也是非常简单的。()>

本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2007/12/04/982592.html,如需转载请自行联系原作者

如何创建和使用Web服务(转)相关推荐

  1. 在C++中创建并使用Web服务

    web服务的确是.net中让人激动的部分--但它们本身比.net要大.其中的道理很简单.几乎所有你能叫出名字的服务都有一些执行服务器端代码的机制:你在浏览器的地址栏中输入一个URL:接收到你的请求,服 ...

  2. 【VMCloud云平台】SCVMM配置(九)创建Web服务模板

    继续上一篇完成SCVMM创建SQL服务模板后,本篇将继续讲述云平台中的第一个组件--SCVMM创建第一个Web服务模板(即下图中的SCVMM01,蓝色为未实现,绿色为计划中,红色为实施中). 1. 登 ...

  3. 手把手教你在.NET中创建Web服务

    最近发现在.NET平台下使用Web服务还是很简单的. 下面举个在.NET平台下创建Web服务的简单例子.首先用Visul Studio .Net创建一个C# 项目Asp.Net Web服务程序,源代码 ...

  4. LabVIEW创建Web服务

    LabVIEW创建Web服务 在LabVIEW项目中开发Web服务,组合并配置构成Web服务的VI和其他文件.按照下列步骤创建一个Web服务项目和两个HTTP方法VI. 创建一个组织Web服务文件的L ...

  5. ASP.NET 创建、发布、使用Web服务的详细方法

    一.创建Web服务 1.首先,打开VS(本例以VS2017为例).创建一个ASP.NET Web 应用程序,位置和名称自定义,本例我把这个项目创建在桌面,名字叫helloWho.然后点击[确定],在弹 ...

  6. 用 WSAS 和 Eclipse 简化 Web 服务的创建

    用 WSAS 和 Eclipse 简化 Web 服务的创建 需要快速创建 Web 服务?请考虑使用 Eclipse 的 Web Services Application Server 插件 文档选项 ...

  7. 利用微软Atlas消费外部Web服务

    摘要 为了从Atlas中消费外部Web服务,你可以为这些服务构建一个基于服务器的Web服务代理.幸好,你可以利用Visual Studio和Atlas特征来处理这其中的大部分工作.   一.引言 如今 ...

  8. WS-Eventing、WS-Transfer Web服务标准

    传输(Transfer)     WS-Transfer详细说明了对通过Web服务进行访问的数据实体进行管理所需的基本操作.要了解WS-Transfer需要介绍两个新术语:工厂(Factory)和资源 ...

  9. 使用ASP.Net 3.5 的Ajax与Web服务开发实例

    本文继续介绍使用ASP.NET3.5中的AJAX环境中如何从客户端JavaScript调用Web服务方法.编写本文的目的在于让大家深刻了解基于ASP.Net3.5的Ajax和Web的服务,虽然例子比较 ...

  10. WS-Eventing、WS-Transfer Web服务标准

    传输(Transfer)     WS-Transfer详细说明了对通过Web服务进行访问的数据实体进行管理所需的基本操作.要了解WS-Transfer需要介绍两个新术语:工厂(Factory)和资源 ...

最新文章

  1. android 2.2.3,升还是不升 Android2.2与2.3性能测试对比
  2. STM32CubeMX软件工程描述_USART配置过程
  3. c# getresponsestream返回byte[]_C#通过SharpZipLib库创建压缩文件
  4. 什么是面向对象,为什么要面向对象
  5. 华东理工大学和暨南大学计算机考研,2016华东理工大学VS暨南大学 孰强孰弱?...
  6. 使用Alcatraz来管理Xcode插件
  7. Linux脚本(shell)详解
  8. 数据库学习总结与心得
  9. Uniapp Android原生插件开发
  10. 软件工程与计算-11-人机交互设计
  11. 联想android刷机教程,超详细的联想刷机教程~带你嘻刷刷
  12. windows10桌面_三大虚拟桌面软件对比,总有一款适合你!
  13. 飞思卡尔系列单片机的censorship的使用
  14. 论文笔记:WORD TRANSLATION WITHOUT PARALLEL DATA
  15. 1.1 计算机语言发展史以及未来方向
  16. jzoj 5571 ffs
  17. 论文精读|VRCNet:变分关联点云补全网络(CVPR2021)
  18. java机试题---2021(算法)
  19. 【Unity3D插件】AVPro Video2.x rtmp流媒体播放设置问题
  20. 全球首例!韩国或将禁止苹果和谷歌向开发者收佣

热门文章

  1. [转]Ogre:Hardwarebuffer
  2. MVC整体流程机制原理概述
  3. LINQ to SQL集成到应用程序中需考虑的一些问题
  4. 智能优化算法:原子搜索优化算法 -附代码
  5. 从零基础入门Tensorflow2.0 ----九、44.5 keras转换成具体函数
  6. 从零基础入门Tensorflow2.0 ----六、27 卷积神经网络
  7. day12--k近邻算法KNN
  8. 数据结构:实验四 图的遍历
  9. 2021筠连中学高考成绩查询,四川筠连中学2021年排名
  10. android schedule 参数,android – requestLocationUpdates minTime参数的用途