Hello World
Spiga

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

2006-10-11 15:22 by 老赵, 3003 visits
  在上一篇文章里,我们分析了一部分服务器端的代码。到现在为止,我们已经获得处理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空间输出信息”效果

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

11 条回复

  1. 老赵
    admin
    链接

    老赵 2006-10-11 15:24:00

    增加了两个范例,希望能对大家有所帮助,也希望能增加我文章的吸引力。:)

  2. TerryLee
    *.*.*.*
    链接

    TerryLee 2006-10-11 16:48:00

    你的文章已经很具有吸引了,呵呵:-)

  3. 老赵
    admin
    链接

    老赵 2006-10-11 17:21:00

    @TerryLee
    我觉得一般。
    喜欢深入的人越来越少了。不过说实话,了解这些不会给使用Atlas的能力带来直接影响。我希望我的文章能在有用的时候能够作为参考就可以了。:)

  4. henry
    *.*.*.*
    链接

    henry 2006-10-11 17:38:00

    很好!
    借助XSLTView真是可以做很多灵活表现,如果针对某些共用的表现如(grid,combo)等封装一下对开发人员来说就更省事(简化开发的事情总会有人做)
    期待楼主写更多这样的文章:)

  5. 老赵
    admin
    链接

    老赵 2006-10-11 17:50:00

    @henry
    多谢支持。:)

  6. Dflying Chen
    *.*.*.*
    链接

    Dflying Chen 2006-10-11 18:01:00

    @Jeffrey Zhao
    你帮我写第三卷吧

  7. 老赵
    admin
    链接

    老赵 2006-10-11 20:51:00

    @Dflying Chen
    真的假的?@_@

  8. alphac[未注册用户]
    *.*.*.*
    链接

    alphac[未注册用户] 2006-10-11 23:56:00

    一直闹不明白json 是 什么东西?

  9. 老赵
    admin
    链接

    老赵 2006-10-12 00:24:00

    @alphac
    JSON是“JavaScript Object Notation”的缩写,是Javascript里表示一个对象的方式,由两种基本结构组成。
    第一种是“字典”,使用大括号表示,用逗号分隔元素,例如:
    {
    FirstName : "Jeffrey",
    LastName : "Zhao"
    }
    第二种是“数组”,使用方括号表示,用逗号分隔元素,例如:
    [
    "Tom",
    "Jerry"
    ]
    这两种数据结构的组合就能够表示几乎所有的对象结构。:)

  10. 暮松
    *.*.*.*
    链接

    暮松 2006-10-17 09:23:00

    老赵果然是牛人,学习,呵呵~~~

  11. 老赵
    admin
    链接

    老赵 2006-10-17 09:25:00

    @暮松
    哎?这“果然”两个字从何而来啊?

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我