Download - 第 7 章 Web 服务

Transcript
Page 1: 第 7 章   Web 服务

第第 77 章 章 WebWeb 服务服务 Web 服务 (Web Service) 是一项新兴发展的技术。它以“软件就是服务”为理想目标,使得在系统架构以及软件开发等领域都发生了深刻的变化。 Web 服务是微软 .NE

T 策略计划的基础。一个 Web Service 就是一个应用 Web协议的可编程的应用程序逻辑。实际上, Web 服务就是一个动态链接库 DLL ,它向外界显示出的是一个能够通过 Web 进行调用的 API 。 本章重点:

● Web 服务概要,了解 Web 服务、 SOAP 、 DDI 、WSDL 的概念 ● 掌握创建 Web 服务 ● 熟练应用 Web 服务的几种调用方法 ● 学会使用 Web 服务来提供数据服务

Page 2: 第 7 章   Web 服务

7.1 Web7.1 Web 服务概要服务概要一个 Web Service 就是一个应用 Web 协议的可编程的应用程序逻辑。实际上,Web 服务就是一个动态链接库 DLL ,它向外界显示出的是一个能够通过 Web 进行调用的 API 。用户不需要知道它的内部实现,而只需要知道他的调用函数名和参数即可。但与普通的 DLL 不同的是,它不存在于本地主机上,而是存在服务器端的,因此W eb 服务可以被任何能访问本机的网络用户调用,这就是W eb 服务的主要概念。

Page 3: 第 7 章   Web 服务

7.1.1 XML 、 SOAP 与 Web Service

XML 实际上是 Web 上表示结构化信息的一种标准文本格式,它没有复杂的语法和包罗万象的数据定义。 XML 提供了一种结构化的数据表示方式,使得用户界面分离于结构化数据。 XML 允许使用者创建和使用他们自己的标记而不是 HTML 的有限词汇表。这一点至关重要,企业可以用XML 为电子商务和供应链集成等应用定义自己的标记语言,甚至特定行业一起来定义该领域的特殊标记语言,作为该领域信息共享与数据交换的基础。

Page 4: 第 7 章   Web 服务

SOAP ( Simple Object Access Protocol )是一个基于 XML 的协议,包括四个部分: SOAP 封装,封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架; SOAP 编码规则用于表示应用程序需要使用的数据类型的实例 ;SOAP RPC 表示 , 表示远程过程调用和应答的协定 ; SOAP 绑定,使用底层协议交换信息。

Page 5: 第 7 章   Web 服务

7.1.2 Web 服务的体系结构 IBM

查找发布

绑定

服务提供者 服务请求者

UDDI注册中心

Page 6: 第 7 章   Web 服务

UDDI UDDI UDDI 是一个 Web Services 的信息注册规范,定义了 Web 服务的注册发布和发现的方法。 UDDI 类似一个目录索引,上面列出了所有可用的企业的 Web 服务信息,服务服务器请求者可以在这个目录中找到自己的需要的服务。 企业首先向 UDDI 注册中心注册Web 服务并提供这些 Web 服务的描述。服务请求者可以使用 UDDI 注册中心来发现所需要使用的 Web 服务,然后就可以调用这些服务。

Page 7: 第 7 章   Web 服务

WSDLWSDL Web service 描述语言 (WSDL) 是这样一个基于 XML 的语言,用于描述 Web servi

ce 及其函数、参数和返回值。因为是基于XML 的,所以 WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的 Web service 生成 WSDL 文档,又能导入WSDL文档,生成调用相应 Web service 的代码。

Page 8: 第 7 章   Web 服务

7.2 7.2 创建创建 WebWeb 服务服务 在理解 Web 服务构架和基本访问流程后,通过 VS.NET2003 创建 Web 服务就是一件简单的事情了。在 VS.NET 集成开发环境 (IDE) 的新建项目对话框中,选择“ ASP.NET Web 服务”项目 .

图 7.2 创建 Web 服务对话框

Page 9: 第 7 章   Web 服务

图 7.3 Web 服务设计界面

Page 10: 第 7 章   Web 服务

