1、Web Service 学习笔记( 1)Web Service 的宗旨是创建不需要用户界面就能与其他应用程序交互的 Web 应用程序。举例说明它的优点,假如你正在为一家股票投资公司创建网站,你并不需要把不同证劵交易所得数据库与自己的后台数据库进行整合,因为你的应用程序可以使用 Web Service,并使用 XML 格式交换数据。Web Service 是松耦合的,它与服务器端和客户端使用的操作系统、编程语言都无关。假如你既拥有客户端又有服务器端的访问和管理权,这种情况更适合用.NET 的 Remoting 技术,而不是 Web service。创建 Web Service 必须保证的是,服务
2、器端和客户端都要支持 HTTP、SOAP(简单对象访问协议)和 XML 等行业标准协议。 Web Service 是如何工作的Web Service 允许两个程序之间交换 XML 文档。在这个架构的顶层,微软实现了一个远程过程调用(Remote Procedure Call,PRC)模型。Web Service 架构包括以下特性:1。WebServcie 的服务器端和客户端应用程序都能够连接到互联网。2。用于进行通信的数据格式必须遵守相同的开放标准,并且在大多数情况下,这个标准几乎总是 SOAP。3。客户端和服务器端的系统是松耦合的。即 Web Service 不关心客户端和服务器端所使用的操
3、作系统、对象模型或者编程语言。只要 Web Service 和使用Web Service 的应用程序都能够发送和接收遵守适当协议标准的消息即可。下图为 Web Service 流程的逻辑架构如图所示,一个 Web Service 使用着会向 Web Service 发出一个调用请求。使用者会认为它通过 Internet 直接和 Web Service 进行交流,当然这实际上是个幻象。实际上,真正的调用由代理类完成。代理类对于 Web Service 使用者来说是一个本地类。代理会处理所有的负责的复杂架构,包括通过 Internet 发送请求道服务器、从 web Service 取回结果并呈现给
4、 Web Service 使用者。由于代理类在之前已在消费程序中注册,所有一切工作才可以顺利进行。注册有开发消费程序的程序员完成。开发 Web Service开发 Web Service 的流程与开发网页的流程近乎一致:1。所有构成网页和服务的源文件都是文本文件,它们可以使用任何文本编辑器创建和修改。而类文件可以在控制台命令行中通过命令工具进行编译。2。可以在 vs2005 及以上版本中创建网页和 Web Service3。网页和 Web Service 既可以使用代码隐藏模型,也可以使用内联编码(inline coding)模型。Web Service 中不需要使用代码隐藏技术,因为 Web
5、 Service 并不包括任何可视化内容。4。网页和 Web Service 都充分利用了 CLR 和.NET Framework。.aspx 文件用于定义网页,而.asmx 文件用于定 Web Service,我们可以吧 Web Service 想象成类,类中的一些方法通过 Internet 被暴露给客户端。代理客户端应用程序如果使用 Web Service,必须先创建一个代理。代理是要调用的真正代码的替身,它负责在机器边界引导调用。在代理在客户端应用程序中注册后,客户端应用程序调用方法就如调用本地对象一样。代理接受该调用,并以适当格式封装调用,然后以 SOAP 请求发送调用到服务器。当服务
6、器返回SOAP 包给客户端后,代理会对包进行解密,并且如同从本地对象的方法返回数据一样将其返回给客户端应用程序。如下图所示:协议与标准(HTTP、XML、SOAP)HTTP:TCP/IP 协议的最上层是超文本传输协议(HTTP)。它是用于在网络之间使用服务器和浏览器实现通讯,主要包括在服务器和浏览器建立连接,并将HTML 传输到客户端浏览器。当客户端向服务器发送 HTTP 请求后,服务器就开始处理请求。通常,会返回 HTML 页面,然后通过浏览器呈现。然而对 Web Service 而言,服务器返回的是 SOAP 消息,消息中包含了被调用的 Web Service 方法的返回数据。HTTP 请
7、求从请求的浏览器出传递名称和值到服务器,这种请求包括 GET 和 POST两种。GET 请求中,名称和值会被附加到 url 上,数据是未加密的。当所有需要传递的数据可以使用名称和值成对表示,而且只需要传递少量字段,字段长度较短时,比较适合 GET 请求。另外,如果不需考虑安全问题时,也可以使用 GET。POST 请求中,配对的名称和值是作为请求消息的一部分发送的。当有大量字段或者参数很长时,适合使用 POST 请求。从安全方面看,POST 比 GET 更安全,因为 POST 请求可以被加密。和 GET 请求一样,POST 请求无法传递复杂的数据类型(如类、结构体和 DataSet)。XML:是
8、有 W3C 公布的开放标准的一种描述数据的方法。XML 和 HTML 十分类似。不同的是 HTML 使用的是预定义元素,这些元素规定了HTML 在浏览器中如何显示,而 XML 的元素则是由开放人员自己定义的,所以几乎所有的数据都可以表示。制定 XML 的目的是为了使其成为一种平台无关、语言无关的标准。XML 架构(Schema)是用于定义元素已经 XML 文档中或者许多 XML 之间元素与元素之间关联的文件。在架构中将指定元素名称和内容类型。HTML 与 XML 的显著差别:大多数 HTML 读取器有很好的容错能力,而 XML 读取器则完全不同,所以 XML 文件的格式必须正确。另外,XML
9、元素都是小写的。SOAP:(simple object access protocol,简单对象访问协议)是一种用于控制数据交换的 XML 语法。它是简单的、轻量级的信息交换协议。SOAP 消息有消息内容和一个或多个头模块组成,并且封装在 SOAP envelope 中。SOAP 使用 XML 语法来格式化内容。在设计上,SOAP 尽可能简单并且提供最小化的功能。SOAP 不需 HTTP 的 GET 和 POST,它不受“名称/值”对的限制,我们可以使用它来发送复杂的对象,包括 DataSet、类和其他对象。SOAP 的缺点:SOAP 消息十分冗长,因此如果存在带宽或者传输性能的问题,建议使用
10、 POST 或 GET.Web Service 学习笔记( 2)创建一个简单的 Web Service上一章节中提到 Web Service 与网页的相似之处,这里在总结下:1。由和通用语言运行时完全实现,包含面向对象架构,所有基类,还有一些特性,如缓存、状态和数据访问2。几乎一致的文件和代码结构3。所有源代码文件都是普通文本4。vs 完全支持,可以使用 vs 十分便捷的编辑、调试5。使用一个基于普通文本的配置文件和 vs 的网站管理工具做全局或者应用程序级配置。Web Service 没有界面,它只有方法,有一些事支持从客户端远程调用的。Web Service 文件的后缀名为 asmx。在
11、Web Service 应用程序第一次运行时,如果 Web Service 是人工编译的,并且被放在虚拟跟目录的 bin 目录下,那么代码隐藏对于内联编码有性能优势,因为 asmx 文件在 Web Service 运行时都会被编译成一个类。而 ASP.NET 2.0 在默认情况下没有这一优势,因为 ASP.NET 2.0 把源代码放在 App_Code 目录下,并且在第一个使用时编译。下面是一个实例(股票跟踪,不使用数据库,只是为了演示,故使用二维数组)这个 Web Service 提供两个方法:GetName:参数是一个 StcokSymbol 对象,返回一个字符串,内容是股票名称GetPr
12、ice:参数是一个 StcokSymbol 对象,返回一个数字,表示当前股票的价格我使用的是 vs2010,首先新建一个项目(WebSite 也可以),注意选择.NET Framework 3.5,默认4 是没有 Web Service 选项的。选择 ASP.NET Web Service Application,命名为 StockWebService,如图我们可以看到,vs 自动为我们生成了一些代码:/ / Summary description for Service1/ WebService(Namespace = “http:/tempuri.org/“)WebServiceBindi
13、ng(ConformsTo = WsiProfiles.BasicProfile1_1)System.ComponentModel.ToolboxItem(false)/ To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. / System.Web.Script.Services.ScriptServicepublic class Service1 : System.Web.Services.WebServiceWebMethodpublic
14、string HelloWorld()return “Hello World“; 在 Service 类中,有一个名为 HelloWorld 的模板方法,它将返回一个字符串。这个方法使用 WebMethod 特性做修饰,表示该方法对 Web Service 使用程序可用。WebMethod 特性会在后面解释。按 F5 运行程序,可以看到如图所示添加以下方法WebMethodpublic double GetPrice(string stockSymbol)for (int i = 0; i Language:指定 Web Service 中使用的语言,不是必需的 Class:指定 Web Se
15、rvice 的类名称,必需的CodeBehind:如果这个类没有包含在 Web Service 文件的代码中,且类没有被手工编译并放在 bin 子目录下,WebService 指令的 CodeBehind 属性则用于指定实现 WebService 类的源代码文件的名称。Debug:如果设为 true,将以启用调试的方式编译 Web Service。默认为 false从 WebService 类继承虽然是可选选项,但是它有几个优点,主要优点是可获得对 ASP.NET 几个常见对象的访问权:Application 对象和 Session 对象(状态管理)、User 对象(验证 Web 服务器调用者
16、的身份)、Context 对象(可以访问 HttpContext 类中调用者请求的所有特定 HTTP 信息)当然也不可不继承 WebService 类,可能是为了克服来自.NET Framework 的限制。通过 HttpContext 控制 Application 状态Web Service 可通过 HttpContext 控制 Application 对象(也可以访问所有的ASP.NET 资源)例:在 Service1.asmx.cs 中添加如下方法:/ / set exchange of stock/ / WebMethodpublic void SetStockExchange(str
17、ing exchange)Application“exchange“ = exchange;WebMethodpublic string GetStockExchange()return Application“exchange“.ToString();WebServiceBinding 特性Web Service 描述语言(WebServices Description Language,WSDL)定义的绑定可作为.NET 类访问 WebService 的接口。即绑定会定义一系列操作。一个WebService 类有一个默认的绑定,它包含该类的所有 Web 方法,该类不存在与非默认绑定的关联。
18、WebServiceBinding 特性用于识别非默认绑定。WebService 类可以具有多个 WebServiceBinding 特性,每一个都可以指定不同的绑定。如果 Name 属性被忽略,那个这个特性将指定默认绑定。属性 类型 读 写 说明ConformsTo WsiProfiles 绑定需要遵守的 WS-1 标准EmitConformanceClaims Boolean 如果为 true,当 WSDL 描述时,绑定会发出遵守的声明Location String 定义绑定的位置,默认值为当前 Web Service 的URLName String 绑定名称Namespace Strin
19、g 与绑定关联的命名空间WebMethod 特性Web Service 由 WebService 类定义的,对于 WebService 类而言,并不需要将所有的方法提供给 Web Service 使用者。对需要提供的方法,须:1。声明为 public2。在方法声明之前设置 WebMethod 特性(即加上Web Service)WebMethod 包含一些属性,用于设定 web 方法的行为。语法:WebMethod(PropertyName=value),以下是一些属性的说明BufferResponse:默认情况下,ASP.NET 在从服务器端向客户端发送响应之前,会对整个响应进行缓存。多数情
20、况下,这是最好的做法。但是,如果响应非常长,那么需将 它设为 false 类禁用缓存,如果设为 false,则返回到客户端的响应时 16kb 的块。默认值为 trueCacheDuration:如同网页,Web Service 也能够把返回到客户端的结果进行缓存(有点:如果客户端发出的请求与由另一个客户端发出的请求完全一致是,那么服务器就返回缓存中的响应,可以改善性能)。CacheDuration 定义第一次请求之后的多少秒内,会在响应中将缓存页被发送给随后的请求。一旦缓存过期,则发送新页面给请求。默认值为 0,即禁用结果缓存。如果 web方法返回的数据没有改变(如:从一小时更新一次数据库中获
21、取数据的查询),那么就可以设置结果缓存为一个合适的时间,例如 1800(30 分钟)。令一方面,如果返回的数据是动态的,那么需要设置缓存持续时间较短或干脆禁用。如果Web Service 没有一个相对有限的参数范围,缓冲也不适合使用。Description:对 web 方法的描述,字符串类型EnableSession:默认为 false。如果设为 true,web 方法将启用会话状态。如果设为 ture 且 Web Service 继承自 WebService 类,那么会话可以使用WebService.Session。允许会话状态为应用程序增加了额外的开销。MessageName:在 C#类中,方法可以拥有相同的名字(重载),Web Service禁止使用重载。WebMethod 特性的 MessageName 属性可以消除由多个相同名称造成的无法识别的问题。它允许对每一个方法的重载使用唯一的别名。当重载方法在 SOAP 消息中引用时,SOAP 消息将使用 MessageName 而非方法的名称。