代码改变世界

深入Atlas系列:Web Sevices Access in Atlas(3) - 服务器端支持(下)

2006-10-11 15:22 Jeffrey Zhao 阅读(...) 评论(...) 编辑 收藏
  在上一篇文章里,我们分析了一部分服务器端的代码。到现在为止,我们已经获得处理Web Services方法请求的Handler,马上就要开始Process Request了。

我们知道,处理Web Services方法请求的Handler是RestHandler,所以我们来看一下它的ProcessHandler方法:
ProcessRequest获得调用结果代码分析

首先调用InitializeCachePolicy方法来处理缓存策略,代码很短也很简单,因此不多解释了。其次查看serviceObj是否是DataService类型,如果是的话则将IsCalledRemotely设为ture,这是比较有技巧的做法,我们目前不去分析它。接着通过GetRawParams方法方法获得以Dictionary方式存放的参数,我们需要看一下它的框架,可以了解它获得参数的方法。
GetRawParams(HttpContext)

一个Web Service方法,可以使用Microsoft.Web.Services.WebOperationAttribute来标记是否使用能够通过GET方法访问。下面的代码让该Web Service方法允许使用GET方法来访问:
[WebOperation(true)]

获得的Dictionary数据结构以Key - Value的方式对应的参数名和表示参数值的字符串,如果是复杂类型的话会产生许多层的Dictionary或List,大家应该能够想象出来它是什么样子,因为这和大名鼎鼎的JSON非常相似!获得参数之后,会将其传入WebServiceMethodData的CallMethodFromRawParams方法,以获得方法执行的结果。

WebServiceMethodData.CallMethodFromRawParams方法代码如下:
CallMethodFromRawParams方法分析

首先通过StrongTypeParameters方法来获得一个强类型的参数字典,它不会有多层的Dictionary或List。此方法非常的复杂,在这里就先不进行分析了,有兴趣的朋友可以先看一下相关代码,我会在今后的文章中分析这些代码的细节,它们还是写得非常优秀的。得到强类型的参数后,就会使用CallMethod来调用方法得到结果了。在这里面只是使用了简单的Reflection,相信大家也能够想象得到个中实现。

接下来就要输出结果了,代码如下:
ProcessRequest输出结果代码分析

要设置该Web Services方法的输出方式为XML(UseXmlResponse == true),则也是需要使用Microsoft.Web.Services.WebOperationAttribute来标记方法,如下:
[WebOperation(false, ResponseFormatMode.Xml)]

后面会有一个例子来演示这一点。如果该方法被标记使用XML方式输出,则会判断结果类型。如果是字符串则直接输出;如果是Xml类型的结果,则输出它的OuterXml;最后则会尝试使用XmlSerializer来序列化这个对象。

在默认情况下,该对象会被JSON序列化输出,这就是我们最常见的做法。

最后,对于异常情况,也需要进行输出。代码如下:
ProcessRequest输出异常代码分析

代码使用RestHandler.WriteExceptionJsonString来分别输出异常的Message,StackTrace和异常的FullName。在代码里可以使用这一点。

到现在为止,可以说Atlas在服务器端对于Web Services的支持代码已经分析完了。我们通过两个实例来详细理解这一点。



范例1:在Web Services方法中使用复杂的数据类型。

首先,我们定义两个表示数据的类,Employee和Company。代码如下:
Employee与Company代码

接着我们定义一个Web Services方法Sort,该方法的作用是拿到公司姓名和一个Employee数组作为参数,将Employee按照姓名排序之后,再组成一个Company对象输出。代码如下:
Sort方法 

然后就是HTML了。在页面最上方(id为employees的div)会显示内存中目前所有的Employee,之后是向内存中添加Employee的输入框,接着是填写公司名的文本框和排序按钮,最后则是经过了Web Services排序后的结果显示区域(id为sortedDisplay的div):
HTML代码

最后我们来看Javascript代码:
Javascript代码

所有的代码都在这里,我们来看一下使用。首先打开页面,输入数个Employee,如图:


然后点击填写好Company Name并点击Sort按钮,则可以看出按照姓名排序后的结果:


我们使用Fiddler查看一下数据传输,可以看到Request Body和Response Body里的JSON代码:


可以看出,Atlas使用了JSON方式传递数据非常的直观,对于复杂的类型支持也非常好。在客户端得到的对象,其结构和服务器端相同,这对于开发人员带来了不小的便利。



范例2:使用Web Services将对象序列化成XML并使用客户端XSLTView空间输出信息

使用了与上例相同的Employee和Company两个类,在这里就不重复了,先来看一下Web Service方法GetXmlSerializedCompany的代码:
GetXmlSerializedCompany方法代码

这个方法简单地令人惊讶,只是直接将参数返回。其精妙之处就是使用了Microsoft.Web.Services.WebOperationAttribute进行标记,表明了该方法将以XML形式输出。

接下来是HTML,与上例非常的相似,就不多作解释了。代码如下:
HTML代码

然后准备一下Atlas Xml Script,声明一个XmlDataSource,用来获得XSLT文件。再添加一个XSLTView,将其transform属性与XmlDataSource的document属性绑定起来。代码如下:
Atlas Xml Script代码

顺便给出Company.xsl文件代码:
Company.xsl

然后是Javascript代码,大部分与上例相同,只作了少量注释:
Javascript代码

代码就是这些,接下来看一下使用。首先依旧是添加数个Employee:


填写Company Name并点击“Serialize!”按钮,可以看到下方的XSLT输出:


使用Fiddler查看的Request Body和Response Body的信息:


正如我们所期望的那样,Response Body里的信息是Company对象被Xml序列化之后的结果,然后使用XSLT转换后即得到了我们需要的信息!



通过了上面两个例子,我们可以看出Atlas对于Web Services的支持是非常灵活的。具体的使用方式让开发人员有很大的发挥空间,开发人员完全可以选择合适的方式把Atlas灵活运用在自己的项目中。

当然,Atlas对于Web Services的支持还远不止这些,在以后的文章里我会继续从实现角度对Atlas的Web Services进行分析,并提供更多的范例给大家参考。希望大家支持我的“深入Atlas系列”,谢谢大家。


点击这里下载两个范例的代码。
点击这里查看“在Web Services方法中使用复杂的数据类型”效果
点击这里查看“使用Web Services将对象序列化成XML并使用客户端XSLTView空间输出信息”效果