2022年Ajax是如何调用服务器端C#方法[归 .pdf
《2022年Ajax是如何调用服务器端C#方法[归 .pdf》由会员分享,可在线阅读,更多相关《2022年Ajax是如何调用服务器端C#方法[归 .pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、谈起 Ajax 做过 web开发的都非常熟悉,就是通过xmlhttp request与服务器端通信而避免页面刷新。关于Ajax 是如何运作的,网上有很多帖子解释其各js文件的作用及调用xmlhttp的原理。但 Ajax 到底是怎么调用服务器端的C#代码的呢?怎么让后台的方法运行并将结果反馈给xmlhttp的呢?曾经有个同事问起我这个问题,我还真懵了!本以为象.Net 1.1下通过 form 传递必要的EventName 及 EventPara 等参数传给服务器端继而解析后执行对应的事件一样来调用 C#代码的(.net 调用事件机制也不全是这么回事,待探讨),但通过仔细研究,发现原来远不是这么回
2、事,而网上更深入的文章却少之又少。我们由浅到深吧,先看看相对表象的东西,即前台 Ajax 相关的 JavaScript代码部分。之所以说相对肤浅和表象,是因为这些资料很多网友已经撰文解读过。凡要使用 AjaxPro,我们大致要做以下工作:1)在项目中引用 AjaxPro.dll(我用的是 AjaxPro.2.dll,版本 6.6.13.2),并在 web.config中 httpHandlers配置节添加:2)在要使用 Ajax 功能的页面.cs 文件上注册 Ajax,例如:protected void Page_Load(object sender,EventArgs e)/注册 Ajax
3、AjaxPro.Utility.RegisterTypeForAjax(typeof(Default);3)在.cs 文件中声明可以被Ajax 调用的函数(或属性),如:AjaxPro.AjaxMethod public string GetChild(string parentId)return return value from.cs file;4)在.aspx 文件中用 JavaScript调用 Ajax,如:名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 13 页 -var items=DynLoadTree.Default.GetChild(aa).value;/通过
4、Ajax 调用后台代码 alert(items);做好以上四步,我们就基本实现了Ajax 页面不刷新的功能了。那么它是怎样通过 xmlhttp与服务器通讯的呢?运行后我们可以看到HTML 文件的源代码多了几行.ashx 文件的引用:实际上这些.ashx 就是在上面第 2步 AjaxPro.Utility.RegisterTypeForAjax注册 Ajax 时自动将这些引用添加到Html 文档输出的。那这些文件是什么文件呢?再看第 1 步中在 web.config中添加到 httpHandlers节中的配置,它告诉系统凡是收到 ajaxpro 路径下已经 ashx 为后缀的请求就全部交给Aja
5、xPro.AjaxHandlerFactory这个类来处理,而这些 ashx 经过处理后返回的就是一些 JavaScript文件,和普通的 js 引用没有实质区别。我们首先看看“DynLoadTree.Default,DynLoadTree.ashx”的内容:if(typeof DynLoadTree=undefined)DynLoadTree=;DynLoadTree.Default_class=function();Object.extend(DynLoadTree.Default_class.prototype,Object.extend(new AjaxPro.AjaxClass(),
6、GetChild:function(parentId)return this.invoke(GetChild,parentId:parentId,this.GetChild.getArguments().slice(1);,url:/ajaxpro/DynLoadTree.Default,DynLoadTree.ashx);DynLoadTree.Default=new DynLoadTree.Default_class();原来我们 DynLoadTree.Default是在这里定义的,而这个GetChild 方法最终是调用“this.invoke(GetChild,parentId:par
7、entId,this.GetChild.getArguments().slice(1);”的,而 invoke 方法是在“core.ashx”中定义的。在core.ashx 中定义了很多 Ajax 核心的 js 方法,例如 Object.extand实现简单的继承(或阅扩展)。在 invoke 方法里,首先是 new了一个 XmlHttp 对象,然后重点做了几件事:this.xmlHttp.open(POST,this.url,async);this.xmlHttp.setRequestHeader(Content-Type,application/x-www-form-urlencoded)
8、;名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 13 页 -this.xmlHttp.setRequestHeader(X-+AjaxPro.ID+-Method,method);this.xmlHttp.send(json);xmlHttp.open 说明了是向哪个服务器url 发送请求,是同步请求还是异步请求。接下来就设置 Content-Type 的 http header,然后再将 method设置到 http header 中,以让服务器端知道要调用什么方法,最后 send 出去,同时参数 json包含了调用这个方法所需的参数。至此,利用 xmlhttp已经将请求发送
9、给服务器了,接下来就等待服务器的反馈结果了(对于同步和异步不同的调用方式,对结果的处理是有区别的)。但是,为什么这样一个请求给服务器后,服务器就自动调用制定的method呢?如果仔细一点,你可以发现 xmlHttp.open里的 this.url到底是什么?是要调用的页面的地址么?实际不是,这个this.url的值是“/ajaxpro/DynLoadTree.Default,DynLoadTree.ashx”。第一次看到这里的时候,我很诧异,怎么这个xmlhttp请求也发给一个 ashx 文件了呢?难道 ashx文件不仅仅是用来动态生成js 文件的么?同上,在 web.config中已经配置了
10、凡是 ashx 文件都交由类 AjaxPro.AjaxHandlerFactory来处理,要想明白其中的奥秘,还得看看 AjaxHandlerFactory里到底都干了些什么。为此,我用 Reflector对 AjaxPro.2.dll文件进行反编译(我的资源里提供下载),看了AjaxHandlerFactory的代码才大彻大悟!原来,在 AjaxHandlerFactory的 GetHandler 方法里是这么写的:public IHttpHandler GetHandler(HttpContext context,string requestType,string url,string p
11、athTranslated),string str2=requestType;if(str2!=null)if(!(str2=GET)if(str2=POST)名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 13 页 -if(!(!Utility.Settings.OnlyAllowTypesInList|flag)return null;IAjaxProcessor processorArray=new IAjaxProcessor new XmlHttpRequestProcessor(context,type),new IFrameProcessor(context,typ
12、e);for(int i=0;i 0)useAsyncProcessing=customAttributes0.UseAsyncProcessing;if(customAttributes0.RequireSessionState!=HttpSessionStateRequirement.UseDefault)readWrite=customAttributes0.RequireSessionState;switch(readWrite)case HttpSessionStateRequirement.ReadWrite:if(useAsyncProcessing)return new Aja
13、xAsyncHttpHandlerSession(processorArrayi);return new AjaxSyncHttpHandlerSession(processorArrayi);名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 13 页 -case HttpSessionStateRequirement.Read:if(useAsyncProcessing)return new AjaxAsyncHttpHandlerSessionReadOnly(processorArrayi);return new AjaxSyncHttpHandlerSessionReadO
14、nly(processorArrayi);case HttpSessionStateRequirement.None:if(useAsyncProcessing)return new AjaxAsyncHttpHandler(processorArrayi);return new AjaxSyncHttpHandler(processorArrayi);if(!useAsyncProcessing)return new AjaxSyncHttpHandlerSession(processorArrayi);return new AjaxAsyncHttpHandlerSession(proce
15、ssorArrayi);名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 13 页 -else switch(fileNameWithoutExtension.ToLower()case prototype:return new EmbeddedJavaScriptHandler(prototype);case core:return new EmbeddedJavaScriptHandler(core);,default:return new TypeJavaScriptHandler(type);return null;它首先对 requestType 进行判断,如果是“GET
16、”请求,则说明是 html 里对被引用的 ashx 文件的下载请求,则调用相应的Handler 去生成对应的 JavaScript内容输出到客户端;如果是“POST”请求,则说明是通过XMLHTTP 发送过来的,是请求调用服务器端方法的,则返回相应的 Handler 利用反射机制调用请求的方法。名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 13 页 -首先看看“GET”请求,对“GET”请求的处理很简单,根据不同的文件名返回不同的 Handler,对于“core”及“prototype”则返回EmbeddedJavaScriptHandler,对于“DynLoadTree.De
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年Ajax是如何调用服务器端C#方法归 2022 Ajax 如何 调用 服务器端 C# 方法
限制150内