`
insertyou
  • 浏览: 905786 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一个基于jQuery ajax和.net httphandler 的超轻异步框架,千行代码完成。

 
阅读更多
  • 背景

  • 我部正在开发的一个新项目,选择了jQuery作为基础的Javascript函数库。同时确定了jQuery提供的ajax系列方法作为异步推拉数据的基础接口。

    使用过ajax方法的同事应该是知道的,ajax方法需要提供一组选型,比如content-typemime-typedataasync等等,这些选项的组合搭配可以构成不同的请求方式,必须理解HTTP的部分协议才能够正确的完成配置。当然,也可以从google上去找配置好的代码片段copy过来用, 关于这种方式的缺陷就不多说了。

  • 我的失误

  • 1. 没有在代码编写之前,规定好如何利用jQueryajax方法。导致开发人员直接把ajax方法的调用写在页面的脚本块内,导致页面内出现了如下所示的代码:

    $.ajax({ type: "post", contentType: "application/json",datatype: "json", async: false, url: "DemoHandler.asmx/GetData",data: "{index:1}", complete: function(e, s) { alert("ok")});

  • 分析现象

  • 上面的代码的意图是通过httppost方法,调用服务端web servicesGetData方法,传入的参数名称为index,值为1 。这是以硬编码方式与服务端达成的强耦合关系的编码方式,隐含了如下的问题:

    1. DemoHandler.asmx文件的路经改变了,就会影响页面内所有这样的代码;

    2. 服务端GetData的方法签名如果变化了,就会影响页面内所有这样的代码;

    3. 如果以后出现了更好的ajax框架,替换的工作量也是如同推倒重来的;

    4. GetData这样的方法如果被其他地方调用,采用的方法是copy一段这样的代码;

    5. 当我们提倡前后台分开的开发的情况下,理论上前台开发人员精通的技术应该是div+cssjs这些,后台开发才关注web services这样的技术。只有这样才能把各自的领域做精、最好。上面所示代码的第一个模板是我提供的,因为我个人扮演了联通前台和后台技术的桥梁角色,但反思起来他是个人行为,却不是团队力量的体现。

    6. 开发人员可以自问一下,contentType: "application/json" 这个选项起到什么作用?为什么DemoHandler.asmx/GetData这样的写法可以成功调入到web services方法内部?为什么data要写成 "{index:1}" 这样的样式?我尝试问了项目组的人,答案都是不知道。很明显,真正和开发有关的只是业务,而不是这些底层协议方面的知识,它是可以对大家屏蔽的。

  • 解决办法

  • 当把存在的问题分析清楚了,答案也就有了。我们为每一个web serivices写一个专门的js文件,它内部封装了一组与web method一致签名的函数。这样页面只通过js方法传参数调用即可,而不再关注那些ajax调用选项的细节。达到了相关概念的逻辑统一封装和管理、一点维护多点使用、不同职责的开发人员关注不同功能这些要求。

    在这件事情的执行上,又出现了一个小插曲。负责写js文件的同学参考了其它网上牛人的js书写风格,也玩起了风靡一时的js花招动态对象、闭包。当然很快就被否定了,其它原因不多讲,只有一点原因需要特别说明:任何编程技巧和技术的使用都要考虑它是否适合团队中的一般水平,如果不适合就要考虑其它办法。闭包显然只是一个技巧而已,不是解决问题的王道。它的引入至少给一般人阅读代码增加了难度,所以要被PASS掉。

    最终还是选择采用大白话式的prototype来声明服务对象的方法。一开始,我写了一个头部的初始化函数,该函数封装好了所有的选项配置信息,以及把服务对象扩展到jQuery体系中去,使开发人员可以按照一致的规格调用服务端函数。后期,其他开发人员只要在文件的尾部按需追加一个个与服务端方法对应的函数即可。

  • 优化与改进

  • 为了利用.net script servicesweb services的扩展,项目组一开始规定后台直接提供web services对客户端进行暴露。这对客户端提交数据没有问题,但对我们使用的某些控件就不太适合了。因为控件要求返回值是一个纯粹的json数据,而script services框架会在输出的json数据外层再包上一个名d的根,这就导致控件无法识别这个数据源。于是项目组通过ashx文件,实现Ihttphandler来手动处理请求。

    很快,服务端工程里多出了10几个ashx文件,因为客户端需要10几种不同的数据请求。每个ashx内部的ProcessRequest方法处理四件大事:1)设置WEB反馈的HTTP头信息;2)处理业务逻辑;3)序列化业务数据为JSON4)把JSON数据写到输出流中。

    这个现象说明了两个问题:1ashx文件的数量会随着应用需求的增多而不断的增多,今后非常难以维护;2)四件事情只有一件是必须每次都做的,即处理业务逻辑,其它事件都是有规律并重复的。

    基于对上述问题,项目组做出了改进,实现一个统一的WEB请求的调度和处理机制,使得同一类的请求可以放在一个ashx文件内完成,并且每个请求直接映射到一个函数来完成,输出、输出、缓存都由这个机制来处理;另外,普通开发人员只需要完成业务逻辑代码即可,其它一概不要关心。

    时间又过了2天,新的问题再此困扰了我。如果服务端增加一个新的方法,客户端的js也要与之匹配的增加一个函数作为调用代理。这样同一语意的函数,就产生了前后台两点维护,这是不合理的。它也是一个机械性的工作,每次都要开发手动来做,这也是不人性的。于是,新的解决方法是当客户端直接请求ashx文件的时候,服务端自动生成相应的客户端代理脚本。这样带来了客户端代码更大的改进,我们只需要将 <script src=”..\xHandler.ashx”>置入页面,一切就OK了。因为自动获得的js脚本会自动初始化客户端服务,后续就可以在页面的任何地方通过例如这样的方法调用服务了: $.net. xHandler.GetData()

    这样改进之后,项目组的开发人员是充满喜悦的,因为他们可以少做很多不必要的事情,可以把代码写的更加整洁,可以让BUG变的更少。从此,我们也把整合jQuery.ajax.net的技术方案固化了下来,以后团队将依赖存在的技术稳定的工作,而不再依赖个人。顺便说一句,在我们写出这些代码的时候,已经考虑过例如ajaxpro.net.NET MVC这样的框架,只是他并不适合我们而已。

    最后,附源码:WebHandler.zip

    分享到:
    评论
    1 楼 月下小人 2011-12-02  
    顶,这才是质的提高,果断顶

    相关推荐

      Jquery Asp.net AJAX 异步通讯

      总结,jQuery与ASP.NET的AJAX异步通信提供了灵活、高效的方式来实现前后端数据交换,无论是在传统的aspx.cs页面、WebService、HttpHandler,还是现代的MVC或Web API框架中。掌握这些技术,可以提升你的Web应用性能,...

      JQUERY+ASP.NET的AJAX文件上传(含Demo)

      标题 "JQUERY+ASP.NET的AJAX文件上传(含Demo)" 描述了一种使用jQuery库与ASP.NET框架实现的异步文件上传技术。在Web开发中,这种技术能够提供更好的用户体验,因为它允许用户在不刷新整个页面的情况下上传文件。这...

      异步Httphandler

      在.NET框架中,HTTP...总之,异步HttpHandler是.NET ASP.NET开发中的一个强大工具,它利用异步编程模型来优化性能,特别是在处理I/O密集型任务时。通过正确实现和配置,你可以显著提高Web应用程序的效率和用户体验。

      ASP.NET架构详解HttpHandler和HttpModule高清PDF文字版

      ASP.NET是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和工具,使得开发者能够高效地构建动态网站和Web服务。在这个主题中,我们将深入探讨ASP.NET架构中的两个关键组件:HttpHandler和HttpModule...

      asp.net 构架之httphandler

      利用HttpHandler创建自定义后缀Rss源 通过IhttpHandler实现图片验证码 使用HttpHandler实现图片防盗链

      ajax+.net无刷新联动

      2. **.NET Framework**:Microsoft的.NET框架提供了一个全面的开发环境,支持多种语言,如C#、VB.NET等,用于构建Web应用程序。.NET框架包含ASP.NET,它是构建动态Web应用的核心。 3. **Handler.ashx**:这是.NET中...

      asp+asp.net HttpHandler 头像截图(asp头像截图)

      综合这些信息,我们可以推断这是一个完整的ASP.NET应用程序,包含了一个用于处理头像截图请求的HttpHandler,以及相应的前端界面和样式。用户可能通过点击或输入相关信息,触发截图请求,HttpHandler则在后台处理...

      ASP.NET实现异步上传文件Demo

      在这个UploadDemo中,可能是通过创建一个隐藏的iframe,配合JavaScript或jQuery的Ajax功能来处理文件上传的异步操作。当用户选择文件并触发上传时,文件数据会被发送到服务器,而页面的其余部分则不受影响。 接下来...

      jQuery+ajaxupload+imgareaselect+asp.net上传预览截取图像

      最后,asp.net是微软提供的一个用于构建Web应用程序的框架,它包含了丰富的服务器控件和内置的Ajax支持。在上传预览和截取图像的场景下,asp.net可以接收由jQuery和ajaxupload发送的文件数据,处理图像截取请求,并...

      jquery实现ajax上传文件asp.net版

      在ASP.NET环境中,使用jQuery和Ajax来实现文件上传是一种常见的技术方案,它可以提供无刷新的用户体验,提升网站的交互性。下面将详细讲解这个过程涉及的关键知识点。 首先,我们需要了解jQuery库。jQuery是一个轻...

      Ajax.net用户指南

      Ajax.NET 是一个用于 ASP.NET 开发的库,它允许开发者创建异步的、基于JavaScript的Web应用程序,类似于Google Maps和Gmail等应用。Ajax(Asynchronous JavaScript and XML)技术的核心在于利用XMLHttpRequest对象在...

      简单AJAX与ASP.NET聊天室

      【简单AJAX与ASP.NET聊天室】是一种利用Ajax...通过学习和掌握这些技术,你将能够构建出一个功能完备、用户体验良好的【简单AJAX与ASP.NET聊天室】。在实际开发过程中,还需要不断调试、测试和优化,以满足实际需求。

      Asp.net+jQuery+HttpHandler+抽象工厂+七层架构=经典实例

      jQuery是一个轻量级的JavaScript库,简化了HTML文档遍历、事件处理、动画和Ajax交互。在Asp.net项目中,jQuery常用于前端页面的交互增强,如动态加载数据、表单验证、页面元素操作等,提高用户体验。 【HttpHandler...

      .net上ajax的实例

      在.NET环境中,我们可以使用ASP.NET AJAX库(以前称为Atlas),这是一个与.NET Framework集成的JavaScript库,提供了用于创建Ajax应用的服务器控件和客户端脚本API。 **Chapter 2: ASP.NET AJAX架构** ASP.NET AJAX...

      Asp.net Ajax 通信录

      Asp.NET AJAX通信录是一个利用XMLHttpRequest对象与HTTPHandler实现的动态、异步通信的应用示例。这个系统展示了如何在不刷新整个页面的情况下更新部分网页内容,从而提供更流畅、高效的用户交互体验。以下是关于这...

      Jquery Ajax实现简易计算器

      在本文中,我们将深入探讨如何使用Jquery Ajax技术来实现一个简易计算器。Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下与服务器交换数据并更新部分网页的技术。结合Jquery库,我们可以...

      Asp.net Ajax 分页模块

      Asp.NET是由Microsoft提供的一个用于构建Web应用程序的框架。它包含了许多功能,如控件、状态管理、身份验证和授权等,极大地简化了Web开发。在Asp.NET中,AJAX可以通过内置的UpdatePanel和ScriptManager控件来实现...

      基于ASP.NET的诗词网站.rar

      “基于ASP.NET的诗词网站”项目是一个综合运用ASP.NET技术、数据库管理和前端设计的实例。通过这个项目,开发者可以深入理解ASP.NET的Web Forms和MVC模式,以及如何与MySQL数据库配合,实现诗词查询和评论功能。同时...

      Asp.net Ajax 相册模块

      【Asp.net Ajax 相册模块】是一种利用Ajax(异步JavaScript和XML)技术与Asp.net框架结合实现的动态相册展示方案。Ajax技术的核心是XMLHttpRequest对象,它允许在不刷新整个页面的情况下,与服务器进行数据交互,...

      Asp.net Ajax 聚合搜索

      4. **UpdatePanel**:Asp.net AJAX框架中的UpdatePanel控件是一个可视化组件,它允许部分页面的更新而无需刷新整个页面。在聚合搜索中,UpdatePanel可以用来包裹搜索结果区域,使得用户每次搜索后只更新这部分内容。...

    Global site tag (gtag.js) - Google Analytics