代码清单代码清单 7-17-1 部分代码部分代码 ……7 : using System.Web.Services; 8 : namespace chapter79 : {10 : public class Service1 : System.Web.Services.WebService11 : {12 : public Service1()13 : {14 : //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的15 : InitializeComponent();16 : }17 : #region 组件设计器生成的代码18 : //Web 服务设计器所必需的19 : private IContainer components = null;20 : /// <summary>21 : /// 设计器支持所需的方法 - 不要使用代码编辑器修改22 : /// 此方法的内容。23 : /// </summary>24 : private void InitializeComponent()25 : {26 : }

Page 11: 第 7 章   Web 服务

27 : /// <summary>28 : /// 清理所有正在使用的资源。29 : /// </summary>30 : protected override void Dispose( bool disposing )31 : {32 : if(disposing && components != null)33 : {34 : components.Dispose();35 : }36 : base.Dispose(disposing);37 : }38 : #endregion39 : // WEB 服务示例40 : // HelloWorld() 示例服务返回字符串 Hello World41 : // 若要生成,请取消注释下列行,然后保存并生成项目42 : // 若要测试此 Web 服务,请按 F5 键43 : //[WebMethod]44 : //public string HelloWorld()45 : //{46 : // return "Hello World";47 : //}48 : }

49 : }

Page 12: 第 7 章   Web 服务

去掉红色注释部分,使服务有效,运行该去掉红色注释部分,使服务有效,运行该 WebWeb 服务页面服务页面

图 7.4 Web 服务运行界面

Page 13: 第 7 章   Web 服务

图 7.5 测试 HelloWorld 方法 图 7.6 运行服务的结果

Page 14: 第 7 章   Web 服务

在 VS.NET 开发项目中,应用最多的可能莫过于访问数据库,开发企业级应用软件时需要大量与数据库进行交互。特别是在集团化的分布式管理应用中,采用先进的 Web Services ( Web 服务)分布式技术,构建覆盖集团所属企业单位的信息体系,实现集团总部、直属企事业单位、下属全资、控股子公司之间的信息的实时传输和集中管理。程序清单 7-2 是利用 Web服务访问数据库,检索所有学生的成绩,返回数据集。

Page 15: 第 7 章   Web 服务

程序清单程序清单 7-27-21 : [WebMethod]2 : public DataSet get_grade()3 : {4 : string connstr="provider=microsoft.jet.oledb.4.0;data source="+5 : Server.MapPath("student.mdb");6 : OleDbConnection conn=new OleDbConnection(connstr);7 : OleDbDataAdapter da=new OleDbDataAdapter ("select * from grade",conn);8 : DataSet ds=new DataSet();9 : try10 : {11 : da.Fill(ds);12 : }13 : finally14 : {15 : da.Dispose();16 : }17 : return ds;18 : }

Page 16: 第 7 章   Web 服务

图 7.7 以数据集返回的学生成绩数据

Page 17: 第 7 章   Web 服务

7.3 7.3 使用使用 WebWeb 服务服务 Web 服务的主要作用就是为了供客户端程序调用,由于 Web 服务是在遵循 SOA

P 协议的基础上采用 WSDL(Web 服务描述语言 ) 语言描述的,因此可以采用以下方式来使用 Web 服务。 1) 通过 Web引用方式使用 Web 服务2) 通过代理类来使用 Web 服务3) 使用 Microsoft SOAP工具包使用 Web服务

Page 18: 第 7 章   Web 服务

7.3.1 通过 Web引用方式使用 Web 服务1.添加Web引用

Page 19: 第 7 章   Web 服务

图 7.9 添加 Web 服务的对话框

选择本地的 Web服务

Page 20: 第 7 章   Web 服务

图 7.10 显示本地计算机上的所有 Web 服务

Page 21: 第 7 章   Web 服务

2. 通过服务类的实例调用方法 在 test.aspx 页面的 Page_Load 事件中,编写如下代码,调用该 Web 服务的 get_gr

ade() 方法,获取成绩表中的成绩信息,并把它放到 DataGrid1 中显示出来。 1 : private void Page_Load(object sender, System.EventArgs e)2 : {3 : get_stud_grade gsg=new get_stud_grade();4 : this.DataGrid1.DataSource=gsg.get_gra

de() . Tables[0].DefaultView;5 : this.DataGrid1.DataBind();6 : }

Page 22: 第 7 章   Web 服务

图 7.11 调用 Web 服务返回的数据

Page 23: 第 7 章   Web 服务

7.3.2 通过代理类使用 Web 服务 创建 Web 服务代理类可以使用 .NET命令行工具 wsdl.exe 来完成。该工具的使用格式如下: wsdl [options] {URL | path} ,其中 URL 是指向 WSDL 协定文件 (.wsdl) 、

XSD 架构文件 (.xsd)或发现文档 (.disco) 的 URL 。 Path 是本地 WSDL 协定文件 (.wsdl) 、 XSD 架构文件 (.xsd) 或发现文档( .disco或 .discomap )的路径。

Page 24: 第 7 章   Web 服务

