如何创建和使用Web服务(转)_csdn产品小助手的博客-程序员宅基地

技术标签: 人工智能  



作者:孟宪会       出自:【孟宪会之精彩世界】      发布日期: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  Stringas 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  Integeras DataSet
         Return GetDataSet(SQL Query)  ' 这里的参数SQL用来得到某分类(catID)的所有FAQ
       End Function
      
    
      <WebMethod()>  Public  Function GetFAQ(FAQID  as  Integeras 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,如需转载请自行联系原作者

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33672400/article/details/90089367

智能推荐

网站怎么备案?_蓝队云张-的博客-程序员宅基地

首先,来说说备案。所谓备案,就是我们常说的网站备案,备案的全称叫做ICP备案。ICP也就是Internet Content Provider,指的是网络内容服务商 ,即向广大用户综合提供互联网信息业务和增值业务的网络运营商。ICP备案是信息产业部对网站的一种管理,为了防止非法网站。就像是官方认可的网站,就好像开个小门面需要办营业执照一样。备案的目的就是为了防止在网上从事非法的网站经营活动,打击不良互联网信息的传播。根据中华人民共和国国务院令第291号《中华人民共和国电信条例》、第292号《互联网信息..

【Groovy】编译时元编程 ( 利用注解进行 AST 语法树转换 | 定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 | AST 转换接口实现 )_韩曙亮的博客-程序员宅基地

一、利用注解进行 AST 语法树转换、1、定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口、2、AST 转换接口实现、3、定义 Groovy 类并使用 @Compile 注解修饰需要拦截的方法、4、执行结果、

PKCS1签名&PKCS7签名&PKCS7信封格式_amuxie_1899的博客-程序员宅基地_pkcs1签名

PKCS1签名&PKCS7签名&PKCS7信封格式1.1.1.1  PKCS#1标准格式签名1.1.1.1.1 PKCS#1签名格式被签名的数据为字节数组。对给出的被签名原数据进行HASH运算,HASH结果按PKCS#1标准进行填充:B = 00 01 ff ff … ff 00 30 … H[00],H[01],…,H[13]其中H[00],…,H[13]为HAS

使用Gson教程进行Android JSON解析_danpincheng0204的博客-程序员宅基地

除XML之外, JSON是API响应中使用的非常常见的格式。 它的简单性已经为相当冗长的XML赢得了广泛的采用。 此外,JSON可以轻松地与REST结合使用,从而生成清晰易用的API。 Android可以在JSON包摘要中找到有人在其SDK中支持JSON。 但是,使用这些类,开发人员必须处理低级JSON解析,我认为这是乏味且乏味的。 因此,在本教程中,我将向您展示如何执行自动JSON解析...

无法打开包括文件: “ocl_macros.h”: No such file or directory_roxy_L的博客-程序员宅基地

并行处理显示错误:无法打开包括文件: “ocl_macros.h”: No such file or directory尝试了在项目属性-C/C++-常规中将 ‘使用Windows运行时扩展’ 设为 ‘是’ ,但导致了另一个错误E1696 命令行错误: 无法打开 元数据 文件 “platform.winmd”可以选择需要链接该头文件的cpp属性,在配置属性-C/C++-常规的附加包含目录中添加该头文件的地址。本机中将ocl_macros.h放在C:\Users\ASUS\source

c语言字符串字面值,c – 由于字符串字面值被认为是一个左值,为什么绑定lvalue引用是const?..._weixin_39880632的博客-程序员宅基地

我知道有一些类似的主题已经(如this).这个主题的例子是:std::string &amp; rs1 = std::string();显然,std :: string()是一个右值.但是,我的问题是为什么s1合法而s2不是?const std::string&amp; s1 = "String literal";std::string&amp; s2 = "String literal";标准清...

随便推点

SQL知识点总结_马农星人的博客-程序员宅基地

数据库语法1.从表中选取 LastName 列的数据:Select LastName from persons· SELECT - 从数据库表中获取数据· UPDATE - 更新数据库表中的数据· DELETE - 从数据库表中删除数据· INSERT INTO - 向数据库表中插入数据2..获取名为 "LastName" 和 "FirstName" 的列的内容

关于MCNS/DOCSIS兼容RF接口的RF接口MIB_CareChere的博客-程序员宅基地

组织:中国互动出版网(http://www.china-pub.com/)RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)E-mail:[email protected]译者:郭大刚(guodagang [email protected])译文发布时间:2002-1-18版权:本中文翻译文

springboot实战(1)springboot基本配置_-------江湖-------的博客-程序员宅基地

1 入口类和@SpringBootApplicationpackage com.wuk.springbootHello;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.spring...

【EasyUI】关于EasyUI中numberbox onblur事件失效的问题_寒泉Hq的博客-程序员宅基地_easyui numberbox onblur

easyui-numberbox 与 easyui-validatebox参考以下:easyui-numberbox不像easyui-validatebox那样能绑定blur事件,最简单的解决方法可以将class="easyui-numberbox"换为class="easyui-validatebox",但是输入框的样式会有点不一样。如果一定要使用easyui-numberbox,可以使用...

ubuntu18.04虚拟机重启后分辨率降低的问题解决_dongxia_dl的博客-程序员宅基地_ubuntu重启后分辨率降低

参考链接VMware中Ubuntu 出现Unknown Display问题解决_xuguokun1986的博客-程序员宅基地

(K8S实践0)Centos7.6部署k8S(v1.14.2)集群_MJ-ZJK的博客-程序员宅基地

Centos7.6部署k8S(v1.14.2)集群系统环境说明:一、docker安装1.安装依赖包[[email protected] ~]# yum install -y yum-utils device-mapper-persistent-data lvm22.设置Docker源[[email protected] ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo3.Docker

推荐文章

热门文章

相关标签