第 7 章 Web 服务

44
7 7 Web Web 第第 第第 Web 第第 (Web Service) 第 第第第第第第第第第 第第 一。 “第第第第第第”第第第第第 第第第第 第第第第第第第第第第第第第第第第第第第第 Web 第第第第第 .NET 第第第第第第第 。一 Web Service 第第 第第第 Web 第第第第第第第第第第第第第 第第第第 。, Web 第第第第 第第第第第第 DLL 第第第第第第第第 第第第第第 Web 第第第第第 API 第第第第Web 第第第第 第第 Web 第第SOAP DDI WSDL 第第第 第第第第 Web 第第 第第第第 Web 第第第第第第第第第 第第第第 Web 第第第第第第第第第

description

第 7 章 Web 服务. Web 服务 (Web Service) 是一项新兴发展的技术。它以“软件就是服务”为理想目标,使得在系统架构以及软件开发等领域都发生了深刻的变化。 Web 服务是微软 .NET 策略计划的基础。一个 Web Service 就是一个应用 Web 协议的可编程的应用程序逻辑。实际上, Web 服务就是一个动态链接库 DLL ,它向外界显示出的是一个能够通过 Web 进行调用的 API 。 本章重点: ● Web 服务概要,了解 Web 服务、 SOAP 、 DDI 、 WSDL 的概念 ● 掌握创建 Web 服务 - PowerPoint PPT Presentation

Transcript of 第 7 章 Web 服务

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 服务,检索某班学生的所有成绩。