<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_头发又乱了</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/21850/rss</id><updated>2010-05-27T00:59:31Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/21850/rss"/><entry><id>http://www.cnblogs.com/wzcheng/archive/2010/05/20/1739810.html</id><title type="text">一个基于jQuery ajax和.net httphandler 的超轻异步框架，千行代码完成。</title><summary type="text">新的解决方法是当客户端直接请求ashx文件的时候，服务端自动生成相应的客户端代理脚本。这样带来了客户端代码更大的改进，我们只需要将 《script src=”..\xHandler.ashx”》 置入页面，一切就OK了。因为自动获得的js脚本会自动初始化客户端服务，后续就可以在页面的任何地方通过例如这样的方法调用服务了: $.net. xHandler.GetData() </summary><published>2010-05-20T02:17:00Z</published><updated>2010-05-20T02:17:00Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wzcheng/archive/2010/05/20/1739810.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/archive/2010/05/20/1739810.html"/><content type="html">&lt;menu&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 24pt; font-family: 黑体;"&gt;背景&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/menu&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;我部正在开发的一个新项目，&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;选择了&lt;/span&gt;jQuery&lt;span style="font-family: 宋体;"&gt;作为基础的&lt;/span&gt;Javascript&lt;span style="font-family: 宋体;"&gt;函数库。同时确定了&lt;/span&gt;jQuery&lt;span style="font-family: 宋体;"&gt;提供的&lt;/span&gt;ajax&lt;span style="font-family: 宋体;"&gt;系列方法作为异步推拉数据的基础接口。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-family: 宋体;"&gt;使用过&lt;/span&gt;ajax&lt;span style="font-family: 宋体;"&gt;方法的同事应该是知道的，&lt;/span&gt;ajax&lt;span style="font-family: 宋体;"&gt;方法需要提供一组选型，比如&lt;/span&gt;content-type&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;mime-type&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;data&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;async&lt;span style="font-family: 宋体;"&gt;等等，这些选项的组合搭配可以构成不同的请求方式，必须理解&lt;/span&gt;HTTP&lt;span style="font-family: 宋体;"&gt;的部分协议才能够正确的完成配置。当然，也可以从&lt;/span&gt;google&lt;span style="font-family: 宋体;"&gt;上去找配置好的代码片段&lt;/span&gt;copy&lt;span style="font-family: 宋体;"&gt;过来用&lt;/span&gt;, &lt;span style="font-family: 宋体;"&gt;关于这种方式的缺陷就不多说了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;menu&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 24pt; font-family: 黑体;"&gt;我的失误&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/menu&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt;"&gt;&lt;span&gt;1.&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;没有在代码编写之前，规定好如何利用&lt;/span&gt;jQuery&lt;span style="font-family: 宋体;"&gt;的&lt;/span&gt;ajax&lt;span style="font-family: 宋体;"&gt;方法。导致开发人员直接把&lt;/span&gt;ajax&lt;span style="font-family: 宋体;"&gt;方法的调用写在页面的脚本块内，导致页面内出现了如下所示的代码：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt; line-height: normal;" align="left"&gt;&lt;span style="font-size: 9pt; font-family: 新宋体;"&gt;&amp;nbsp;$.ajax({ type: &lt;span style="color: #a31515;"&gt;"post"&lt;/span&gt;, contentType:&lt;span style="color: #a31515;"&gt; "application/json",&lt;/span&gt;datatype: &lt;span style="color: #a31515;"&gt;"json"&lt;/span&gt;, async: &lt;span style="color: blue;"&gt;false&lt;/span&gt;, url: &lt;span style="color: #a31515;"&gt;"DemoHandler.asmx/GetData"&lt;/span&gt;,data:&lt;span style="color: #a31515;"&gt; "{index:1}"&lt;/span&gt;, complete: &lt;span style="color: blue;"&gt;function&lt;/span&gt;(e, s) { alert(&lt;span style="color: #a31515;"&gt;"ok"&lt;/span&gt;)});&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39pt;"&gt;&lt;/p&gt;&#xD;
&lt;menu&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 24pt; font-family: 黑体;"&gt;分析现象&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/menu&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;上面的代码的意图是通过&lt;/span&gt;http&lt;span style="font-family: 宋体;"&gt;的&lt;/span&gt;post&lt;span style="font-family: 宋体;"&gt;方法，调用服务端&lt;/span&gt;web services&lt;span style="font-family: 宋体;"&gt;的&lt;/span&gt;GetData&lt;span style="font-family: 宋体;"&gt;方法，传入的参数名称为&lt;/span&gt;index,&lt;span style="font-family: 宋体;"&gt;值为&lt;/span&gt;1 &lt;span style="font-family: 宋体;"&gt;。这是以硬编码方式与服务端达成的强耦合关系的编码方式，隐含了如下的问题：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"&gt;&lt;span&gt;1.&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;DemoHandler.asmx&lt;span style="font-family: 宋体;"&gt;文件的路经改变了，就会影响页面内所有这样的代码；&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"&gt;&lt;span&gt;2.&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;服务端&lt;/span&gt;GetData&lt;span style="font-family: 宋体;"&gt;的方法签名如果变化了，就会影响页面内所有这样的代码；&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"&gt;&lt;span&gt;3.&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;如果以后出现了更好的&lt;/span&gt;ajax&lt;span style="font-family: 宋体;"&gt;框架，替换的工作量也是如同推倒重来的；&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"&gt;&lt;span&gt;4.&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;GetData&lt;span style="font-family: 宋体;"&gt;这样的方法如果被其他地方调用，采用的方法是&lt;/span&gt;copy&lt;span style="font-family: 宋体;"&gt;一段这样的代码；&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"&gt;&lt;span&gt;5.&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;当我们提倡前后台分开的开发的情况下，理论上前台开发人员精通的技术应该是&lt;/span&gt;div+css&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;js&lt;span style="font-family: 宋体;"&gt;这些，后台开发才关注&lt;/span&gt;web services&lt;span style="font-family: 宋体;"&gt;这样的技术。只有这样才能把各自的领域做精、最好。上面所示代码的第一个模板是我提供的，因为我个人扮演了联通前台和后台技术的桥梁角色，但反思起来他是个人行为，却不是团队力量的体现。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"&gt;&lt;span&gt;6.&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;开发人员可以自问一下，&lt;/span&gt;&lt;span style="font-size: 9pt; line-height: 150%; font-family: 新宋体;"&gt;contentType:&lt;span style="color: #a31515;"&gt; "application/json" &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;这个选项起到什么作用？为什么&lt;/span&gt;&lt;span style="font-size: 9pt; color: #a31515; line-height: 150%; font-family: 新宋体;"&gt;DemoHandler.asmx/GetData&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;这样的写法可以成功调入到&lt;/span&gt;web services&lt;span style="font-family: 宋体;"&gt;方法内部？为什么&lt;/span&gt;data&lt;span style="font-family: 宋体;"&gt;要写成&lt;/span&gt;&lt;span style="font-size: 9pt; color: #a31515; line-height: 150%; font-family: 新宋体;"&gt; "{index:1}" &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;这样的样式？我尝试问了项目组的人，答案都是不知道。很明显，真正和开发有关的只是业务，而不是这些底层协议方面的知识，它是可以对大家屏蔽的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;menu&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 24pt; font-family: 黑体;"&gt;解决办法&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/menu&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;当把存在的问题分析清楚了，答案也就有了。我们为每一个&lt;/span&gt;web serivices&lt;span style="font-family: 宋体;"&gt;写一个专门的&lt;/span&gt;js&lt;span style="font-family: 宋体;"&gt;文件，它内部封装了一组与&lt;/span&gt;web method&lt;span style="font-family: 宋体;"&gt;一致签名的函数。这样页面只通过&lt;/span&gt;js&lt;span style="font-family: 宋体;"&gt;方法传参数调用即可，而不再关注那些&lt;/span&gt;ajax&lt;span style="font-family: 宋体;"&gt;调用选项的细节。达到了相关概念的逻辑统一封装和管理、一点维护多点使用、不同职责的开发人员关注不同功能这些要求。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;在这件事情的执行上，又出现了一个小插曲。负责写&lt;/span&gt;js&lt;span style="font-family: 宋体;"&gt;文件的同学参考了其它网上牛人的&lt;/span&gt;js&lt;span style="font-family: 宋体;"&gt;书写风格，也玩起了风靡一时的&lt;/span&gt;js&lt;span style="font-family: 宋体;"&gt;花招&lt;/span&gt;&amp;#8212;&lt;span style="font-family: 宋体;"&gt;动态对象、闭包。当然很快就被否定了，其它原因不多讲，只有一点原因需要特别说明：任何编程技巧和技术的使用都要考虑它是否适合团队中的一般水平，如果不适合就要考虑其它办法。闭包显然只是一个技巧而已，不是解决问题的王道。它的引入至少给一般人阅读代码增加了难度，所以要被&lt;/span&gt;PASS&lt;span style="font-family: 宋体;"&gt;掉。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-family: 宋体;"&gt;最终还是选择采用大白话式的&lt;/span&gt;prototype&lt;span style="font-family: 宋体;"&gt;来声明服务对象的方法。一开始，我写了一个头部的初始化函数，该函数封装好了所有的选项配置信息，以及把服务对象扩展到&lt;/span&gt;jQuery&lt;span style="font-family: 宋体;"&gt;体系中去，使开发人员可以按照一致的规格调用服务端函数。后期，其他开发人员只要在文件的尾部按需追加一个个与服务端方法对应的函数即可。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;menu&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 24pt; font-family: 黑体;"&gt;优化与改进&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/menu&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-family: 宋体;"&gt;为了利用&lt;/span&gt;.net script services&lt;span style="font-family: 宋体;"&gt;对&lt;/span&gt;web services&lt;span style="font-family: 宋体;"&gt;的扩展，项目组一开始规定后台直接提供&lt;/span&gt;web services&lt;span style="font-family: 宋体;"&gt;对客户端进行暴露。这对客户端提交数据没有问题，但对我们使用的某些控件就不太适合了。因为控件要求返回值是一个纯粹的&lt;/span&gt;json&lt;span style="font-family: 宋体;"&gt;数据，而&lt;/span&gt;script services&lt;span style="font-family: 宋体;"&gt;框架会在输出的&lt;/span&gt;json&lt;span style="font-family: 宋体;"&gt;数据外层再包上一个名&lt;/span&gt;d&lt;span style="font-family: 宋体;"&gt;的根，这就导致控件无法识别这个数据源。于是项目组通过&lt;/span&gt;ashx&lt;span style="font-family: 宋体;"&gt;文件，实现&lt;/span&gt;Ihttphandler&lt;span style="font-family: 宋体;"&gt;来手动处理请求。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-family: 宋体;"&gt;很快，服务端工程里多出了&lt;/span&gt;10&lt;span style="font-family: 宋体;"&gt;几个&lt;/span&gt;ashx&lt;span style="font-family: 宋体;"&gt;文件，因为客户端需要&lt;/span&gt;10&lt;span style="font-family: 宋体;"&gt;几种不同的数据请求。每个&lt;/span&gt;ashx&lt;span style="font-family: 宋体;"&gt;内部的&lt;/span&gt;ProcessRequest&lt;span style="font-family: 宋体;"&gt;方法处理四件大事：&lt;/span&gt;1&lt;span style="font-family: 宋体;"&gt;）设置&lt;/span&gt;WEB&lt;span style="font-family: 宋体;"&gt;反馈的&lt;/span&gt;HTTP&lt;span style="font-family: 宋体;"&gt;头信息；&lt;/span&gt;2&lt;span style="font-family: 宋体;"&gt;）处理业务逻辑；&lt;/span&gt;3&lt;span style="font-family: 宋体;"&gt;）序列化业务数据为&lt;/span&gt;JSON&lt;span style="font-family: 宋体;"&gt;；&lt;/span&gt;4&lt;span style="font-family: 宋体;"&gt;）把&lt;/span&gt;JSON&lt;span style="font-family: 宋体;"&gt;数据写到输出流中。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-family: 宋体;"&gt;这个现象说明了两个问题：&lt;/span&gt;1&lt;span style="font-family: 宋体;"&gt;）&lt;/span&gt;ashx&lt;span style="font-family: 宋体;"&gt;文件的数量会随着应用需求的增多而不断的增多，今后非常难以维护；&lt;/span&gt;2&lt;span style="font-family: 宋体;"&gt;）四件事情只有一件是必须每次都做的，即处理业务逻辑，其它事件都是有规律并重复的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-family: 宋体;"&gt;基于对上述问题，项目组做出了改进，实现一个统一的&lt;/span&gt;WEB&lt;span style="font-family: 宋体;"&gt;请求的调度和处理机制，使得同一类的请求可以放在一个&lt;/span&gt;ashx&lt;span style="font-family: 宋体;"&gt;文件内完成，并且每个请求直接映射到一个函数来完成，输出、输出、缓存都由这个机制来处理；另外，普通开发人员只需要完成业务逻辑代码即可，其它一概不要关心。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;时间又过了&lt;/span&gt;2&lt;span style="font-family: 宋体;"&gt;天，新的问题再此困扰了我。如果服务端增加一个新的方法，客户端的&lt;/span&gt;js&lt;span style="font-family: 宋体;"&gt;也要与之匹配的增加一个函数作为调用代理。这样同一语意的函数，就产生了前后台两点维护，这是不合理的。它也是一个机械性的工作，每次都要开发手动来做，这也是不人性的。于是，新的解决方法是当客户端直接请求&lt;/span&gt;ashx&lt;span style="font-family: 宋体;"&gt;文件的时候，服务端自动生成相应的客户端代理脚本。这样带来了客户端代码更大的改进，我们只需要将&lt;/span&gt; &amp;lt;script src=&amp;#8221;..\xHandler.ashx&amp;#8221;&amp;gt;&lt;span style="font-family: 宋体;"&gt;置入页面，一切就&lt;/span&gt;OK&lt;span style="font-family: 宋体;"&gt;了。因为自动获得的&lt;/span&gt;js&lt;span style="font-family: 宋体;"&gt;脚本会自动初始化客户端服务，后续就可以在页面的任何地方通过例如这样的方法调用服务了&lt;/span&gt;: $.net. xHandler.GetData() &lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;span style="font-family: 宋体;"&gt;这样改进之后，项目组的开发人员是充满喜悦的，因为他们可以少做很多不必要的事情，可以把代码写的更加整洁，可以让&lt;/span&gt;BUG&lt;span style="font-family: 宋体;"&gt;变的更少。从此，我们也把整合&lt;/span&gt;jQuery.ajax&lt;span style="font-family: 宋体;"&gt;和&lt;/span&gt;.net&lt;span style="font-family: 宋体;"&gt;的技术方案固化了下来，以后团队将依赖存在的技术稳定的工作，而不再依赖个人。顺便说一句，在我们写出这些代码的时候，已经考虑过例如&lt;/span&gt;ajaxpro.net&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;.NET MVC&lt;span style="font-family: 宋体;"&gt;这样的框架，只是他并不适合我们而已。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;u&gt;&lt;span style="font-size: 13.5pt; color: #cc0033; line-height: 150%;"&gt;最后，附源码：&lt;a href="http://files.cnblogs.com/wzcheng/WebHandler.zip" target="_blank"&gt;WebHandler.zip&lt;/a&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;u&gt;&lt;span style="font-size: 13.5pt; color: #cc0033; line-height: 150%;"&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;span style="font-size: 13.5pt; color: #cc0033; line-height: 150%;"&gt;&lt;/span&gt;&lt;/u&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;&lt;u&gt;&lt;span style="font-size: 13.5pt; color: #cc0033; line-height: 150%;"&gt;有朋友问：你为什么不使用ajaxpro呢？我有一个很简单的理由，因为我有足够的实力来驾驭目前的需求。当我发现1000行代码可以搞定需求的情况下，我是不会去引入一套DLL的，何况我也要学习它。完成此文章所提模块，笔者所花费的时间也仅仅是一个下午加一个晚上而已。我坚持一个理念：不要因为需要一点色彩，就把整个染缸都搬过来。&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;5.27 日有朋友问了一个问题：如果.ashx包含了n个方法，但前端只需要一个或者其中的几个，那么现在的情况客户端都会生成包含所有方法的JS，请问如何解决这个问题？答案有三种：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. 在脚本引用块script src 属性引用.ashx时，后面可以带上参数，如 src=xHandler.ashx?find=method&amp;amp;like=get*, 同步修改 GetSvr方法，使其签名为 &amp;nbsp;public StringBuilder GetSvr(string find,sting like) 这样就可以获得客户端传来的参数，其中find表示按什么方式匹配方法，如按名称匹配，like表示匹配的模式，如所有get开头的方法，接下来修改该函数的内部逻辑，我就不细说了。&lt;/p&gt;&lt;p&gt;2.&amp;nbsp; 在我的实际项目中回避了这个问题，因为我采用的是整个项目只有一个Master页面的形式，虽然开发过程中分开了不同的页面，但实际运行中，这些页面都作为web part的方式被异步获取html后，嵌入了Master的伪windows内(div实现)。所以，作为web part的页面，实际上是不需要引用.ashx的，它直接共享了Master页面已经加载的脚本。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. .ashx是可以直接通过浏览器加载生成脚本文件的，我们可以人工下载这个文件，裁剪出需要的方法，然后手工加入到项目中，并且不再需要在script处引用.ashx了。这也是为什么每个.ashx生成脚本文件都是模板化、单层次的原因，因为这样就方便开发者自己修改这个模板，而不依赖其它。这也是本项目的潜在的最佳实践之一。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;u&gt;&lt;/u&gt;&lt;img src="http://www.cnblogs.com/wzcheng/aggbug/1739810.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wzcheng/archive/2010/05/20/1739810.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wzcheng/archive/2009/10/13/1582300.html</id><title type="text">我谈通“下水道”（系列连载6）--新的征程</title><summary type="text">深入，不是为了更加深入，是为了决定该不该及时退出。在人的问题没有得到解决的之前，我只能另谋他法了。</summary><published>2009-10-13T03:20:00Z</published><updated>2009-10-13T03:20:00Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wzcheng/archive/2009/10/13/1582300.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/archive/2009/10/13/1582300.html"/></entry><entry><id>http://www.cnblogs.com/wzcheng/archive/2009/09/28/1575568.html</id><title type="text">我谈通“下水道”（系列连载5）--决战biztalk</title><summary type="text">于是，牛B的问题消失了，变的简单了，自此，我们得出了一个千古不变的道理”简单即合理、大道却无形、牛外亦有牛”。</summary><published>2009-09-28T04:06:00Z</published><updated>2009-09-28T04:06:00Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wzcheng/archive/2009/09/28/1575568.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/archive/2009/09/28/1575568.html"/></entry><entry><id>http://www.cnblogs.com/wzcheng/archive/2009/09/24/1573012.html</id><title type="text">我谈通“下水道”（系列连载4）--与biztalk战斗的岁月</title><summary type="text">在与biztalk这头倔马一起战斗的时候，你既要把自己的思想融入到它里面，又要从中吸取它的思想，当人马合一之时，便是咱超脱之日</summary><published>2009-09-24T00:20:00Z</published><updated>2009-09-24T00:20:00Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wzcheng/archive/2009/09/24/1573012.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/archive/2009/09/24/1573012.html"/></entry><entry><id>http://www.cnblogs.com/wzcheng/archive/2009/09/23/1572370.html</id><title type="text">我谈通“下水道”（系列连载3）--上海微软之行</title><summary type="text">事实上，确实如很多小道消息上说，MS的会议室里总是放着新鲜的水果、诱人的甜点、还有各种饮料，心想如果我们公司也有这种条件该多爽呀，</summary><published>2009-09-23T03:12:00Z</published><updated>2009-09-23T03:12:00Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wzcheng/archive/2009/09/23/1572370.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/archive/2009/09/23/1572370.html"/></entry><entry><id>http://www.cnblogs.com/wzcheng/archive/2009/09/22/1571696.html</id><title type="text">我谈通“下水道”（系列连载2）</title><summary type="text">07年第一场雪的时候，我被一个突如其来的喜讯冲昏了过去，刚醒来的时候，又被一个从天而降的CASE惊的掉下了眼珠子。</summary><published>2009-09-22T03:39:00Z</published><updated>2009-09-22T03:39:00Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wzcheng/archive/2009/09/22/1571696.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/archive/2009/09/22/1571696.html"/></entry><entry><id>http://www.cnblogs.com/wzcheng/archive/2009/09/21/1571340.html</id><title type="text">我谈通“下水道”（系列连载1）</title><summary type="text">说起接口，想必很多干开发的弟兄都做过。接口它就像下水道，堵着的时候东家很不爽，咱就得去通，就得去&amp;#8220;捅&amp;#8221;。我也是，而且我在这个公司一捅三年多，没有哪天不想着、说着、捅着那些可爱的、可恨的、可歌可泣的&amp;#8220;下水道&amp;#8221;。我不是架构师，也不是研发经理，用周星星的话说，其实我是通下水道的，以成功&amp;#8220;捅&amp;#8221;通一条&amp;#8220;道&amp;#8221;而自觉...</summary><published>2009-09-21T12:26:00Z</published><updated>2009-09-21T12:26:00Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wzcheng/archive/2009/09/21/1571340.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/archive/2009/09/21/1571340.html"/></entry><entry><id>http://www.cnblogs.com/wzcheng/archive/2009/05/06/1450470.html</id><title type="text">白话手动和自动信号量的区别</title><summary type="text">写在前面，这是快餐文章，大侠们尽可一笑而过，对错自辨。 讲到信号，就不得不讲到3种涉众：1. 发信号者；2.传信号者；3.眼巴巴的等着收信号的。（看官此时嘘我了，书上可没这么讲过，你瞎叨叨啥呢？） 打个比方，超级大乐透摇奖开始了，全国无数财迷（哦，谢特！打拼音的坏处就是经常出现这种情况，把彩民打成财迷了）就是第3种人，眼巴巴的等着最后的数字，在数字没出炉前，尽管他们中有手心冒汗的，哈喇子吧嗒吧嗒流...</summary><published>2009-05-06T02:46:00Z</published><updated>2009-05-06T02:46:00Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wzcheng/archive/2009/05/06/1450470.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/archive/2009/05/06/1450470.html"/></entry><entry><id>http://www.cnblogs.com/wzcheng/archive/2007/07/31/837199.html</id><title type="text">.net framework 3.5的分部方法</title><summary type="text">....如果再碰到一个写代码不地道的，把方法堆砌起来了事，那是连肝都要吐出来的。有了分部方法，就可以把问题压到局部，不想看的地方我就可以看不见。&#xD;</summary><published>2007-07-31T02:07:00Z</published><updated>2007-07-31T02:07:00Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wzcheng/archive/2007/07/31/837199.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/archive/2007/07/31/837199.html"/></entry><entry><id>http://www.cnblogs.com/wzcheng/archive/2007/03/08/668095.html</id><title type="text">WF持久化机制剖析</title><summary type="text">&amp;#160;1 为什么要持久化状态？&amp;#160;1.1 内存是有限的，将等待或者休眠的流程暂时从内存中卸载有利于提供性能1.2 运行时可能会出现不稳定因素导致流程崩溃，持久化可以提供流程恢复的可能1.3 流程中的事务或者补偿机制需要隔离的流程状态来辅助完成2 什么时候会发生流程被持久化？2.1 在流程中加入的活动被标有PersistOnClose属性，这是人为设定的强制持久化策略， 即流程执行到该...</summary><published>2007-03-08T07:07:00Z</published><updated>2007-03-08T07:07:00Z</updated><author><name>头发又乱了</name><uri>http://www.cnblogs.com/wzcheng/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wzcheng/archive/2007/03/08/668095.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wzcheng/archive/2007/03/08/668095.html"/></entry></feed>
