Web Service学习笔记(1)Web Service的宗旨是创建不需要用户界面就能与其他应用程序交互的Web应用程序。
举例说明它的优点,假如你正在为一家股票投资公司创建网站,你并不需要把不同证劵交易所得数据库与自己的后台数据库进行整合,因为你的应用程序可以使用Web Service,并使用XML格式交换数据。
Web Service是松耦合的,它与服务器端和客户端使用的操作系统、编程语言都无关。
假如你既拥有客户端又有服务器端的访问和管理权,这种情况更适合用.NET 的Remoting技术,而不是Web service。
创建Web Service必须保证的是,服务器端和客户端都要支持HTTP、SOAP(简单对象访问协议)和XML等行业标准协议。
Web Service是如何工作的Web Service允许两个程序之间交换XML文档。
在这个架构的顶层,微软实现了一个远程过程调用(Remote Procedure Call,PRC)模型。
Web Service架构包括以下特性:1。
WebServcie的服务器端和客户端应用程序都能够连接到互联网。
2。
用于进行通信的数据格式必须遵守相同的开放标准,并且在大多数情况下,这个标准几乎总是SOAP。
3。
客户端和服务器端的系统是松耦合的。
即Web Service不关心客户端和服务器端所使用的操作系统、对象模型或者编程语言。
只要Web Service和使用Web Service的应用程序都能够发送和接收遵守适当协议标准的消息即可。
下图为Web Service流程的逻辑架构如图所示,一个Web Service使用着会向Web Service发出一个调用请求。
使用者会认为它通过Internet直接和Web Service进行交流,当然这实际上是个幻象。
实际上,真正的调用由代理类完成。
代理类对于Web Service使用者来说是一个本地类。
代理会处理所有的负责的复杂架构,包括通过Internet发送请求道服务器、从web Service取回结果并呈现给Web Service使用者。
由于代理类在之前已在消费程序中注册,所有一切工作才可以顺利进行。
注册有开发消费程序的程序员完成。
开发Web Service开发Web Service的流程与开发网页的流程近乎一致:1。
所有构成网页和服务的源文件都是文本文件,它们可以使用任何文本编辑器创建和修改。
而类文件可以在控制台命令行中通过命令工具进行编译。
2。
可以在vs2005及以上版本中创建网页和Web Service3。
网页和Web Service既可以使用代码隐藏模型,也可以使用内联编码(inline coding)模型。
Web Service中不需要使用代码隐藏技术,因为Web Service并不包括任何可视化内容。
4。
网页和Web Service都充分利用了CLR和.NET Framework。
.aspx文件用于定义网页,而.asmx文件用于定Web Service,我们可以吧Web Service想象成类,类中的一些方法通过Internet被暴露给客户端。
代理客户端应用程序如果使用Web Service,必须先创建一个代理。
代理是要调用的真正代码的替身,它负责在机器边界引导调用。
在代理在客户端应用程序中注册后,客户端应用程序调用方法就如调用本地对象一样。
代理接受该调用,并以适当格式封装调用,然后以SOAP请求发送调用到服务器。
当服务器返回SOAP包给客户端后,代理会对包进行解密,并且如同从本地对象的方法返回数据一样将其返回给客户端应用程序。
如下图所示:协议与标准(HTTP、XML、SOAP)HTTP:TCP/IP协议的最上层是超文本传输协议(HTTP)。
它是用于在网络之间使用服务器和浏览器实现通讯,主要包括在服务器和浏览器建立连接,并将HTML 传输到客户端浏览器。
当客户端向服务器发送HTTP请求后,服务器就开始处理请求。
通常,会返回HTML页面,然后通过浏览器呈现。
然而对Web Service而言,服务器返回的是SOAP消息,消息中包含了被调用的Web Service方法的返回数据。
HTTP请求从请求的浏览器出传递名称和值到服务器,这种请求包括GET和POST 两种。
GET请求中,名称和值会被附加到url上,数据是未加密的。
当所有需要传递的数据可以使用名称和值成对表示,而且只需要传递少量字段,字段长度较短时,比较适合GET请求。
另外,如果不需考虑安全问题时,也可以使用GET。
POST请求中,配对的名称和值是作为请求消息的一部分发送的。
当有大量字段或者参数很长时,适合使用POST请求。
从安全方面看,POST比GET更安全,因为POST请求可以被加密。
和GET请求一样,POST请求无法传递复杂的数据类型(如类、结构体和DataSet)。
XML:是有W3C公布的开放标准的一种描述数据的方法。
XML和HTML十分类似。
不同的是HTML使用的是预定义元素,这些元素规定了HTML 在浏览器中如何显示,而XML的元素则是由开放人员自己定义的,所以几乎所有的数据都可以表示。
制定XML的目的是为了使其成为一种平台无关、语言无关的标准。
XML架构(Schema)是用于定义元素已经XML文档中或者许多XML之间元素与元素之间关联的文件。
在架构中将指定元素名称和内容类型。
HTML与XML的显著差别:大多数HTML读取器有很好的容错能力,而XML读取器则完全不同,所以XML文件的格式必须正确。
另外,XML元素都是小写的。
SOAP:(simple object access protocol,简单对象访问协议)是一种用于控制数据交换的XML语法。
它是简单的、轻量级的信息交换协议。
SOAP消息有消息内容和一个或多个头模块组成,并且封装在SOAP envelope中。
SOAP使用XML语法来格式化内容。
在设计上,SOAP尽可能简单并且提供最小化的功能。
SOAP不需HTTP的GET和POST,它不受“名称/值”对的限制,我们可以使用它来发送复杂的对象,包括DataSet、类和其他对象。
SOAP的缺点:SOAP消息十分冗长,因此如果存在带宽或者传输性能的问题,建议使用POST或GET.Web Service学习笔记(2)创建一个简单的Web Service上一章节中提到Web Service与网页的相似之处,这里在总结下:1。
由和通用语言运行时完全实现,包含面向对象架构,所有基类,还有一些特性,如缓存、状态和数据访问2。
几乎一致的文件和代码结构3。
所有源代码文件都是普通文本4。
vs完全支持,可以使用vs十分便捷的编辑、调试5。
使用一个基于普通文本的配置文件和vs的网站管理工具做全局或者应用程序级配置。
Web Service没有界面,它只有方法,有一些事支持从客户端远程调用的。
Web Service文件的后缀名为asmx。
在Web Service应用程序第一次运行时,如果Web Service是人工编译的,并且被放在虚拟跟目录的bin目录下,那么代码隐藏对于内联编码有性能优势,因为asmx文件在Web Service运行时都会被编译成一个类。
而 2.0在默认情况下没有这一优势,因为 2.0 把源代码放在App_Code目录下,并且在第一个使用时编译。
下面是一个实例(股票跟踪,不使用数据库,只是为了演示,故使用二维数组)这个Web Service提供两个方法:GetName:参数是一个StcokSymbol对象,返回一个字符串,内容是股票名称GetPrice:参数是一个StcokSymbol对象,返回一个数字,表示当前股票的价格我使用的是vs2010,首先新建一个项目(WebSite也可以),注意选择.NET Framework 3.5,默认4是没有Web Service选项的。
选择 Web Service Application,命名为StockWebService,如图我们可以看到,vs自动为我们生成了一些代码:/// <summary>/// Summary description for Service1/// </summary>[WebService(Namespace = "/")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ponentModel.ToolboxItem(false)]// To allow this Web Service to be called from script, using AJAX, uncomment the following line.// [System.Web.Script.Services.ScriptService]public class Service1 : System.Web.Services.WebService{[WebMethod]public string HelloWorld(){return"Hello World";}}在Service类中,有一个名为HelloWorld的模板方法,它将返回一个字符串。
这个方法使用WebMethod特性做修饰,表示该方法对Web Service使用程序可用。
WebMethod特性会在后面解释。
按F5运行程序,可以看到如图所示添加以下方法[WebMethod]public double GetPrice(string stockSymbol){for (int i = 0; i < stocks.GetLength(0); i++){if (pare(stockSymbol, stocks[i, 0], true) == 0)return Convert.ToDouble(stocks[i, 2]);}return 0;}[WebMethod]public string GetName(string stockSymbol){for (int i = 0; i < stocks.GetLength(0); i++){if (pare(stockSymbol, stocks[i, 0], true) == 0)return stocks[i, 1];}return"Symbol not found.";}重新运行项目,发现多了两个方法调用的入口。
Web Service指令普通的.aspx文件把Page指令作为第一行代码,而Web Service则有一个WebService指令(直接在vs不能看到,可以找到文件Service1.asmx右击编辑):<%@ WebService Language="C#" CodeBehind="Service1.asmx.cs"Class="StockWebService.Service1" %>Language:指定Web Service中使用的语言,不是必需的Class:指定Web Service的类名称,必需的CodeBehind:如果这个类没有包含在Web Service文件的代码中,且类没有被手工编译并放在bin子目录下,WebService指令的CodeBehind属性则用于指定实现WebService类的源代码文件的名称。