步骤步骤 1 1 生成代理类生成代理类 要针对前面编写的 7-2 服务生成代理类,首先通过“ Visual Studio .NET 2003 命令提示”进入 DOS 提示符操作界面,在提示符下键入以下命令: wsdl /n:Get_Grad

eNS /out:get_grade.cs http://localhost/chapter7/7-2.asm

Page 25: 第 7 章   Web 服务

生成的代理类生成的代理类 get_grade.csget_grade.cs清单清单1 : namespace Get_GradeNS {2 : using System.Diagnostics;3 : using System.Xml.Serialization;4 : using System;5 : using System.Web.Services.Protocols;6 : using System.ComponentModel;7 : using System.Web.Services;8 : 9 : /// <remarks/>10 : [System.Diagnostics.DebuggerStepThroughAttribute()]11 : [System.ComponentModel.DesignerCategoryAttribute("code")]12 : [System.Web.Services.WebServiceBindingAttribute(Name="get_stud_gradeSoa

p", Namespace="http://tempuri.org/")]

13 : public class get_stud_grade : System.Web.Services.Protocols.SoapHttpClientProtocol {

14 : 15 : /// <remarks/>16 : public get_stud_grade() {17 : this.Url = "http://localhost/chapter7/7-2.asmx";

Page 26: 第 7 章   Web 服务

18 : }19 : 20 : /// <remarks/>21 :22 : [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.

org/get_grade", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.

Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]

23 : public System.Data.DataSet get_grade() {24 : object[] results = this.Invoke("get_grade", new object[0]);25 : return ((System.Data.DataSet)(results[0]));26 : }27 : 28 : /// <remarks/>29 : public System.IAsyncResult Beginget_grade(System.AsyncCallback callback,

object asyncState) {return this.BeginInvoke("get_grade", new object[0], callback,

asyncState);30 : } 31 :

Page 27: 第 7 章   Web 服务

32 : /// <remarks/>33 : public System.Data.DataSet Endget_grade(System.IAsyncResult asyncResul

t) {34 : object[] results = this.EndInvoke(asyncResult);35 : return ((System.Data.DataSet)(results[0]));36 : }37 : }38 : }

Page 28: 第 7 章   Web 服务

步骤步骤 2 2 编译代理类生成程序集编译代理类生成程序集

图 7.13 编译代理文件为 DLL 组件

Page 29: 第 7 章   Web 服务

步骤步骤 3 3 在项目中引用程序集在项目中引用程序集

图 7.14 通过本地代理访问远程 Web 服务

Page 30: 第 7 章   Web 服务

7.4 7.4 使用使用 WebWeb 服务的数据服务服务的数据服务 作为一个 Web 服务,它是可能被任意类型的客户端程序访问的。因此有必要为

Web 服务提供一套统一的具有广泛意义的数据类型。为了做到这一点, .NET 框架中的 Web 服务使用了 XML Schema Definition 语言中定义的数据类型,因为这些数据类型可以被 XML 编码和序列化。

表 7-2 可在 Web 服务中传递的数据类型 类型 说明

基本类型 String,Char,Byte,Boolean,Int16,Int32,Int64,UInt32,Uint64,Single,Double, Guid,Decimal,DateTime,XML中 timeInstant,DateTime,date等

类和结构中的成员

是类和结构中具有 public属性的成员和属性

DataSet 数据集对象也是 Web传递的数据类型 XmlNode XmlNode对象可以作为类或结构体的 field成员

Page 31: 第 7 章   Web 服务

7.4.1 使用 Web Service完成数据查询 在 .NET 应用中,经常需要查询数据库中数据,由于 DataTable 、 DataView 、

DataRow 等类型的对象都不能被序列化,把 DataTable 的值存放在数据集中,利用Web 服务返回,供用户调用。

Page 32: 第 7 章   Web 服务

1.1. 创建服务创建服务程序清单 7-51 : [WebMethod]2 : public DataSet index_grade(string stud_id)3 : {4 : string connstr="provider=microsoft.jet.oledb.4.0; data source="+5 : Server.MapPath("student.mdb");6 : OleDbConnection conn=new OleDbConnection(connstr);7 : string sql="select * from grade where stud_id='"+stud_id

+"'";8 : OleDbDataAdapter da=new OleDbDataAdapter(sql,conn);9 : DataSet ds=new DataSet();10 : da.Fill(ds);11 : da.Dispose();12 : return ds;13 : }

Page 33: 第 7 章   Web 服务

2.2. 引用服务引用服务1 : private void Button1_Click(object sender, System.EventArgs e)2 : {3 : string stud_id=this.stud_id.Text.Trim();4 : Service2 s2=new Service2();5: this.DataGrid1.DataSource= s2.index_grade(stud_id);6 : this.DataGrid1.DataBind();7 : } 运行界面

