Kevin-moon

学习在于分享
随笔 - 34, 文章 - 3, 评论 - 485, 阅读 - 21万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

ASP.NET AJAX CodePlex Preview 3的代码解析

Posted on   Kevin-moon  阅读(1634)  评论(3编辑  收藏  举报

     忙了半个月,现在终于闲下来了,有时间写博,感觉真爽!刚刚看到有人想一起研究ASP.NET AJAX CodePlex Preview 3的帖子,正好前段时间小研究了下.Preview3就出了两个JS(MicrosoftAjaxAdoNet.js和MicrosoftAjaxTemplates.js).
     这里先介绍下MicrosoftAjaxAdoNet类库,对于它的介绍在MS提供的文档中都说明了.这里只是解析下代码,并一起讨论下.先放一张这个类库中的类关系图上来



下面看下它的基础类:


AdoNetQueryBuilder类: 
主要属性:
     _queryParameters: uri的?之后的参数数组
     _uri: uri的?之前的地址

用处: 
     对URL的分解,根据查询的参数(?之后)创建参数数组(array),同时也可以设置$skip,$top,$orderby,$filter,$expand这些参数,但是这些参数如何使用的,还不清楚!?
     在该类库中还用在AdoNetServiceProxy的invoke服务,用于分解参数operationUri.


AdoNetActionResult类
主要属性:
     _actionContext, _error, _operation, _result
用处:
     AdoNetActionSequence队列执行完动作后,成功/失败的回调函数返回的结果对象.

_AdoNetUtil类
     这是是内部使用的类,主要包括三个方法
     concatUris(serviceUri, resourceUri): 合并两个uri
     extractETag: 获取item对象的etag属性.(item对象是AdoNetServiceProxy中传给每个服务[insert,update...]的内容参数)
     extractUri: 获取item对象内__metadata的uri属性


AdoNetServiceError类
属性:
     _errorObject: 异常对象
     _message: 异常信息
     _statusCode: 状态码
     _timedOut: 请求是否超时
用处:
     AdoNetServiceProxy中服务请求服务器的过程中,请求失败返回的异常对象

核心的类:
AdoNetActionSequence类: 
主要属性:
     _actionQueue: 服务队列
     _dataService: AdoNetServiceProxy对象
     addInsertAction: 将AdoNetServiceProxy的insert服务加入队列, 
     addInvokeAction: 将AdoNetServiceProxy的invoke服务加入队列, 
     addUpdateAction: 将AdoNetServiceProxy的update服务加入队列, 
     addRemoveAction: 将AdoNetServiceProxy的remove服务加入队列,
     clearActions: 清除队列中的所有服务
     execute: 批量执行队列中的每个服务
作用:

     动作的队列,可以利用add...这些方法将insertAction,InvokeAction,UpdateAction,RemoveAction这些动作放到数组里面,然后再通过execute批量执行. 也就是提供个批量管理和执行服务的接口.
下面是addInsertAction的方法中加入队列的CODE,其他的代码类试:
Code


AdoNetServiceProxy类: 
主要属性:
     _defaultFailedCallback: 失败的回调函数
     _defaultSucceededCallback: 成功的回调函数
     _defaultUserContext:
     _serviceUri: 服务器的Uri
     _timeout: Ajax请求的超时时间
     _usePostTunneling:

方法:
     createActionSequence: 创建服务队列
     _prepareWebRequest: 构造WebRequest对象
     insert服务:(item, resourceSetUri, succeededCallback, failedCallback, userContext, webRequest)
     invoke服务:(operationUri, httpVerb, parameters, succeededCallback, failedCallback, userContext, webRequest)
     remove服务:(item, succeededCallback, failedCallback, userContext, webRequest)
     update服务:(item, succeededCallback, failedCallback, userContext, webRequest)
     query服务: (query, succeededCallback, failedCallback, userContext, webRequest)


     这是类库中最核心的类,提供了允许和服务器交互的各种服务.同时也是最复杂的类.大家先看下_prepareWebRequest这是每个服务都要首先调用的方法,因为每个服务都要构造自己的WebRequest对象.

Code

看完了吧,先讲下_prepareWebRequest的参数:
参数item: 1, 等待新增/修改/删除的对象,它将被序列化为JSON,然后被设置到webrequest的body上
             2, 如果item中存在__Metedate,并且它的uri也存在的话,那么将该对象的uri赋予到webrequest上.
参数relativeUri: 请求的相对地址,并和_serviceUri属性一起构成webrequest的uri
参数verb: Web请求的类型(GET/POST)

其他的参数都是和回调函数有关的参数,比较容易的.

     在这个地方,我一直有点不理解的地方,就是webrequest的set_uri,它是设定服务器的Uri,但是在这里这个地址来源与item对象中的__Metedate和relativeUri,而且__Metedate的优先级更高,大家再看下上面每个服务的参数,就insert服务有relativeUri这个参数,其他的例如udpate,remove服务都没有这个参数,它们都是需要来自__Metedate.Uri, MS为什么需要这样?一直没有想明白......
     好了,现在去看MicrosoftAjaxTemplates.js了,呵呵!刚刚看完,就写出来了,所以如果有什么理解不对的地方,大家一起讨论下,呵呵!

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示