解析Atlas服务器端支持(下)(1)

来源:网络收集 责任编辑:栏目编辑 发表时间:2013-07-01 22:01 点击:

【导读】在上一篇文章里,我们分析了一部分服务器端的代码。本文将继续解析Atlas服务器端支持这一功能是如何工作的。 

在上一篇文章《解析Atlas服务器端支持(上)》里,我们分析了一部分服务器端的代码。到现在为止,我们已经获得处理Web Services方法请求的Handler,马上就要开始Process Request了。我们知道,处理Web Services方法请求的Handler是RestHandler,所以我们来看一下它的ProcessHandler方法:

ProcessRequest获得调用结果代码分析:

1 public void ProcessRequest(HttpContext context)

2 {

3 // 根据Web Services的Cache设置来配置Cache策略

4 this.InitializeCachePolicy(context);

5

6 try

7 {

8 string contentType;

9

10 // 从body的JSON字符串中得到输入的参数。

11 IDictionary<string, object> inputParams = this.GetRawParams(context);

12

13 // this._webServiceMethodData.Ower.Type即获得了即将调用的那个

14 // Web Service类,通过Activator.CreateInstance方法构造实例。

15 object serviceObj = Activator.CreateInstance(this._webServiceMethodData.Owner.Type);

16

17 // 这是一段很有技巧的代码,我们目前不去分析它。

18 DataService service = serviceObj as DataService;

19 if (service != null)

20 {

21 service.IsCalledRemotely = true;

22 }

23

24 // Call这个Web Service方法来得到结果

25 object resultObj = this._webServiceMethodData.CallMethodFromRawParams(serviceObj, inputParams);

26

27 ……

28 }

29 catch (Exception e)

30 {

31 ……

32 }

33 }

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

GetRawParams(HttpContext) :

1 private IDictionary<string, object> GetRawParams(HttpContext context)

2 {

3 // 如果是Cross Domain Access,则抛出异常

4 if (!this._webServiceMethodData.SafeForCrossDomain && ChildRequest.IsCrossDomainRequest(context))

5 {

6 throw new InvalidOperationException(

7 string.Format(

8 CultureInfo.CurrentCulture,

9 AtlasWeb.InvalidCrossDomainRequest,

10 new object[] { this._webServiceMethodData.MethodInfo.Name }));

11 }

12

13 // 如果使用HTTP POST方法

14 if (context.Request.HttpMethod == "POST")

15 {

16 // 则通过Body中的JSON代码获得参数

17 return this.GetRawParamsFromPostRequest(context);

18 }

19

20 // 由于使用了HTTP GET方法,需要看一下Web Services方法是否允许GET操作

21 if (!this._webServiceMethodData.GetVerbEnabled)

22 {

23 throw new InvalidOperationException(

24 string.Format(

25 CultureInfo.CurrentCulture,

26 AtlasWeb.InvalidGetRequest,

27 new object[] { this._webServiceMethodData.MethodInfo.Name }));

28 }

29

30 // 从Query String中获得参数

31 return this.GetRawParamsFromGetRequest(context);

32 }

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

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

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1