Page 34: 第 7 章   Web 服务

7.4.2 使用 Web Service 向数据库添加数据 在很多情况下,不同的应用程序需要共享一个数据库,而这个数据库出于安全的考虑,并不想向其它应用程序或用户提供用户名和密码,此时Web 服务不失为一种好的方法。通过它开通数据库的查询或更新操作,完成特定的任务,然后返回结果。

Page 35: 第 7 章   Web 服务

1.1. 创建服务创建服务1 : [WebMethod]2 : public bool add_grade(string stud_id,string course_id,int gra

de)3 : {4 : string connstr="provider=microsoft.jet.oledb.4.0; data source="+5 : Server.MapPath("student.mdb");6 : OleDbConnection conn= new OleDbConnection(connstr);7 : string sql="insert into grade values('"+stud_id+"','"+

course_id+"',"+grade.ToString()+")";8 : OleDbCommand comm= new OleDbCommand(sql,conn);

Page 36: 第 7 章   Web 服务

9 : try10 : {11 : conn.Open();12 : comm.ExecuteNonQuery();13 : return true;14 : }15 : catch16 : {17 : return false;18 : }19 finally20 : {21 : conn.Close();22 }23 : }

Page 37: 第 7 章   Web 服务

2.2. 引用服务引用服务1 : private void Button1_Click(object sender, System.EventArgs e)2 : {3 : string stud_id=this.stud_id.Text.Trim();4 : string course_id=this.course_id.Text.Trim();5 : int grade=Int16.Parse(this.grade.Text.Trim());6 : Service3 s3=new Service3();7 : if(s3.add_grade(stud_id,course_id,grade))8 : {9 : RegisterStartupScript("message","<script> alert('添加成功! ');</script>");10 : }11 : else12 : {13 : RegisterStartupScript("message","<script> alert('添加失败! ');</script>");14 : }15 : }

Page 38: 第 7 章   Web 服务

图 7.16 使用 WebWeb Service 添加学生成绩

Page 39: 第 7 章   Web 服务

7.4.3 使用 Web Service传送二进制文件 Web 服务也可以用来传送一个二进制文件,比如一个程序或一张图片。这种实现是通过读取二进制文件,并转化成 byte数组,然后作为 Web 服务的返回值进行传送。在 Web窗体中,调用该 Web 方法,利用 byte 数组生成一个图片文件,就可以达到接收二进制文件的目的。

Page 40: 第 7 章   Web 服务

1.1. 创建创建 WebWeb 服务服务1 : [WebMethod]2 : public byte[] get_image(string image_path)3 : {4 : if(File.Exists(image_path))5 : {6 : try7 : {8 : FileStream fs= new FileStream(

image_path,FileMode.Open,FileAccess.Read);9 : int bytes;10 : byte[] image_byte;11 : MemoryStream ms=new MemoryStream();12 : while((bytes=fs.ReadByte())!=-1)13 : {14 : ms.WriteByte((byte)bytes);15 : }

Page 41: 第 7 章   Web 服务

16 : fs.Close();17 : image_byte=ms.ToArray();18 : ms.Close();19 : return image_byte;20 }21 : catch22 : {23 : return null;24 : }25 : }26 : else27 : {28 : return null;29 : }30 : }

Page 42: 第 7 章   Web 服务

2.2. 引用服务引用服务private void Page_Load(object sender, System.EventArgs e){

Service4 s4=new Service4();byte[] image_byte=s4.get_image(Server.MapPath("winnt.jpg"));if(image_byte!=null){

MemoryStream ms= new MemoryStream(image_byte,0,image_byte.Length);

Bitmap bitm=new Bitmap(ms);bitm.Save(Response.OutputStream,ImageFormat.Jpeg);

}}

图 7.17 接收 Web 服务传送的图片

Page 43: 第 7 章   Web 服务

本章小结 本章重点介绍了 Web 服务的创建、使用,以及几种常用的调用 Web 服务方法。需要熟练掌握如何使用 Web 服务,包括如何通过引用 Web 服务和生成代理类来使用 Web服务。需要注意的是 Web 服务需要发布和部署在 Web 服务器上才好访问和调用。

Page 44: 第 7 章   Web 服务

思考练习1.Web 服务方法与普通类的方法有何区别;2.WSDL 的作用是什么?3.创建一个 Web 服务,用于计算两个整数的乘积。如果用户输入的数据类型错误,返回错误消息。4.基于 student.mdb 学生数据库创建一个

Web 服务,检索某班学生的所有成绩。