解析Atlas服务器端支持(下)(1)
【导读】在上一篇文章里,我们分析了一部分服务器端的代码。本文将继续解析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方法,以获得方法执行的结果
- 发表评论
-
- 最新评论 更多>>