Part VI: Building ASP.NET Web Services
CHAPTER 22 Creating an XML Web Service
22.1 Overview of XML Web Services
讲述了Web Service的优点
22.2 Creating a Simple XML Web Service
创建web service的步骤如下
创建一个类,是public的,继承自WebService
声明方法,是public的,并且有attribute WebMethod修饰
源代码文件的后缀名是asmx
Setting WebMethod Attributes
WebMethod attribute有很多的可选属性,
BufferResponse,默认情况下,Web Service方法和属性是成块成块作为响应返回的,如果希望使用流的方式进行响应的话,可以设置这个属性为false
CacheDuration,默认情况下,web service方法和属性是不会对响应做cache的。但是通过设置这个属性为一个整数值能够完成cache的功能
Description,描述
EnableSession,默认情况下,Web Service的方法和属性是不参与到session state中的,如果设定为true,那么方法和属性就能够使用session state会话状态了
MessageName,对web method起一个别名
TrasactionOption,用于设定web service是否参与到事务中,默认是false
Setting WebService Attributes
WebService attribute也有很多可选属性,
Description,描述
Name,为Web Service起一个名字,默认使用了类的名字
Namespace,为Web Service指定一个xml namespace。默认是http://tempuri.org/,可以使用其他的URL作为namespace,用处在于作为一个唯一标识使用,以便两个公司开发的web service不会冲突
22.3 Testing an XML Web Service from a Browser
如果想要测试web service,可以类似于访问网页一样访问asmx文件
可以使用SOAP/HTTP-Post/HTTP-Get来访问web service
如果asp.net默认不支持某种访问方法,那么可以通过在web.config文件的<webServices> <protocols>中增加访问方式的节点可以解决这个问题
Invoking an XML Web Service with HTTP-Get
HTTP-Get是标准的HTTP协议,使用URL来传递请求或者post一个使用了METHOD="Get"的form
例如可以在HTML文档中,增加一个如下的超链接来调用web service,如下,
<a href="/Service/SomeWebService.asmx/MethodName?ParameterName=Value">Content</a>
也可以使用URL的方式直接调用Web Service,如下,
http://localhost/Service/SomeWebService.asmx/MethodName?ParameterName=Value
在被调用后WebSercie的方法会返回一个XML文档,用于代表执行后的结果,例如,
<?xml version="1.0" encoding="utf-8" ?>
<double xmlns="http://tempuri.org/">0</double>
Invoking an XML Web Service with HTTP-Post
HTTP-Post是标准HTTP协议,用于传递属性METHOD="Post"的form提交的数据
可以在HTML文档中,使用如下的方式调用WebService,
<form method="post" action="/Service/SomeWebService.asmx/MethodName">
<input name="TF" value="32">
<input type="submit" value="Convert">
</form>
返回结果和HTTP-Get的一样
Invoking an XML Web Service with SOAP
SOAP,简单数据访问协议,允许开发员在网络上传递更复杂类型的消息。可以借助SOAP协议来传递不能够使用HTTP-Get或者HTTP-Post传递的数据
SOAP是一个基于XML格式的协议。SOAP消息包含一个信封头部分,用于包含被传输的数据
SOAP调用的样式大致如下,
……
<soap:Body>
<SomeMethod xmlns="……" >
<ParameterName>value</ParameterName>
</SomeMethod>
</soap:Body>
……
和HTTP-Get/HTTP-Post不一样的是,SOAP协议不是被约束在HTTP协议上的,可以使用在HTTP协议上使用SOAP,也可以在其他协议上使用SOAP,例如SMTP
22.4 Accessing an XML Web Service Through a Proxy Class
Generating an XML Web Service Proxy Class
Using an XML Web Service Proxy Class
这两部分不看了,VS.Net都已经在背后做好了
Working with the Web Services Description Language Tool
这部分讲解了Wsdl.exe这个工具的命令行参数
Setting Proxy Class Properties
Proxy类的父类是SoapHttpClientProtocol类,SoapHttpClientProtocol类有很多的属性,
AllowAutoRedirect,bool值,表明对某个web service的请求是否可以被自动重定向到其他的URL
ClientCertificates,客户端认证集合
CookieContainer,包含了和proxy类有关的cookie的一个CookieContainer实例
Credentials,实现了ICredentials接口的类,用于Basic、Digest和NTLM或者Kerberos认证
PreAuthenticate,bool值,表明www认证头是否在每次请求的时候都需要发送,默认是false
Proxy,实现了IWebProxy接口的类,包含了保证请求通过防火墙的信息
RequestEncoding,对于代理请求所使用的字符串编码方式
Timeout,整形数值,微秒级别,表明代理请求的过期时间,默认为-1,代表永远不过期
Url,代理在发送请求的时候所使用的URL
22.5 Transmitting Complex Data in an XML Web Service
XML Web Services and Arrays
WebService的web method声明返回Array类的一个实例,杂page端,接收这个array,并根据array创建界面
XML Web Services and Classes
首先,创建要返回的类
其次,编码WebService和WebMethod,其中WebMethod返回类型是已经创建好的类
最后,在Page上进行接收WebMethod以后的编程处理
Web Services and DataSets
首先,编码WebService和WebMethod,其中WebMethod返回类型是DataSet
其次,在Page上进行接收WebMethod以后的处理
Web Services and Binary Files
首先,编码WebService和WebMethod,其中WebMethod返回类型是Byte数组
其次,在Page上进行编码处理,可能用WebMethod返回的Byte数组创建MemeryStream的实例,再把MemeryStream的实例作为参数初始化其他的Binary内容,例如图片、声音等等
22.6 Examining XML Web Service and Web Site Interaction
XML Web Services and Application State
web站点和web服务可以共享同一个application state,使用application state可以在web站点和web服务之间交换信息
书上举的例子是一个计数器的例子,在web服务中借助application state实现了一个application级别的计数器,然后在web站点上,调用这个web服务,完成计数的增加等等
XML Web Services and Session State
默认情况下,出于性能方面的考虑,session state对于web服务来讲是被禁止掉的。但是通过修改WebMethod Attribute的EnableSession属性,可以允许被修改的web方法使用session state
CHAPTER 23 Advanced XML Web Services
23.1 Using the WebService Behavior
之所以能够使用IE6直接访问web service,是因为使用了WebService behavior
behavior是一个组件,可以和HTML页面中的元素关联起来,从而扩展此元素的默认功能
使用Behavior访问Web服务的最大优点在于,可以在不重新载入整个页面的前题下,更新页面的内容
Examining Limitations of the WebService Behavior
behavior有一些限制,如下,
首先,使用WebSercie behavior只能够访问哪些位于同一个域中存在形式为Web页面的包含有behavior的web服务。如果想要访问远程的其他web服务,必须通过位于同一个域中的代理web服务来完成
第二,WebService behavior支持所有的.Net基本数据类型以及相应的数组形式,但是,不直接支持更复杂的数据类型,例如DataSet,DataTable或者自定义的对象
Creating a Simple Page with a WebService Behavior
如果要通过WebService behavior直接访问Web服务,而不借助于proxy类,需要按照以下步骤,
第一,把WebService behavior和HTML页面上的元素关联起来,例如,
连接一个div和WebService代码如下,
<div id="myDiv"
style="behavior:url(webservice.htc)"
onresult="page中定义的方法名称" //这种处理回调结果的方法,是事件处理方式,结果返回的时候,触发指定的事件
/div>
第二,使用WebService behavior的useService()方法来获取web服务的位置,例如
Service.useService("/Service/WebService.asmx?WSDL", "ServiceName");
第三,通过WebService behavior的callService()方法来调用web服务
默认情况下,WebService behavior异步调用web服务的方法,不是同步调用的
当把HTML页面上的元素和WebService behavior连接起来的时候,就已经设定了使用JavaScript的函数来处理结果
Using a WebService Behavior Callback Function
获取web方法的结果有两个途径,
第一,使用事件处理程序
第二,定义回调函数
使用回调函数要完成的步骤是,
在WebService behavior的callService()方法中,第一个参数指定回调函数的名称
在连接WebService behavior和HTML页面元素的时候,不指定onresult属性的值
Catching Errors in a WebService Behavior
如果Web服务出现了错误,怎么办?怎么处理这些异常呢?
使用result对象的error属性来获取异常,如果web服务没有被访问到,result.error属性是true
使用errorDetail对象获取详细的错误信息,errorDetail有三个属性,
code,错误代码
raw,由web服务的方法调用返回的SOAP包的原始内容
string,一个人性化的错误信息
Using a WebService Behavior to Perform Partial Page Updates
通过JavaScript的setInterval函数设定一个等时间间隔的循环,每次循环使用Service.useService()方法和Service.callService()方法来进行web服务的调用,最后,在使用事件处理或者回调函数来处理返回结果,就可以更新部分页面内容了
Using the WebService Behavior to Retrieve Database Data
WebService behavior不支持DataTable和DataSet之类的复杂对象,所以,如果需要返回数据记录,可以让web method返回一个数组,把DataTable中的记录转换成数组
23.2 Securing an XML Web Service
Overview of the Secure XML Web Service
所谓的Secury,也就是安全,就是禁止未被授权的用户不能够调用web方法
一种解决方案是,要求用户在调用web方法的时候提供用户名和密码。这个方法不好,如果web方法非常多,每次都需要验证用户名和密码,太恐怖了
书中给出的方案是,使用一个自定义的SOAP头以传输验证信息。
如果在SOAP头中只是传输用户名和密码是非常危险的,因为SOAP包是以xml文档的格式传递的,这要是被别人截获到,是非常危险的
为了避免其他人截获,可以使用SSL来加密所有发送给web服务的消息,但是SSL对性能的影响是非常大的,毕竟每一个都需要解密和加密
解决的方案是,定义一个方法,需要使用SSL来加密消息,如果用户得到验证,就返回给用户一个Session Key以便识别用户,这个Session Key放在SOAP头部,代替了用户名和密码的传输,并且通过各session key定一个存活时间长度,也可以保证在过了一段时间以后,session key失效
Creating the Database Tables
书上的这部分是为了下面几个部分的演示做准备,使用了两段SQL语句生成了两个数据表,一个WebServiceUsers,存放用户名、密码,一个SessionKeys.sql,存放SessionKey和失效时间
Creating the Login() Method
Login()方法返回类型是一个自定义的类型ServiceTicket,主要完成了三件事情
验证用户名、密码正确与否
将当前的session state加入到cache中
返回合法的sessionkey
自定义类ServiceTicket,有三个属性,
IsAuthenticated,bool类型
SessionKey,String类型
Expiration,DateTime类型
Retrieving the Custom SOAP Header
web服务使用自定义的SOAP头来获取验证信息,session key被放在SOAP头中的AuthHeader部分
通过创建一个SOAPHeader的子类,可以创建一个SOAP头
如果在web method中需要获取这个头,必须在WebMethod的SoapHeader attribute上进行说明,例如,
[WebMethod SoapHeader("AuthenticateHeader")]
public bool GetSomething() { return AuthenticateHeader == null; }
Authenticating the Session Key
这部分不多说,就是根据传入的SOAP头中的信息,判断是否是合法用户
Caching the Session Keys
把Session Key放入到Cache中,避免每次验证都要去数据库中取数据
Building the Secure XML Web Service
不说了,编译一下,部署一下,以便Page可以访问Web服务
Accessing the Secure Web Service
如何使用,不讲了,非重点部分
23.3 Using HTML Pattern Matching
使用HTML模式匹配,可以把任何的Web站点变成好像是一个Web服务一样。HTML模式匹配可以使得开发员通过设定正则表达式从任何文档中获取内容,获取的内容作为web服务的属性被返回给调用端
HTML模式匹配的应用场景,
访问原有的系统中的数据,例如原有的数据作为文件存放在硬盘上,那么使用HTML模式匹配完成数据的查询和读取
HTML模式匹配也可以用于和没有实现web服务的web站点进行通讯。例如,某个站点没有实现web服务,而是提供了HTML页面,通过使用HTML模式匹配可以从这些HTML页面上抓取需要的信息
Creating the WSDL Document
使用HTML模式匹配的最大的工作就是创建一个WSDL文档,文档中描述了通过web服务中的所有方法和属性以及每个方法的参数类型
Specifying the Regular Expression Pattern
Creating a Simple HTML Pattern Matching Service
Using Input Parameters with HTML Pattern Matching
Building the Six Degrees Web Service