




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AjaxPro实现机制浅析以一个最简单的例子开始:点击一个客户端button,触发一个javascript函数,执行一个只有一个string参数的服务端方法,返回一个处理过的string,处理方法是将传入的string变成“Hi”+string +“!”;够简单了,为了是不希望罗嗦的代码影响简单的分析;所有代码如下:无标题页functiondoTest()AJAXDemo.Examples.Test.TestMethod.GetTest(AjaxPro,doTest_callback);functiondoTest_callback(res)alert(res.value);Test.aspx.cspublicpartialclassTest:System.Web.UI.PageprotectedvoidPage_Load(objectsender,EventArgse)Utility.RegisterTypeForAjax(typeof(AJAXDemo.Examples.Test.TestMethod);AJAXDemo.Examples.TestusingSystem;usingAjaxPro;namespaceAJAXDemo.Examples.TestpublicclassTestMethodpublicTestMethod()AjaxMethodpublicstringGetTest(stringtestText)returnHi,+testText+!;1.首先我们看AjaxPro在页面上给我们生成了什么?Test1无标题页functiondoTest()AJAXDemo.Examples.Test.TestMethod.GetTest(AjaxPro,doTest_callback);functiondoTest_callback(res)alert(res.value);一定要注意这几行通过使用http:/localhost:3578/AJAXDemo.2/ajaxpro/prototype.ashx和http:/localhost:3578/AJAXDemo.2/ajaxpro/core.ashx不难发现,其中前面两个是源代码中带的两个js文件(core.js和prototype.js)转化出来的,基本内容也跟原来的文件一样,而converter.ashx和AJAXDemo.Examples.Test.TestMethod,App_Code.urx4hqkg.ashx里面有什么呢?看下面:AJAXDemo.Examples.Test.TestMethod,App_Code.urx4hqkg.ashxaddNamespace(AJAXDemo.Examples.Test);AJAXDemo.Examples.Test.TestMethod_class=Class.create();AJAXDemo.Examples.Test.TestMethod_totype=(newAjaxPro.AjaxClass().extend(GetTest:function(testText)returnthis.invoke(GetTest,testText:testText,this.GetTest.getArguments().slice(1);,initialize:function()this.url=/AJAXDemo.2/ajaxpro/AJAXDemo.Examples.Test.TestMethod,App_Code.un7rskvh.ashx;);AJAXDemo.Examples.Test.TestMethod=newAJAXDemo.Examples.Test.TestMethod_class();converter.ashx addNamespace(Ajax.Web);Ajax.Web.NameValueCollection=function()this._type=System.Collections.Specialized.NameValueCollection;this.add=function(key,value)if(thiskey=null)thiskey=value;this.getKeys=function()varkeys=;for(keyinthis)if(typeofthiskey!=function)keys.push(key);returnkeys;this.getValue=function(key)returnthiskey;this.toJSON=function()varo=this;o.toJSON=null;deleteo.toJSON;returnAjaxPro.toJSON(o);addNamespace(Ajax.Web);Ajax.Web.DataTable=function(columns,rows)this._type=System.Data.DataTable,System.Data;this.Columns=newArray();this.Rows=newArray();this.addColumn=function(name,type)varc=newObject();c.Name=name;c._type=type;this.Columns.push(c);this.toJSON=function()vardt=newObject();dt.Columns=;for(vari=0;ithis.Columns.length;i+)dt.Columns.push(this.Columnsi.Name,this.Columnsi._type);dt.Rows=;for(vari=0;ithis.Rows.length;i+)varrow=;for(varj=0;jthis.Columns.length;j+)row.push(this.Rowsithis.Columnsj.Name);dt.Rows.push(row);returnAjaxPro.toJSON(dt);this.addRow=function(row)this.Rows.push(row);if(columns!=null)for(vari=0;icolumns.length;i+)this.addColumn(columnsi0,columnsi1);if(rows!=null)for(vari=0;irows.length;i+)varrow=newObject();for(varc=0;cthis.Columns.length&crowsi.length;c+)rowthis.Columnsc.Name=rowsic;this.addRow(row);addNamespace(Ajax.Web);Ajax.Web.DataSet=function(tables)this._type=System.Data.DataSet,System.Data;this.Tables=newArray();this.addTable=function(table)this.Tables.push(table);if(tables!=null)for(vari=0;itables.length;i+)this.addTable(tablesi);functionPerson(id)this.FirstName=;this.FamilyName=;this.Age=0;this.ID=id;this._type=AJAXDemo.Examples.Classes.Person,App_Code.un7rskvh,Version=,Culture=neutral,PublicKeyToken=null;Ptotype.get_FullName=function()returnthis.FirstName+this.FamilyName;Ptotype.toJSON=function()varo=newObject();o.firstName=this.FirstName;o.familyName=this.FamilyName;o.age=this.Age;o.id=this.ID;returnAjaxPro.toJSON(o);Ptotype.save=function()returnPerson.save(this);Person.save=function(p)varps=newPersonSaver();returnps.savePerson(p);/synchronouscallvarPersonSaver=Class.create();PersonStotype=(newAjaxPro.Request().extend(savePerson:function(p)returnthis.invoke(SavePerson,p:p).value;,initialize:function()this.url=ajaxpro/AJAXDemo.Examples.Classes.Person,App_Code.un7rskvh,Version=,Culture=neutral,PublicKeyToken=null.ashx;)正因为是有了上面四个ashx文件我们的functiondoTest() AJAXDemo.Examples.Test.TestMethod.GetTest(AjaxPro,doTest_callback);才得以异步执行,这些ashx文件又是怎么生成到页面上的,那得归功于web.config的相关配置和下面这句代码:Utility.RegisterTypeForAjax(typeof(AJAXDemo.Examples.Test.TestMethod);至于Utility.RegisterTypeForAjax方法产生的一序列动作我将在后文中继续说明,有兴趣的可以自己跟踪下这些代码的执行。说到AjaxPro为我们生成了四个ashx文件来达到异步调用的目的,这次呢,就说说这些ashx文件是怎么生成的;核心部分是其web.config配置了httpHandlers 元素作用是:对ajaxpro目录下的*.ashx文件的POST,GET请求交由程序集AjaxPro下的AjaxPro.AjaxHandlerFactory类来处理;ps:关于httpHandlers的说明可以参看下面几个连接1.httpHandlers 元素(ASP.NET 设置架构)2.Microsoft ASP.NET 快速入门教程3.ASP.NET中的Http Handles 先看看实现IHttpHandlerFactory接口的AjaxHandlerFactory类,只实现了GetHandler方法其中对core,prototype的处理没什么可说,只是简单的通过EmbeddedJavaScriptHandler的ProcessRequest中将js写入.ashx文件,而converter比较复杂留代下次再做详细分析;这里就重点看看AJAXDemo.Examples.Test.TestMethod,App_Code.urx4hqkg.ashx是怎么来的了;我跟踪了下代码的运行,在页面加载的时候自定义 HttpHandler 启用 HTTP Web 请求的处理ProcessRequest,也就是进入AjaxHandlerFactory类GetHandler方法的如下入口default:if(Utility.Settings.UrlNamespaceMappings.Contains(filename)t=Type.GetType(Utility.Settings.UrlNamespaceMappingsfilename.ToString();if(t=null)t=Type.GetType(filename);returnnewTypeJavaScriptHandler(t);TypeJavaScriptHandler也实现了IHttpHandler接口,其ProcessRequest方法如下:publicvoidProcessRequest(HttpContextcontext)/Therequestwasnotarequesttoinvokeaserver-sidemethod./Now,wewillrendertheJavascriptthatwillbeusedonthe/clienttorunasaproxyorwrapperforthemethodsmarked/withtheAjaxMethodAttribute.if(context.Trace.IsEnabled)context.Trace.Write(Constant.AjaxID,RenderclassproxyJavascript);System.Reflection.MethodInfomi=type.GetMethods();/Checkwetherthejavascriptisalreadyrenderedandcachedinthe/currentcontext.stringetag=context.Request.HeadersIf-None-Match;stringmodSince=context.Request.HeadersIf-Modified-Since;stringpath=type.FullName+,+type.Assembly.FullName.Split(,)0;if(Utility.Settings!=null&Utility.Settings.UrlNamespaceMappings.ContainsValue(path)foreach(stringkeyinUtility.Settings.UrlNamespaceMappings.Keys)if(Utility.Settings.UrlNamespaceMappingskey.ToString()=path)path=key;break;if(context.Cachepath!=null)CacheInfoci=(CacheInfo)context.Cachepath;if(etag!=null)if(etag=ci.ETag)/TODO:nullcheckcontext.Response.StatusCode=304;return;if(modSince!=null)tryDateTimemodSinced=Convert.ToDateTime(modSince.ToString().ToUniversalTime();if(DateTime.Compare(modSinced,ci.LastModified.ToUniversalTime()=0)context.Response.StatusCode=304;return;catch(Exception)if(context.Trace.IsEnabled)context.Trace.Write(Constant.AjaxID,TheheadervalueforIf-Modified-Since=+modSince+couldnotbeconvertedtoaSystem.DateTime.);etag=type.AssemblyQualifiedName;/+_+type.Assembly.DateTime.Now.ToString(System.Globalization.DateTimeFormatInfo.CurrentInfo.SortableDateTimePattern);etag=MD5Helper.GetHash(System.Text.Encoding.Default.GetBytes(etag);DateTimenow=DateTime.Now;DateTimelastMod=newDateTime(now.Year,now.Month,now.Day,now.Hour,now.Minute,now.Second);/.ToUniversalTime();context.Response.AddHeader(Content-Type,application/x-javascript);context.Response.ContentEncoding=System.Text.Encoding.UTF8;context.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);context.Response.Cache.SetETag(etag);context.Response.Cache.SetLastModified(lastMod);/Ok,wedonothavethejavascriptrendered,yet./Buildthejavascriptsourceandsaveittothecurrent/Applicationcontext.System.Text.StringBuildersb=newSystem.Text.StringBuilder();AjaxNamespaceAttributecma=(AjaxNamespaceAttribute)type.GetCustomAttributes(typeof(AjaxNamespaceAttribute),true);stringclientNS=type.FullName;if(cma.Length0&cma0.ClientNamespace!=null)if(cma0.ClientNamespace.IndexOf(.)0)sb.Append(addNamespace(+cma0.ClientNamespace+);rn);clientNS=cma0.ClientNamespace;elsesb.Append(addNamespace(+(type.FullName.IndexOf(.)0?type.FullName.Substring(0,type.FullName.LastIndexOf(.):type.FullName)+);rn);sb.Append(clientNS);sb.Append(_class=Class.create();rn);sb.Append(clientNS);sb.Append(_totype=(newAjaxPro.AjaxClass().extend(rn);System.Reflection.MethodInfomethod;for(inty=0;ymi.Length;y+)method=miy;if(!method.IsPublic)continue;AjaxNamespaceAttributecmam=(AjaxNamespaceAttribute)method.GetCustomAttributes(typeof(AjaxNamespaceAttribute),true);AjaxMethodAttributema=(AjaxMethodAttribute)method.GetCustomAttributes(typeof(AjaxMethodAttribute),true);if(ma.Length=0)continue;System.Reflection.ParameterInfopi=method.GetParameters();/Renderthefunctionheadersb.Append(t);if(cmam.Length=0)sb.Append(method.Name);elsesb.Append(cmam0.ClientNamespace);sb.Append(:function();/Renderallparametersfor(inti=0;ipi.Length;i+)sb.Append(pii.Name);if(ipi.Length-1)sb.Append(,);sb.Append()rn);/CreatetheXMLHttpRequestobjectsb.Append(ttreturnthis.invoke(+method.Name+,);/mustbetheoriginalmethodnamefor(inti=0;ipi.Length;i+)sb.Append();sb.Append(pii.Name);sb.Append(:);sb.Append(pii.Name);if(ipi.Length-1)sb.Append(,);sb.Append(,this.);if(cmam.Length=0)sb.Append(method.Name);elsesb.Append(cmam0.ClientNamespace);sb.Append(.getArguments().slic
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卫生资格《传染病知识》必做试题及答案
- 电子商务平台设计质量管理及质量保证措施
- 兽医实验室安全知识培训考试题库(含答案)
- 五语上册第七单元教学质量提升计划
- 电机装配工三级安全教育(公司级)考核试卷及答案
- 耐火材料烧成工职业技能考核试卷及答案
- 熔析炉工技能比武考核试卷及答案
- 智慧教学背景下的师德师风心得体会
- 幼儿园安全管理培训计划
- 轻冶料浆配料工上岗考核试卷及答案
- 2025年秋新北师大版数学三年级上册全册教学设计
- 2025-2026人教版(2024)物理九年级全册教学进度表
- 义务教育质量监测学校成绩分析报告
- 2025版房地产抵押按揭续贷合同
- 2025年秋季小学四年级上册语文教学计划及教学进度表
- 北京市西城区2024-2025学年七年级下学期期末道德与法治试题(解析版)
- 2025年广东省高考化学试题(含答案解析)
- 【2025秋新版】三年级上册语文生字组词
- 节能环保供货保证措施
- 《国际中文教育概论》课件全套 第1-12章 从对外汉语教学到国际中文教育- 国际中文教育前瞻
- 屈光不正的处方原则讲义
评论
0/150
提交评论