如何创建和使用Web服务
如何创建和使用Web服务
简介
.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服务作为一个普通的类进行创建,在方法的前面有一个<WebMethod()>宏,表明这个方法是通过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服务访问的方法都有前导符<WebMethod()>,在.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服务的方法写一点代码,并添加<WebMethod()>宏,那些代码看上去就和本地组件代码一样。使用Web服务也是很简单,这还要归功于Proxy类的使用。如前所述,利用诸如Visual
Studio .NET那样的工具来创建一个Proxy类也是非常简单的。
- 1微软的太原OA信息化实践:数字神经系统DNS
- 2太原OA信息化资料
- 3KPMG的2000年太原OA信息化研究报告(英文)
- 4信息管理与太原OA信息化
- 5靠近KM角色
- 6回复是乱码
- 7E-Learning as a Strategic Corporate Asset
- 8太原OA信息化成熟度模型——实施太原OA信息化的诊断器
- 9开发太原OA信息化技术:An Encompassing View on KnowMore, Know-Net, and
- 10知识经济与管理创新
- 11太原OA信息化中的人际关系
- 12什么是太原OA信息化?
- 13管理数据财富
- 14制订企业IT规划时,需要解决的关键规划问题包括:
- 15太原OA信息化项目的分类
- 16[推荐] 如何选择太原OA信息化战略?(Morten T. Hansen,Nitin Nohria和Thomas Tie
- 17Slide:企业门户
- 18太原OA信息化软件系统简介
- 19泛普OA办公软件IT整体规划方法论
- 20太原OA信息化的演变和发展
- 21泛普信息系统的框架和模型包括:
- 22收益最优的太原OA信息化模式(Peter Novins、Richard Armstrong)
- 23[编译] 太原OA信息化测度:目标、过程及方法(夏敬华译)
- 24Defining the Vision
- 25看APQC如何实施和考评太原OA信息化?(by AMT 太原OA信息化研究小组)
- 26协同OA个人办公管理都能实现些什么功能呢?
- 27[编译] 选择太原OA信息化的触点(黄波译)
- 28太原泛普OA软件的行政资源管理介绍
- 29以创新为重
- 30Key KM Functionality
成都公司:成都市成华区建设南路160号1层9号
重庆公司:重庆市江北区红旗河沟华创商务大厦18楼