WebService编程------C#.NET第五章WebService基础本章要点WebService体系结构:WebService是自包含\模块化的应用程序,它可以在网络(通常称为Web)中被描述、发布、查找以及调用。实例介绍:本章通过两个实例的分析,帮助读者及时应用学习的知识,更快更好地掌握WebService的开发。Web服务简介Web服务的定义Web服务是可以使用标准Internet协议进行访问的可编程应用程序逻辑基于Internet技术实现可以重复使用的黑匣功能是未来分布式应用程序的发展方向XMLWebService的定义XMLWebService实现了在异类系统之间以XML消息的形式进行数据交换远程访问数据和应用程序逻辑并不是新的技术,但以松耦合的方式执行该操作却是一个全新的概念在客户端和服务器之间要求接收方可以理解收到的消息,客户端和服务器共同遵守一个协定(通常在Web服务中使用WSDL和XSD),然后通过在指定的传输协议(例如HTTP)之上生成遵守该协定的消息来进行通信使用文本格式(如XML)的灵活性使消息交换随时间的推移以一种松耦合的方式进化成为可能Web服务的功能和优点黑匣功能使用户不需要了解服务具体是如何实现的功能的粒度没有限制,大型和小型系统都可以使用既可以访问静态资源也可以访问动态资源便于和其他Web服务集成平台无关,互操作性强支持多种语言把现有系统改造为Web服务比较容易全部采用业界标准而不是厂商标准TCP/IPSystem.Net.SocketsSocketsHTTPXMLorBinaryFormatsSOAPSystem.Net.SocketsSystem.NetSystem.Runtime.RemotingSystem.Web.ServicesWeb技术栈与.NET面向服务的体系结构服务代理服务提供者服务消费者发布查找绑定面向服务的体系结构的组成部分服务提供者网络中负责提供软件服务接口、实现特定功能的节点服务消费者网络中使用服务提供者定义的接口,实现业务解决方案的节点服务代理网络中负责存储服务描述,并帮助服务消费者定位服务的节点各组成部分间的基本操作过程服务的发布服务提供者把服务发布到服务代理,包括服务接口定义、服务提供者位置以及其他相关文件服务的查找服务消费者在服务代理那里查找需要的服务服务的绑定服务消费者绑定由服务提供者提供的服务,这个过程包括提供商对消费者的身份验证Web服务体系结构简介UDDI(Web服务代理)Web服务提供者Web服务消费者发布查找绑定InternetWeb服务是面向服务体系结构的具体实现UDDI任意消费者SOAPSOAPSOAPIISWeb服务Web服务体系结构的组成部分Web服务的服务提供者由ASP.NET页面来实现,扩展名是.asmxWeb服务的服务代理UDDI提供的目录服务Web服务的服务消费者采用SOAP或HTTP协议与服务提供者进行通信,并且支持必要的安全身份验证Web服务体系结构中各部分的功能Web服务提供者Web服务消费者Web服务代理Web服务提供者Web服务可以运行在IISWeb服务器上.NET公共语言运行库Web服务提供者的例子IIS与Web服务IIS提供对HTTP协议的侦听IIS可以通过使用ISAPI体系结构来同时提供多个独立的Web服务,其中ISAPI起到分选器的作用,可以根据客户端访问文件的后缀名,将不同类型的请求定向到不同的应用程序来进行处理IIS有完整的安全结构,可以提供身份验证和数据加密等多种安全服务Web服务消费者最低功能要求可以使用该服务支持的协议来调用服务提供者的Web服务接口在消息发往服务提供者前进行正确的格式化服务定位不使用硬编码形式,可以动态定位代理异步调用消费者在等待服务完成的同时可以处理其他任务Web服务消费者的示例代理的任务负责处理底层的协议解析字节流以提取数据验证入站数据流构造出站数据包Web服务代理在提供商和代理之间完成的操作对Web服务进行分类提供Web服务的协定信息提供Web服务的文本描述提供Web服务的文档链接提供Web服务的定位信息在代理和消费者之间完成的操作最重要的功能就是实现查找UDDI注册UDDI注册包含的信息Web服务的位置、协定信息和标识符行业的分类信息Web服务的技术信息Web服务基础结构Web服务编程模型Web协议HTTPSOAPXML无状态松耦合通用数据格式SOAP协议基于XML格式Web服务描述文件使用XML格式从Web服务返回的数据使用XML格式UDDI注册Web服务使用XML格式的文档ASP.NET使用XML格式的配置文件HTTP协议基本原理HTTP协议概述HTTP请求与HTTP响应的结构HTTP的GET与POST方法URL、URI和URNURI,UniformResourceIdentifier统一资源标识符,用字符串惟一标识信息资源URL,UniformResourceLocator统一资源定位符,通过“通讯协议+网络地址”字符串惟一标识信息位置和资源访问途径URN,UniformResourceName统一资源命名符,用于惟一标识全球范围内由专门机构负责的稳定的信息资源HTTP协议概述URL结构无状态协议在客户端发出HTTP请求并收到服务器端响应后,连接就会断开,下次的访问与前一次的访问无关,因此如果需要维护客户端的信息,必须在服务器端维持状态数据实例[:port][path[?querystring]]=23主机路径查询字符串HTTP请求的结构请求的结构例子POST/TheStockExchange/Trading/GetStockPrice.aspHTTP/1.1Host:localhostContent-Type:application/x-=MSFT注意空行MethodURLVersionHeadersMessagebody注意空行响应的结构例子HTTP/1.1200OKContent-Type:text/xml;charset=utf-8Content-Length:75?xmlversion=1.0encoding=utf-8?stocksymbol=MSFTPrice=71.50/HTTP响应的结构注意空行VersionStatus-CodeDescriptionHeadersMessagebody注意空行HTTP的GET和POST方法HTTP-GETHTTP-POST例子例子GET/Trading/GetStockPrice.asp?Symbol=MSFTHTTP/1.1Host:localhostPOST/Trading/GetStockPrice.aspHTTP/1.1Host:localhostContent-Type:application/x-=MSFTGET和POST方法的区别GET方法通常没有消息主体GET方法支持最大1024个字节的查询字符串,POST方法没有限制POST方法把查询字符串放在消息主体中传输,因此比GET方法支持更多的数据类型.NET中与HTTP相关的类HttpWebRequest由WebRequest派生,封装了对HTTP协议的支持HttpWebResponse由WebResponse派生,封装了对HTTP协议的支持支持同步和异步操作HttpWebRequestHttpWebResponseSystem.WebSystem.IOStreamReaderStreamWriterHttpWebRequest类HttpWebRequest不使用构造函数来进行初始化,而是调用WebRequest的Create方法GetResponse方法向RequestUri属性中指定的Internet资源发出同步请求并返回包含该响应的HttpWebResponse实例,可以使用BeginGetResponse和EndGetResponse方法向Internet资源发出异步请求向Internet资源发送数据时,GetRequestStream方法返回用于发送数据的Stream实例,BeginGetRequestStream和EndGetRequestStream方法提供对发送数据流的异步访问同步调用与异步调用在.NETFramework指定的异步调用方法的设计模式中,每个同步方法都有两个对应的异步方法,即一个Begin异步方法和一个End异步方法客户端调用Begin方法启动该方法的异步调用,实质是指示开始进行方法调用,但立即返回,不需要等待结果客户端调用End方法获取XMLWebService方法执行的结果1.HttpWebRequestreq=(HttpWebRequest)WebRequest.Create(url);2.req.ContentType=contentType;3.req.Method=method;4.req.ContentLength=content.Length;5.Streams;6.s=req.GetRequestStream();7.StreamWritersw=newStreamWriter(s,Encoding.ASCII);8.sw.Write(content);9.sw.Close();10.HttpWebResponseres=(HttpWebResponse)req.GetResponse();11.s=res.GetResponseStream();12.StreamReadersr=newStreamReader(s,Encoding.ASCII);13.StringBuildersb=newStringBuilder();14.char[]data=newchar[1024];15.intnBytes;16.do{nBytes=sr.Read(data,0,(int)1024);17.sb.Append(data);18.}while(nBytes==1024);下面的代码是异步调用代码实现1.publicclassHandler2.{3.publicvoidCallback(IAsyncResultar)4.{HttpWebRequestreq=(HttpWebRequest)ar.AsyncState;5.HttpWebResponseres=(HttpWebResponse)req.EndGetResponse(ar);6.Streams=res.GetResponseStream();7.StreamReadersr=newStreamReader(s,Encoding.ASCII);8.StringBuildersb=newStringBuilder();9.char[]data=newchar[1024];10.intnBytes;11.do12.{13.nBytes=sr.Read(data,0,(int)1024);14.sb.Append(data);15.}while(nBytes==1024);16....17.}18.}1.Streams;2.HttpWebRequestreq=(HttpWebRequest)WebRequest.Create(url);3.req.ContentType=contentType;4.req.Method=method;5.req.ContentLength=content.Length;6.s=req.GetRequestS