<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Jack &amp; Voila Studio</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/61923/rss</id><updated>2011-09-05T15:27:35Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/61923/rss"/><entry><id>http://www.cnblogs.com/jvstudio/archive/2011/09/05/2168146.html</id><title type="text">用Asp.net写自己的服务框架</title><summary type="text">我的上篇博客【我心目中的Asp.net核心对象】 讲述了一些我认为在Asp.net中比较重要的核心对象，以及演示了直接使用它们也能实现一个简单的服务响应。今天，我将继续把我认为Asp.net的另一些重要的内容拿出来与大家一起分享， 同时将使用本次所讲述的内容改进上篇博客所演示的那个简单的服务，让它成为一个真正能用的服务框架。 在这篇博客中，不仅会继续演示上次提到的三个核心对象，我还会再引入另二个关键对象，我将用更多实战代码来演示它们如何在一起协同工作，来完成许多常见任务，展现它们的精彩故事，也最终会让它们来实现我的服务框架。因此，这篇博客不仅仅是针对Asp.net的基础技术的讲触，而是更多地以</summary><published>2011-09-05T15:28:00Z</published><updated>2011-09-05T15:28:00Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jvstudio/archive/2011/09/05/2168146.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/archive/2011/09/05/2168146.html"/><content type="html">&lt;p&gt;我的上篇博客&lt;a href="http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;【我心目中的Asp.net核心对象】&lt;/font&gt;&lt;/a&gt; 讲述了一些我认为在Asp.net中比较重要的核心对象，以及演示了直接使用它们也能实现一个简单的服务响应。今天，我将继续把我认为Asp.net的另一些重要的内容拿出来与大家一起分享， &lt;strong&gt;同时将使用本次所讲述的内容改进上篇博客所演示的那个简单的服务，让它成为一个真正能用的服务框架。&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;在这篇博客中，不仅会继续演示上次提到的三个核心对象，我还会再引入另二个关键对象，我将用更多实战代码来演示它们如何在一起协同工作，来完成许多常见任务，展现它们的精彩故事，也最终会让它们来实现我的服务框架。因此，这篇博客不仅仅是针对Asp.net的基础技术的讲触，而是更多地以实战形式展示这些核心对象所能发挥的强大功能，以一个不到700行的轻量级服务框架来显示它们的核心价值，才是这篇博客的目标。 &lt;/p&gt;&#xD;
&lt;p&gt;首先我要谈的话题是Asp.net的请求处理【管线】，我认为这是Asp.net中最重要的内容了，所有到达Asp.net的请求都要经过管线来处理，不管是WebForms, MVC, WebService, WCF(Asp.net的承载方式)，还是其它微软的采用HTTP协议的框架。为什么这些框架都选择要Asp.net做为它们的运行平台呢？&lt;br /&gt;我们可以考虑一下：如果让您从无到有设计一个服务框架，有哪些事件是必须要处理的？&lt;br /&gt;我想有三个最根本的事件要做：1. 监听请求端口，2. 为每个传入的连接请求分配线程来执行具体的响应操作， 3. 要把请求的数据读出来，并负责将处理后的响应数据发送给调用者。&lt;br /&gt;这其实是个比较复杂也很枯燥的过程，但每个服务器端程序都需要这些基本功能。幸好IIS和Asp.net可以为我们做好这些事情，所以那些框架选择Asp.net平台就可以省去这些复杂的任务。使用Asp.net平台不仅可以简化设计，它还有着良好的扩展性以满足更多的框架在这个平台上面继续开发，而这个良好扩展性是离不开它的请求处理管线的。 &lt;/p&gt;&#xD;
&lt;p&gt;Asp.net是一个功能完善的平台框架，它既提供一些高层次的框架供我们使用，比如:WebForms, MVC, WebService，也提供一些低层次的机制让我们使用，以便于让我们开发有特殊要求的新框架，新解决方案。这个低层次的机制就是请求处理管线，使用这个管线的有二类对象：HttpHandler, HttpModule，控制这条管线工作的对象是：HttpApplication 。通常情况下，我们并不需要直接使用HttpApplication对象，因此本文的主题将主要介绍HttpHandler, HttpModule这二类对象的功能以及如何使用它们。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;理解Asp.net管线&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;管线(Pipeline)这个词也是很有点意思，这个词也形象地说明了每个Asp.net请求的处理过程：请求是在一个管道中，要经过一系列的过程点，这些过程点连接起来也就形成一条线。 &lt;em&gt;以上是我对于这个词的理解，如果有误，恳请给予指正。&lt;/em&gt; 这些一系列的过程点，其实就是由HttpApplication引发的一系列事件，通常可以由HttpModule来订阅，也可以在Global.asax中订阅，这一系列的事件也就构成了一次请求的生命周期。 &lt;/p&gt;&#xD;
&lt;p&gt;事件模式，也就是观察者模式。根据【C# 3.0 设计模式】一书中的定义：&amp;#8220; 观察者模式定义了对象之间的一种联系，使得当一个对象改变状态时，所有其它的对象都可以相应地被通知到。" Asp.net的管线设计正是采用了这种方式，在这个设计模式中，观察者就是许多HttpModule对象，被观察的对象就是每个&amp;#8221;请求&amp;#8220;，它的状态是由HttpApplication 控制，用于描述当前请求的处理阶段，HttpApplication会根据一个特定的顺序修改这个状态，并在每个状态改变后引发相应的事件。 Asp.net会为每个请求分配一个HttpApplication对象来引发这些事件，因此可以让一大批观察者了解每个请求的状态，每个观察者也可以在感兴趣的时候修改请求的一些数据。这些与请求相关的数据的也就是我&lt;a href="http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;上篇博客&lt;/font&gt;&lt;/a&gt;中提到的HttpRequest, HttpResponse。正是由于引入了事件机制，Asp.net框架也有了极强的扩展能力。再来看看管线处理请求的过程，我将直接引用MSDN中的原文【IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述】中的片段。 &lt;/p&gt;&#xD;
&lt;p &gt;在处理该请求时将由 HttpApplication 类执行以下事件。 希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件。&lt;br /&gt;1. 对请求进行验证，将检查浏览器发送的信息，并确定其是否包含潜在恶意标记。 有关更多信息，请参见 ValidateRequest 和脚本侵入概述。&lt;br /&gt;2. 如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL，则执行 URL 映射。&lt;br /&gt;3. 引发 BeginRequest 事件。&lt;br /&gt;4. 引发 AuthenticateRequest 事件。&lt;br /&gt;5. 引发 PostAuthenticateRequest 事件。&lt;br /&gt;6. 引发 AuthorizeRequest 事件。&lt;br /&gt;7. 引发 PostAuthorizeRequest 事件。&lt;br /&gt;8. 引发 ResolveRequestCache 事件。&lt;br /&gt;9. 引发 PostResolveRequestCache 事件。&lt;br /&gt;10. 根据所请求资源的文件扩展名（在应用程序的配置文件中映射），选择实现 IHttpHandler 的类，对请求进行处理。 如果该请求针对从 Page 类派生的对象（页），并且需要对该页进行编译，则 ASP.NET 会在创建该页的实例之前对其进行编译。&lt;br /&gt;11. 引发 PostMapRequestHandler 事件。&lt;br /&gt;12. 引发 AcquireRequestState 事件。&lt;br /&gt;13. 引发 PostAcquireRequestState 事件。&lt;br /&gt;14. 引发 PreRequestHandlerExecute 事件。&lt;br /&gt;15. 为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法（或异步版 IHttpAsyncHandler.BeginProcessRequest）。 例如，如果该请求针对某页，则当前的页实例将处理该请求。 &lt;br /&gt;16. 引发 PostRequestHandlerExecute 事件。&lt;br /&gt;17. 引发 ReleaseRequestState 事件。&lt;br /&gt;18. 引发 PostReleaseRequestState 事件。&lt;br /&gt;19. 如果定义了 Filter 属性，则执行响应筛选。&lt;br /&gt;20. 引发 UpdateRequestCache 事件。&lt;br /&gt;21. 引发 PostUpdateRequestCache 事件。&lt;br /&gt;22. 引发 EndRequest 事件。&lt;br /&gt;23. 引发 PreSendRequestHeaders 事件。&lt;br /&gt;24. 引发 PreSendRequestContent 事件。 &lt;/p&gt;&#xD;
&lt;p&gt;如果是IIS7，第10个事件也就是MapRequestHandler事件，而且在EndRequest 事件前，还增加了另二个事件：LogRequest 和 PostLogRequest 事件。&lt;br /&gt;只有当应用程序在 IIS 7.0 集成模式下运行，并且与 .NET Framework 3.0 或更高版本一起运行时，才会支持 MapRequestHandler、LogRequest 和 PostLogRequest 事件。 &lt;/p&gt;&#xD;
&lt;p&gt;这里要补充一下：从BeginRequest开始的事件，并不是每个事件都会被触发，因为在整个处理过程中，随时可以调用Response.End() 或者有未处理的异常发生而提前结束整个过程。在那些"知名"的事件中，也只有EndRequest事件是肯定会触发的， (部分Module的)BeginRequest有可能也不会被触发。 &lt;/p&gt;&#xD;
&lt;p&gt;对于这些管线事件，&lt;strong &gt;我只想提醒2个非常重要的地方：&lt;/strong&gt;&lt;br /&gt;1. 每个请求都将会映射到一个HttpHandler，通常也是处理请求的主要对象。&lt;br /&gt;2. HttpModule可以任意订阅这些事件，在事件处理器中也可以参与修改请求的操作。&lt;br /&gt;这2点也决定了HttpHandler和HttpModule的工作方式。 &lt;/p&gt;&#xD;
&lt;p&gt;我找了二张【老图片】，希望能更直观的说明Asp.net管线的处理过程。结合我前面讲述的内容，再品味一下老图片吧。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/281816/2011090522232631.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/281816/2011090522235510.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;HttpHandler&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;HttpHandler通常是处理请求的核心对象。绝大多数的的请求都在【第10步】被映射到一个HttpHandler，然后在【第15步】中执行处理过程，因此也常把这类对象称为处理器或者处理程序。我们熟知的Page就是一个处理器，一个ashx文件也是一个处理器，不过ashx显示得更原始，我们还是来看一下ashx通常是个什么样子： &lt;/p&gt;&lt;pre &gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: #a31515"&gt;WebHandler &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#" &lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="Login" &lt;/span&gt;&lt;span style="background: #ffee62"&gt;%&amp;gt;&#xD;
&#xD;
&lt;/span&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System&lt;span style="color: red"&gt;.&lt;/span&gt;Web;&#xD;
&#xD;
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Login &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpHandler &lt;/span&gt;{&#xD;
        &#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;ProcessRequest (&lt;span style="color: #2b91af"&gt;HttpContext &lt;/span&gt;context) {&#xD;
        context&lt;span style="color: red"&gt;.&lt;/span&gt;Response&lt;span style="color: red"&gt;.&lt;/span&gt;ContentType &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #a31515"&gt;"text/plain"&lt;/span&gt;;&#xD;
&#xD;
        &lt;span style="color: blue"&gt;string &lt;/span&gt;username &lt;span style="color: red"&gt;= &lt;/span&gt;context&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;Form[&lt;span style="color: #a31515"&gt;"name"&lt;/span&gt;];&#xD;
        &lt;span style="color: blue"&gt;string &lt;/span&gt;password &lt;span style="color: red"&gt;= &lt;/span&gt;context&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;Form[&lt;span style="color: #a31515"&gt;"password"&lt;/span&gt;];&#xD;
&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( password &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: #a31515"&gt;"aaaa" &lt;/span&gt;) {&#xD;
            System&lt;span style="color: red"&gt;.&lt;/span&gt;Web&lt;span style="color: red"&gt;.&lt;/span&gt;Security&lt;span style="color: red"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;FormsAuthentication&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;SetAuthCookie(username, &lt;span style="color: blue"&gt;false&lt;/span&gt;);&#xD;
            context&lt;span style="color: red"&gt;.&lt;/span&gt;Response&lt;span style="color: red"&gt;.&lt;/span&gt;Write(&lt;span style="color: #a31515"&gt;"OK"&lt;/span&gt;);&#xD;
        }&#xD;
        &lt;span style="color: blue"&gt;else &lt;/span&gt;{&#xD;
            context&lt;span style="color: red"&gt;.&lt;/span&gt;Response&lt;span style="color: red"&gt;.&lt;/span&gt;Write(&lt;span style="color: #a31515"&gt;"用户名或密码不正确。"&lt;/span&gt;);&#xD;
        }&#xD;
    }&#xD;
 &#xD;
    &lt;span style="color: blue"&gt;public bool &lt;/span&gt;IsReusable {&#xD;
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{&#xD;
            &lt;span style="color: blue"&gt;return false&lt;/span&gt;;&#xD;
        }&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;可以看到它仅仅是实现一个IHttpHandler接口而已，IHttpHandler接口也很简单： &lt;/p&gt;&lt;pre &gt;&lt;span style="color: green"&gt;// 定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。&#xD;
&lt;/span&gt;&lt;span style="color: blue"&gt;public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IHttpHandler&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: green"&gt;// 获取一个值，该值指示其他请求是否可以使用 System.Web.IHttpHandler 实例。&#xD;
    //&#xD;
    // 返回结果:&#xD;
    //     如果 System.Web.IHttpHandler 实例可再次使用，则为 true；否则为 false。&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;bool &lt;/span&gt;IsReusable { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }&#xD;
&#xD;
    &lt;span style="color: green"&gt;// 通过实现 System.Web.IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;void &lt;/span&gt;ProcessRequest(HttpContext context);&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;IsReusable属性上面有注释，我就不说了。接口中最重要的部分就是方法 &lt;strong&gt;void ProcessRequest(HttpContext context);&lt;/strong&gt; 这个方法简单地不能再简单，只有一个参数，但这个参数的能量可不小，&lt;strong&gt;有了它几乎就有了一切&lt;/strong&gt;，这就是我对它的评价。关于HttpContext的更多详细介绍请参考我的博客&lt;a href="http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;【我心目中的Asp.net核心对象】&lt;/font&gt;&lt;/a&gt;。 &lt;/p&gt;&#xD;
&lt;p&gt;在Login.ashx中，我做了三简单的事：&lt;br /&gt;1. 读取输入数据： 从Request.Form中。&lt;br /&gt;2. 执行特定的业务逻辑： 一个简单的判断。&lt;br /&gt;3. 返回结果给客户端： 调用Response.Write()&lt;br /&gt;是的，就是这三个简单的操作，但也是绝大多数ashx文件的常规写法，它的确可以完成一次请求的处理过程。&lt;br /&gt;&lt;strong&gt;记住：&lt;/strong&gt;事实上任何HttpHandler都是这样处理请求的，只是有时会借助一些框架的包装而变了味道而已。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;本人认为：&lt;/strong&gt;HttpHandler的强大离不开HttpContext，HttpHandler的重要性是因为管线会将每个请求都映射到一个HttpHandler。 &lt;/p&gt;&#xD;
&lt;p&gt;通常，我们需要新的HttpHandler，创建一个ashx文件就可以了。但也可以创建自己的HttpHandler，或者要将一类【特殊的路径/扩展名】交给某个处理器来处理，那么就需要我们在web.config中注册那个处理器。&lt;br /&gt;&lt;strong&gt;注意：&lt;/strong&gt;如果是【特殊的扩展名】可能还需要在IIS中注册，原因很简单：IIS不将请求交给Asp.net，我们的代码根本没机会运行！ &lt;/p&gt;&#xD;
&lt;p&gt;我们可以采用以下方式在web.config中注册一个自定义的处理器：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;path&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;/MyService.axd&lt;/span&gt;" &lt;span style="color: red"&gt;verb&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*&lt;/span&gt;" &lt;span style="color: red"&gt;validate&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;false&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MySimpleServiceFramework.MyServiceHandler&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;或者：（为了排版，我将一些代码做了换行处理）&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;remove &lt;/span&gt;&lt;span style="color: red"&gt;verb&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*&lt;/span&gt;" &lt;span style="color: red"&gt;path&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*.cs&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;verb&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*&lt;/span&gt;" &lt;span style="color: red"&gt;path&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*.cs&lt;/span&gt;" &lt;span style="color: red"&gt;validate&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;false&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;FishWebLib.Ajax.AjaxMethodV2Handler, &#xD;
			FishWebLib, Version=3.0.0.0, Culture=neutral, PublicKeyToken=04db02423b9ebbb2&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;remove &lt;/span&gt;&lt;span style="color: red"&gt;verb&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*&lt;/span&gt;" &lt;span style="color: red"&gt;path&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*.ascx&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;verb&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*&lt;/span&gt;" &lt;span style="color: red"&gt;path&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*.ascx&lt;/span&gt;" &lt;span style="color: red"&gt;validate&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;false&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;FishWebLib.Ajax.UserControlHandler, &#xD;
			FishWebLib, Version=3.0.0.0, Culture=neutral, PublicKeyToken=04db02423b9ebbb2&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;HttpModule&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;前面我已经提到过HttpModule的工作方式：订阅管线事件，并在事件处理器中执行所需的相关操作。&lt;br /&gt;这个描述看起来很平淡，但是，它的工作方式给了它&lt;strong&gt;无限强大的处理能力。&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;它的无限强大的处理能力来源于可以订阅管线事件，因此，它有能力可以在许多阶段修改请求，这些修改最终可能会影响请求的处理。&lt;br /&gt;前面我说过：&amp;#8220;HttpHandler是处理请求的主要对象&amp;#8221;，但HttpModule却可以随意指定将某个请求交给某个处理器来执行！&lt;br /&gt;甚至，HttpModule也可以直接处理请求，完全不给HttpHandler工作的机会！ &lt;/p&gt;&#xD;
&lt;p&gt;我们来看一下HttpModule的实现方式：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
/// &lt;/span&gt;&lt;span style="color: green"&gt;能支持双向GZIP压缩的Module，它会根据客户端是否启用GZIP来自动处理。&#xD;
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &lt;/span&gt;&lt;span style="color: green"&gt;对于服务来说，不用关心GZIP处理，服务只要处理输入输出就可以了。&#xD;
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
&lt;/span&gt;&lt;span style="color: blue"&gt;internal class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DuplexGzipModule &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpModule&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Init(&lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app)&#xD;
    {&#xD;
        app&lt;span style="color: red"&gt;.&lt;/span&gt;BeginRequest &lt;span style="color: red"&gt;+= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(app_BeginRequest);&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;void &lt;/span&gt;app_BeginRequest(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt;)sender;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 注意：这里不能使用"Accept-Encoding"这个头，二者的意义完全不同。&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;( app&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;Headers[&lt;span style="color: #a31515"&gt;"Content-Encoding"&lt;/span&gt;] &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: #a31515"&gt;"gzip" &lt;/span&gt;) {&#xD;
            app&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;Filter &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GZipStream&lt;/span&gt;(app&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;Filter, &lt;span style="color: #2b91af"&gt;CompressionMode&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Decompress);&#xD;
&#xD;
            app&lt;span style="color: red"&gt;.&lt;/span&gt;Response&lt;span style="color: red"&gt;.&lt;/span&gt;Filter &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GZipStream&lt;/span&gt;(app&lt;span style="color: red"&gt;.&lt;/span&gt;Response&lt;span style="color: red"&gt;.&lt;/span&gt;Filter, &lt;span style="color: #2b91af"&gt;CompressionMode&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Compress);&#xD;
            app&lt;span style="color: red"&gt;.&lt;/span&gt;Response&lt;span style="color: red"&gt;.&lt;/span&gt;AppendHeader(&lt;span style="color: #a31515"&gt;"Content-Encoding"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"gzip"&lt;/span&gt;);&#xD;
        }&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Dispose()&#xD;
    {&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;每个HttpModule只需要实现IHttpModule接口就可以了。IHttpModule也是个简单的接口： &lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IHttpModule&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;void &lt;/span&gt;Dispose();&#xD;
&#xD;
    &lt;span style="color: blue"&gt;void &lt;/span&gt;Init(HttpApplication app);&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;在这二个方法中，第一个方法通常可以保持为空。最重要的方法就是Init，它给了HttpModule能订阅管线事件的机会，然后在相应的事件处理中，我们就可以执行它的具体操作了。 &lt;/p&gt;&#xD;
&lt;p&gt;还记得我在博客&lt;a href="http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;【我心目中的Asp.net核心对象】&lt;/font&gt;&lt;/a&gt; 最后给出一个示例吗？在QueryOrderService.ashx中，为了支持gzip，需要直接调用GZipStream类，对于一二个ashx来说，或许不是问题，如果这样的处理器变多了，每个处理器都那样写，您能受得了吗？反正我是受不了的，因此今天我把它改成使用Module来实现，代码简单了许多。&lt;em&gt;在本文末尾可以下载。&lt;/em&gt; &lt;/p&gt;&#xD;
&lt;p&gt;对于Asp.net项目来说：当您发现有很多处理输入输出的操作非常类似时，那正是HttpModule可以发挥的舞台，请把这些重复的操作交给它吧。 &lt;/p&gt;&#xD;
&lt;p&gt;让HttpModule工作也需要在web.config中注册：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;DuplexGzipModule&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MySimpleServiceFramework.DuplexGzipModule&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;通常，我会把一些HttpModule放在类库中实现，然后在需要使用的项目的web.config中注册。&lt;br /&gt;这也体现它的高重用性：写一次，许多项目就可以直接使用。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;HttpModule的加载方式：&lt;/strong&gt;前面我说过&amp;#8220;Asp.net会为每个请求分配一个HttpApplication对象&amp;#8221;，在每个HttpApplication对象的初始化操作中，它会加载所有在web.config中注册的HttpModule。由于Asp.net并不是只创建一个HttpApplication对象，而是多个HttpApplication对象，因此每个HttpModule的Init事件是有可能被多次调用的。许多人喜欢在这里做各类初始化的操作，那么请注意在这里修改静态变量成员时的线程安全问题。特别地，如果要执行&lt;strong&gt;程序初始化&lt;/strong&gt;的操作，那么还是把代码放在Global.asax的Application_Start中去处理吧， HttpModule的Init事件并不合适。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;为HttpModule选择订阅合适的管线事件：&lt;/strong&gt;这是非常重要的，订阅不同的事件，产生的结果也会不一样。原因也很简单，在Asp.net运行环境中，并不只有一个HttpModule，某个HttpModule的判断可能要依据其它HttpModule的输出结果，而且在某些（晚期的）管线事件中，也不能再修改输出数据。在后面的示例中，DirectProcessRequestMoudle订阅了PostAuthorizeRequest事件，如果订阅BeginRequest事件或许将得到更好的性能，但是，在BeginRequest事件中，身份认证模块还没有工作，因此每个请求在这个事件阶段都属于&amp;#8220;未登录&amp;#8221;状态。 &lt;/p&gt;&#xD;
&lt;p&gt;前面说了一大堆的HttpModule，事实上，在这个示例中，主角是另一个对象：Filter 。上篇博客我就提过它，最后为了演示它，把它放在一个HttpHandler里【糟蹋了】，没办法，上篇的主题不是管线呀。今天只好和HttpModule一起出场了。我认为Filter还是应该和HttpModule一起使用才能发挥它的独特价值。Filter的特点还真不合适在HttpHandler中使用，如果您在HttpHandler里使用Filter，我认为有必要考虑一下是不是用错了。 &lt;/p&gt;&#xD;
&lt;p&gt;借HttpModule的地盘我们来谈谈Filter。Filter很低调，低调到什么程度：可能很少有人关注过它，因此也少有人用过它。事实也确实如此，一般情况下可以不用它，但用到它，你会发现它非常强大。前面我经常说到【输入输出流】，请求的数据，除了请求头以外，基本上全放在流中，如果您希望对这些数据以流的方式进行处理，特别是希望对于所有请求，或者某类请求，那么使用Filter是非常恰当的。前面的示例就是一个非常合理地使用，好好地品味它，或许您还能发现Filter能做更多的事情。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;选 HttpHandler 还是 HttpModule ？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;HttpHandler是每个请求的主要处理对象，而HttpModule可以选择请求交给哪个HttpHandler来处理，甚至，它还可以选择它自己来处理请求。&lt;br /&gt;下面我给个示例代码来说明HttpModule也能直接请求： &lt;/p&gt;&lt;pre &gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
/// &lt;/span&gt;&lt;span style="color: green"&gt;此Module示范了直接使用Module也能处理客户端的请求。&#xD;
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &lt;/span&gt;&lt;span style="color: green"&gt;建议：除非要很好的理由，否则不建议使用这种方法。&#xD;
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
&lt;/span&gt;&lt;span style="color: blue"&gt;internal class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DirectProcessRequestMoudle &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpModule&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Init(&lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app)&#xD;
    {&#xD;
        app&lt;span style="color: red"&gt;.&lt;/span&gt;PostAuthorizeRequest &lt;span style="color: red"&gt;+= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(app_PostAuthorizeRequest);&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;void &lt;/span&gt;app_PostAuthorizeRequest(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt;)sender;&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;ServiceInfo &lt;/span&gt;info &lt;span style="color: red"&gt;= &lt;/span&gt;GetServiceInfo(app&lt;span style="color: red"&gt;.&lt;/span&gt;Context);&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( info &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;return&lt;/span&gt;;&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;ServiceExecutor&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;ProcessRequest(app&lt;span style="color: red"&gt;.&lt;/span&gt;Context, info);&#xD;
        app&lt;span style="color: red"&gt;.&lt;/span&gt;Response&lt;span style="color: red"&gt;.&lt;/span&gt;End();&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;为了更好的回答本节的这个问题，我再给段等效的代码，不过，请求是经过HttpHandler来处理 &lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;internal class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MyServiceHandler &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpHandler&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;internal &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ServiceInfo &lt;/span&gt;ServiceInfo { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;ProcessRequest(&lt;span style="color: #2b91af"&gt;HttpContext &lt;/span&gt;context)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;ServiceInfo &lt;/span&gt;info &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceInfo &lt;span style="color: red"&gt;?? &lt;/span&gt;GetServiceInfo(context);&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;ServiceExecutor&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;ProcessRequest(context, info);&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;HttpHandler和HttpModule都能处理请求，我该选哪个？？&lt;/p&gt;&#xD;
&lt;p&gt;对于此类情况，我的答案是：视情况而定，正如我在注释中描述的那样，&lt;strong&gt;除非要很好的理由，否则不建议使用HttpModule处理请求。&lt;/strong&gt; 用HttpModule在某些时候可能会快点，关键点在于处理完成时要调用&lt;strong&gt;Response.End();&lt;/strong&gt;这会让后面的事件全都&lt;strong&gt;短路&lt;/strong&gt;，其它的HttpModule就没有机会执行。如果您的框架或者项目设计很依赖于管线中的事件处理，那么调用Response.End();无疑会破坏这个规则，也将会导致不能得到正确的结果。选择HttpHandler就不会有这种事情发生。 &lt;/p&gt;&#xD;
&lt;p&gt;不过，也没有绝对的事情：在请求处理期间，您可以在任何地方调用Response.End(); 结果也是一样的。 &lt;/p&gt;&#xD;
&lt;p&gt;幸好，短路的情况并不经常发生，因此选择HttpHandler会让整个Asp.net的管线都能发挥作用，因此，我建议优先选择HttpHandler。&lt;br /&gt;尤其是在HttpHandler能很好的完成工作的前提下，就应该选HttpHandler，因为选HttpModule会给其它请求带来不必要的性能损失，具体细节请继续阅读。 &lt;/p&gt;&#xD;
&lt;p&gt;其实，我们还可以从另一个角度来看这个问题。&lt;br /&gt;首先，请仔细地阅读前面的示例代码，您是否发现它们在实现方式上非常类似？&lt;br /&gt;现在应该找到答案了吧：把具体的处理操作分离到HttpHandler，HttpModule之外的地方。那么，此时这个问题也就不是问题了，您也可以提供多种方案供使用者选择。比如：我就为【我的服务框架】提供了5种方式让使用者可以轻松地将一个C#方法公开为一个服务方法，该如何选择这个问题，由使用者来决定，这个问题不会让我为难。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;本人观点：&lt;/strong&gt;在没有太多技术难度的前提下，提供多种解决办法应该是对的，您将会避开很多麻烦事情。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;看不见的性能问题&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;前面我介绍了HttpModule的重要优点：高重用性。只要写好一个HttpModule可以放在任何Asp.net项目中使用，非常方便。 &lt;/p&gt;&#xD;
&lt;p&gt;不过，再好的东西也不能滥用。HttpModule也可以对性能产生负面影响。原因也很简单：对于每个Asp.net请求，每个HttpModule都会在它们所订阅的事件中，去执行一些操作逻辑。这些操作逻辑或许对一些请求是无意义的，但仍会执行。因此，计算机将会白白浪费一些资源去执行一些无意义的代码。 &lt;/p&gt;&#xD;
&lt;p&gt;知道了原因，解决办法也就很清楚了：&lt;br /&gt;1. 去掉不需要的HttpModule&lt;br /&gt;2. 在每个HttpModule的事件处理器中，&lt;strong&gt;首先要确定是不是自己所需要处理的请求。对一些不相关的请求，应该立即退出。&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;在我们创建一个Asp.net项目时，如果不做任何修改，微软已经为我们加载了好多HttpModule 。请看以下代码： &lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;protected void &lt;/span&gt;Page_Load(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&#xD;
{&#xD;
    &lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Current&lt;span style="color: red"&gt;.&lt;/span&gt;ApplicationInstance;        &#xD;
    &lt;span style="color: #2b91af"&gt;StringBuilder &lt;/span&gt;sb &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt;();&#xD;
&#xD;
    &lt;span style="color: blue"&gt;foreach&lt;/span&gt;( &lt;span style="color: blue"&gt;string &lt;/span&gt;module &lt;span style="color: blue"&gt;in &lt;/span&gt;app&lt;span style="color: red"&gt;.&lt;/span&gt;Modules&lt;span style="color: red"&gt;.&lt;/span&gt;AllKeys ) &#xD;
        sb&lt;span style="color: red"&gt;.&lt;/span&gt;AppendFormat(module)&lt;span style="color: red"&gt;.&lt;/span&gt;Append(&lt;span style="color: #a31515"&gt;"&amp;lt;br /&amp;gt;"&lt;/span&gt;);&#xD;
&#xD;
    Response&lt;span style="color: red"&gt;.&lt;/span&gt;Write(sb&lt;span style="color: red"&gt;.&lt;/span&gt;ToString());&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;输出结果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/281816/2011090522241685.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;总共有14个。&lt;br /&gt;哎，大多数是我肯定不会用到的，但它们却被加载了，因此，在它们所订阅的事件中，它们的代码将会检查所有的请求，那些无意义的代码将有机会执行。如果您不想视而不见，那么请在web.config中做类似的修改，将不需要的Module移除。 &lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;remove &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Session&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;remove &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;RoleManager&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;HttpModule的第2个需要注意的地方是：HttpModule对所有的请求有效，如果HttpModule不能处理所有的请求，那么请先判断当前请求是否需要处理，对于不需要处理的请求，应该立即退出。请看以下示例代码： &lt;/p&gt;&lt;pre &gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
/// &lt;/span&gt;&lt;span style="color: green"&gt;【演示用】让Aspx页的请求支持gzip压缩输出&#xD;
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
&lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FishGzipModule &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpModule&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Init(&lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app)&#xD;
    {&#xD;
        app&lt;span style="color: red"&gt;.&lt;/span&gt;BeginRequest &lt;span style="color: red"&gt;+= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(app_BeginRequest);&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;void &lt;/span&gt;app_BeginRequest(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt;)sender;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 这里做个简单的演示，只处理aspx页面的输出压缩。&#xD;
        // 当然了，IIS也提供压缩功能，这里也仅当演示用，或许可适用于一些特殊场合。&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;( app&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;AppRelativeCurrentExecutionFilePath&lt;span style="color: red"&gt;.&lt;/span&gt;EndsWith(&#xD;
                            &lt;span style="color: #a31515"&gt;"aspx"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;StringComparison&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;OrdinalIgnoreCase) &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;false &lt;/span&gt;)&#xD;
            &lt;span style="color: green"&gt;// 注意：先判断是不是要处理的请求，如果不是，直接退出。&#xD;
            //        而不是：先执行了后面的判断，再发现不是aspx时才退出。&#xD;
            &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt;;&#xD;
&#xD;
&#xD;
        &lt;span style="color: blue"&gt;string &lt;/span&gt;flag &lt;span style="color: red"&gt;= &lt;/span&gt;app&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;Headers[&lt;span style="color: #a31515"&gt;"Accept-Encoding"&lt;/span&gt;];&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;IsNullOrEmpty(flag) &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;false &lt;/span&gt;&lt;span style="color: red"&gt;&amp;amp;&amp;amp; &lt;/span&gt;flag&lt;span style="color: red"&gt;.&lt;/span&gt;ToLower()&lt;span style="color: red"&gt;.&lt;/span&gt;IndexOf(&lt;span style="color: #a31515"&gt;"gzip"&lt;/span&gt;) &lt;span style="color: red"&gt;&amp;gt;= &lt;/span&gt;&lt;span style="color: purple"&gt;0 &lt;/span&gt;) {&#xD;
            app&lt;span style="color: red"&gt;.&lt;/span&gt;Response&lt;span style="color: red"&gt;.&lt;/span&gt;Filter &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GZipStream&lt;/span&gt;(app&lt;span style="color: red"&gt;.&lt;/span&gt;Response&lt;span style="color: red"&gt;.&lt;/span&gt;Filter, &lt;span style="color: #2b91af"&gt;CompressionMode&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Compress);&#xD;
            app&lt;span style="color: red"&gt;.&lt;/span&gt;Response&lt;span style="color: red"&gt;.&lt;/span&gt;AppendHeader(&lt;span style="color: #a31515"&gt;"Content-Encoding"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"gzip"&lt;/span&gt;);&#xD;
        }&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;更多实战介绍&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文从这里起，将不再过多的叙述一些理论文字，而是将以实战的形式展示Asp.net的强大管线功能，这些实战展示了一些很经典的应用场景，其中大部分示例代码将做为【我的服务框架】的关键部分。因此请注意理解这些代码。 &lt;/p&gt;&#xD;
&lt;p&gt;实战代码大量使用了上篇博客&lt;a href="http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;【我心目中的Asp.net核心对象】&lt;/font&gt;&lt;/a&gt;所介绍的绝大多数对象，也算是再次展示那些核心对象的重要性，因此请务必先了解那些核心对象。 &lt;/p&gt;&#xD;
&lt;p&gt;上篇博客仅展示了那些强大对象的功能，单独使用它们，也是不现实的，今天，我将演示它们与HttpHandler, HttpModule一起并肩工作所能完成的各种任务。 &lt;/p&gt;&#xD;
&lt;p&gt;故事未讲完，传奇在继续。更多精彩即将上演！&lt;/p&gt;&#xD;
&lt;p style="height: 53px"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;实战演示 - 模拟更多的HttpMethod&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;近几年又有一种被称为RESTful Web服务的概念进入开发人员的视野，它提倡使用HTTP协议提供的GET、POST、PUT和DELETE方法来操作网络资源。不过，目前的浏览器只支持GET、POST这二种方法，因此就有人想到采用HTTP头，表单值，或者查询字符串的形式来模拟这些浏览器不支持的HTTP方法。每种支持RESTful Web服务的框架都有它们自己的实现方式，今天我将使用HttpModule也来模拟这个操作。最终的结果是可以直接访问HttpRequest.HttpMethod获取这些操作的方法名字。 &lt;/p&gt;&#xD;
&lt;p&gt;实现原理：订阅管线中的BeginRequest事件，检查当前请求是否需要修改HttpMethod，如果是，则修改HttpMethod属性。&lt;br /&gt;所以选择BeginRequest这个事件，是因为这个事件比较早，可以让请求的后续阶段都能读到新的结果。 &lt;/p&gt;&lt;pre &gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
/// &lt;/span&gt;&lt;span style="color: green"&gt;【演示用】实现了模拟更多 HttpMethod 的Module&#xD;
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
&lt;/span&gt;&lt;span style="color: blue"&gt;internal class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XHttpMethodModule &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpModule&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FieldInfo &lt;/span&gt;_field;&#xD;
&#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Init(&lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;context)&#xD;
    {&#xD;
        &lt;span style="color: green"&gt;// 订阅这个较早的事件，可以让请求的后续阶段都能读到新的结果。&#xD;
        &lt;/span&gt;context&lt;span style="color: red"&gt;.&lt;/span&gt;BeginRequest &lt;span style="color: red"&gt;+= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(context_BeginRequest);&#xD;
        _field &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HttpRequest&lt;/span&gt;)&lt;span style="color: red"&gt;.&lt;/span&gt;GetField(&lt;span style="color: #a31515"&gt;"_httpMethod"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Instance &lt;span style="color: red"&gt;| &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;NonPublic);&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;void &lt;/span&gt;context_BeginRequest(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt;)sender;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 这里仅检查是否为POST操作，如果您的应用中需要使用GET来模拟的，请修改这里。&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;( &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Equals(app&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;HttpMethod, &lt;span style="color: #a31515"&gt;"POST"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;StringComparison&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;OrdinalIgnoreCase) ) {&#xD;
&#xD;
            &lt;span style="color: green"&gt;// 这里为了简单，我只检查请求头，如果还需要检查表单值或者查询字符串，请修改这里。&#xD;
            &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;headerOverrideValue &lt;span style="color: red"&gt;= &lt;/span&gt;app&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;Headers[&lt;span style="color: #a31515"&gt;"X-HTTP-Method-Override"&lt;/span&gt;];&#xD;
&#xD;
            &lt;span style="color: blue"&gt;if&lt;/span&gt;( &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;IsNullOrEmpty(headerOverrideValue) &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;false &lt;/span&gt;) {&#xD;
                &lt;span style="color: blue"&gt;if&lt;/span&gt;( &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Equals(headerOverrideValue, &lt;span style="color: #a31515"&gt;"GET"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;StringComparison&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;OrdinalIgnoreCase) &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;false &lt;/span&gt;&lt;span style="color: red"&gt;&amp;amp;&amp;amp;&#xD;
                    &lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Equals(headerOverrideValue, &lt;span style="color: #a31515"&gt;"POST"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;StringComparison&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;OrdinalIgnoreCase) &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;false &lt;/span&gt;) {&#xD;
&#xD;
                    &lt;span style="color: green"&gt;// HttpRequest.HttpMethod属性其实就是访问_httpMethod这个私有字段，我将直接修改它。&#xD;
                    // 这样修改后，最原始的HTTP方法就丢失，通常这或许也是可以接受的。&#xD;
                    &lt;/span&gt;_field&lt;span style="color: red"&gt;.&lt;/span&gt;SetValue(app&lt;span style="color: red"&gt;.&lt;/span&gt;Request, headerOverrideValue&lt;span style="color: red"&gt;.&lt;/span&gt;ToUpper());&#xD;
                }&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;我认为采用HttpModule来处理这个问题是个不错的选择。它至少有2个好处：&lt;br /&gt;1. 这个HttpModule能继续给其它的网站项目使用，因此提高了代码的重用性。&lt;br /&gt;2. 我可以随时决定要不要支持模拟，不需要模拟时，从web.config中不加载它就可以了，因此切换很灵活，&lt;strong&gt;且不需要修改现有代码。&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;来看一下页面及调用结果吧&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;protected void &lt;/span&gt;Page_Load(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&#xD;
{&#xD;
    Response&lt;span style="color: red"&gt;.&lt;/span&gt;Write(Request&lt;span style="color: red"&gt;.&lt;/span&gt;HttpMethod);&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/281816/2011090522243323.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;调用结果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/281816/2011090522244846.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;实战演示 - URL重写&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用HttpModule来实现URL重写。这个功能应该是HttpModule非常经典的应用了。 &lt;/p&gt;&#xD;
&lt;p&gt;通常情况下，这种应用常用的方式是将一个URL： /product/12 重写为 /product.aspx?id=12 ，此时product.aspx应该是一个已经已存在的页面。显然重写后的地址更友好。URL重写的目的就是能让URL更友好。 &lt;/p&gt;&#xD;
&lt;p&gt;实现原理：订阅管线的PostAuthorizeRequest事件，检查URL是不是期望修改的模式，如果是，则调用Context.RewritePath()完成URL的重写操作。在管线的后续处理中，最终会使用新的URL来映射到一个合适的HttpHandler。说明：选择的事件只要在【第10个事件】之前就可以了，因为在第10个事件前重写URL，才能保证到将请求映射到合适的处理器来执行。就这么简单，请参考以下代码： &lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MyServiceUrlRewriteModule &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpModule&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: green"&gt;// 为了演示简单，直接写死地址。&#xD;
    // 注意：MyService.axd 必须在web.config中注册，以保证它能成功映射。&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;public static string &lt;/span&gt;RewriteUrlPattern &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #a31515"&gt;"/MyService.axd?sc={1}&amp;amp;op={1}"&lt;/span&gt;;&#xD;
&#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Init(&lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app)&#xD;
    {&#xD;
        app&lt;span style="color: red"&gt;.&lt;/span&gt;PostAuthorizeRequest &lt;span style="color: red"&gt;+= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(app_PostAuthorizeRequest);&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;void &lt;/span&gt;app_PostAuthorizeRequest(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt;)sender;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 这里将检查URL是否为需要重写的模式，比如:&#xD;
        //   http://localhost:11647/service/OrderService/QueryOrder&#xD;
        &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NamesPair &lt;/span&gt;pair &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FrameworkRules&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;ParseNamesPair(app&lt;span style="color: red"&gt;.&lt;/span&gt;Request);&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( pair &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;return&lt;/span&gt;;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 开始重写URL，最后将会映射到MyServiceHandler&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;int &lt;/span&gt;p &lt;span style="color: red"&gt;= &lt;/span&gt;app&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;Path&lt;span style="color: red"&gt;.&lt;/span&gt;IndexOf(&lt;span style="color: #a31515"&gt;'?'&lt;/span&gt;);&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( p &lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: purple"&gt;0 &lt;/span&gt;)&#xD;
            app&lt;span style="color: red"&gt;.&lt;/span&gt;Context&lt;span style="color: red"&gt;.&lt;/span&gt;RewritePath(&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Format(RewriteUrlPattern, pair&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceName, pair&lt;span style="color: red"&gt;.&lt;/span&gt;MethodName)&#xD;
                &lt;span style="color: red"&gt;+ &lt;/span&gt;&lt;span style="color: #a31515"&gt;"&amp;amp;" &lt;/span&gt;&lt;span style="color: red"&gt;+ &lt;/span&gt;app&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;Path&lt;span style="color: red"&gt;.&lt;/span&gt;Substring(p &lt;span style="color: red"&gt;+ &lt;/span&gt;&lt;span style="color: purple"&gt;1&lt;/span&gt;)&#xD;
                );&#xD;
        &lt;span style="color: blue"&gt;else&#xD;
            &lt;/span&gt;app&lt;span style="color: red"&gt;.&lt;/span&gt;Context&lt;span style="color: red"&gt;.&lt;/span&gt;RewritePath(&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Format(RewriteUrlPattern, pair&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceName, pair&lt;span style="color: red"&gt;.&lt;/span&gt;MethodName));&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;重写发生了什么？&lt;br /&gt;对于一个传入请求：http://localhost:11647/service/FormDemoService/ShowUrlInfo &lt;br /&gt;它将被重写为：http://localhost:11647/MyService.axd?sc=FormDemoService&amp;amp;op=ShowUrlInfo &lt;br /&gt;由于在web.config中，对MyService.axd已做过注册，因此Asp.net会将请求转交给注册的处理器来处理它。 &lt;/p&gt;&#xD;
&lt;p&gt;注意：URL重写，会影响某些变量的值。请参考以下代码，我将写个服务方法来检测这个现象： &lt;/p&gt;&lt;pre &gt;[&lt;span style="color: #2b91af"&gt;MyServiceMethod&lt;/span&gt;]&#xD;
&lt;span style="color: blue"&gt;public string &lt;/span&gt;ShowUrlInfo(&lt;span style="color: blue"&gt;int &lt;/span&gt;a)&#xD;
{&#xD;
    System&lt;span style="color: red"&gt;.&lt;/span&gt;Web&lt;span style="color: red"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpRequest &lt;/span&gt;request &lt;span style="color: red"&gt;= &lt;/span&gt;System&lt;span style="color: red"&gt;.&lt;/span&gt;Web&lt;span style="color: red"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Current&lt;span style="color: red"&gt;.&lt;/span&gt;Request;&#xD;
&#xD;
    System&lt;span style="color: red"&gt;.&lt;/span&gt;Text&lt;span style="color: red"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;StringBuilder &lt;/span&gt;sb &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;System&lt;span style="color: red"&gt;.&lt;/span&gt;Text&lt;span style="color: red"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt;();&#xD;
    sb&lt;span style="color: red"&gt;.&lt;/span&gt;AppendFormat(&lt;span style="color: #a31515"&gt;"Path: {0}\r\n"&lt;/span&gt;, request&lt;span style="color: red"&gt;.&lt;/span&gt;Path);            &#xD;
    sb&lt;span style="color: red"&gt;.&lt;/span&gt;AppendFormat(&lt;span style="color: #a31515"&gt;"RawUrl: {0}\r\n"&lt;/span&gt;, request&lt;span style="color: red"&gt;.&lt;/span&gt;RawUrl);&#xD;
    sb&lt;span style="color: red"&gt;.&lt;/span&gt;AppendFormat(&lt;span style="color: #a31515"&gt;"Url.PathAndQuery: {0}\r\n"&lt;/span&gt;, request&lt;span style="color: red"&gt;.&lt;/span&gt;Url&lt;span style="color: red"&gt;.&lt;/span&gt;PathAndQuery);&#xD;
&#xD;
    &lt;span style="color: blue"&gt;return &lt;/span&gt;sb&lt;span style="color: red"&gt;.&lt;/span&gt;ToString();&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;输出结果：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/281816/2011090522250585.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;实战演示 - URL路由&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用HttpModule来实现URL路由。这个功能随着Asp.net MVC框架的出现也逐渐流行起来了。&lt;/p&gt;&#xD;
&lt;p&gt;URL路由的目标也是为了使用URL更友好，与URL重写类似。&lt;/p&gt;&#xD;
&lt;p&gt;实现原理：订阅管线的PostResolveRequestCache事件，检查URL是不是期望的路由模式，如果是，则要根据请求中所包含的信息找到一个合适的处理器，并临时保存这个处理器，重写URL到一个Asp.net能映射处理器的地址。在管线的PostMapRequestHandler中，检查前面有没有临时保存的处理器，如果有，则重新给Context.Handler赋值，并重写URL到原始地址。在管线的后续处理中，最终会使用Context.Handler的HttpHandler。就这么简单，请参考以下代码： &lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MyServiceUrlRoutingModule &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpModule&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;private static readonly object &lt;/span&gt;s_dataKey &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new object&lt;/span&gt;();&#xD;
&#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Init(&lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app)&#xD;
    {&#xD;
        app&lt;span style="color: red"&gt;.&lt;/span&gt;PostResolveRequestCache &lt;span style="color: red"&gt;+= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(app_PostResolveRequestCache);&#xD;
        app&lt;span style="color: red"&gt;.&lt;/span&gt;PostMapRequestHandler &lt;span style="color: red"&gt;+= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(app_PostMapRequestHandler);&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;private void &lt;/span&gt;app_PostResolveRequestCache(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt;)sender;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 获取合适的处理器，注意这是与URL重写的根本差别。&#xD;
        // 即：根据当前请求【主动】寻找一个处理器，而不是使用RewritePath让Asp.net替我们去找。&#xD;
        &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MyServiceHandler &lt;/span&gt;handler &lt;span style="color: red"&gt;= &lt;/span&gt;GetHandler(app&lt;span style="color: red"&gt;.&lt;/span&gt;Context);&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( handler &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;return&lt;/span&gt;;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 临时保存前面获取到的处理器，这个值将在PostMapRequestHandler事件中再取出来。&#xD;
        &lt;/span&gt;app&lt;span style="color: red"&gt;.&lt;/span&gt;Context&lt;span style="color: red"&gt;.&lt;/span&gt;Items[s_dataKey] &lt;span style="color: red"&gt;= &lt;/span&gt;handler;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 进入正常的MapRequestHandler事件，随便映射到一个处理器就行了。&#xD;
        &lt;/span&gt;app&lt;span style="color: red"&gt;.&lt;/span&gt;Context&lt;span style="color: red"&gt;.&lt;/span&gt;RewritePath(&lt;span style="color: #a31515"&gt;"~/MyServiceUrlRoutingModule.axd"&lt;/span&gt;);&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;private void &lt;/span&gt;app_PostMapRequestHandler(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt;)sender;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 取出在PostResolveRequestCache事件中获得的处理器&#xD;
        &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MyServiceHandler &lt;/span&gt;handler &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MyServiceHandler&lt;/span&gt;)app&lt;span style="color: red"&gt;.&lt;/span&gt;Context&lt;span style="color: red"&gt;.&lt;/span&gt;Items[s_dataKey];&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( handler &lt;span style="color: red"&gt;!= &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;) {&#xD;
            &lt;span style="color: green"&gt;// 还原URL请求地址。注意这里和URL重写的差别。&#xD;
            &lt;/span&gt;app&lt;span style="color: red"&gt;.&lt;/span&gt;Context&lt;span style="color: red"&gt;.&lt;/span&gt;RewritePath(app&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;RawUrl);&#xD;
&#xD;
            &lt;span style="color: green"&gt;// 还原根据GetHandler(app.Context)调用得到的处理器。&#xD;
            // 因为此时app.Context.Handler是由"~/MyServiceUrlRoutingModule.axd"映射得到的。&#xD;
            &lt;/span&gt;app&lt;span style="color: red"&gt;.&lt;/span&gt;Context&lt;span style="color: red"&gt;.&lt;/span&gt;Handler &lt;span style="color: red"&gt;= &lt;/span&gt;handler;&#xD;
        }&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;注意：在MyServiceUrlRoutingModule中，我将请求【路由】到一个MyServiceHandler的实例，而不是让Asp.net根据URL来替我选择。&lt;/p&gt;&#xD;
&lt;p&gt;在URL重写的演示中，有些URL相关的属性发生了改变，我们再来看一下URL路由是个什么结果：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/281816/2011090522252141.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;实现自己的服务框架&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本篇博客在开头说过：将在本次博客中改进上次的服务实现，让它成为一个真正能用的服务框架。&lt;br /&gt;前面在讲述Asp.net管线时，给出了很多示例代码，这些示例代码都可以在博客的结尾处下载到。这些代码来源于【我的服务框架】中的部分源代码，下面我将重点介绍【我的服务框架】。 &lt;/p&gt;&#xD;
&lt;p style="height: 53px"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;利用【我的服务框架】将类公开成服务&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在【我的服务框架】中，一个类要想公开为服务类，并不需要继承某个类或者实现什么接口，只需要在类上加一个特性就好了，方法也只需加一个特性，示例代码如下： &lt;/p&gt;&lt;pre &gt;[&lt;span style="color: #2b91af"&gt;MyService&lt;/span&gt;]&#xD;
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;OrderService&#xD;
&lt;/span&gt;{&#xD;
    [&lt;span style="color: #2b91af"&gt;MyServiceMethod&lt;/span&gt;]&#xD;
    &lt;span style="color: blue"&gt;public static string &lt;/span&gt;Hello(&lt;span style="color: blue"&gt;string &lt;/span&gt;name)&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"Hello " &lt;/span&gt;&lt;span style="color: red"&gt;+ &lt;/span&gt;name;&#xD;
    }&#xD;
&#xD;
    [&lt;span style="color: #2b91af"&gt;MyServiceMethod&lt;/span&gt;]&#xD;
    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;span style="color: red"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;QueryOrder(&lt;span style="color: #2b91af"&gt;QueryOrderCondition &lt;/span&gt;query)&#xD;
    {&#xD;
        &lt;span style="color: green"&gt;// 模拟查询过程，这里就直接返回一个列表。        &#xD;
        &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;span style="color: red"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;list &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;span style="color: red"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&lt;span style="color: red"&gt;&amp;gt;&lt;/span&gt;();&#xD;
        &lt;span style="color: blue"&gt;for&lt;/span&gt;( &lt;span style="color: blue"&gt;int &lt;/span&gt;i &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: purple"&gt;0&lt;/span&gt;; i &lt;span style="color: red"&gt;&amp;lt; &lt;/span&gt;&lt;span style="color: purple"&gt;10&lt;/span&gt;; i&lt;span style="color: red"&gt;++ &lt;/span&gt;)&#xD;
            list&lt;span style="color: red"&gt;.&lt;/span&gt;Add(&lt;span style="color: #2b91af"&gt;DataFactory&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;CreateRandomOrder());&#xD;
&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;list;&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;HiddenMethod(&lt;span style="color: blue"&gt;string &lt;/span&gt;aa)&#xD;
    {&#xD;
        &lt;span style="color: green"&gt;// 这个方法应该是不能以服务方式被调用到的。&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NotImplementedException&lt;/span&gt;();&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;如果某个方法需要只公开给登录用户或者指定的用户，还可以使用以下方式：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: green"&gt;// 这是一个访问受限的服务类，只允许某些用户调用。&#xD;
&lt;/span&gt;[&lt;span style="color: #2b91af"&gt;Authorize&lt;/span&gt;]&#xD;
[&lt;span style="color: #2b91af"&gt;MyService&lt;/span&gt;]&#xD;
&lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;LimitService&#xD;
&lt;/span&gt;{&#xD;
    [&lt;span style="color: #2b91af"&gt;Authorize&lt;/span&gt;(Users&lt;span style="color: red"&gt;=&lt;/span&gt;&lt;span style="color: #a31515"&gt;"fish-li, cc"&lt;/span&gt;)]&#xD;
    [&lt;span style="color: #2b91af"&gt;MyServiceMethod&lt;/span&gt;]&#xD;
    &lt;span style="color: blue"&gt;public static string &lt;/span&gt;CalcPassword(&lt;span style="color: blue"&gt;string &lt;/span&gt;pwd)&#xD;
    {&#xD;
        &lt;span style="color: green"&gt;// 这个方法只能由 fish-li, cc 二个用户来调用&#xD;
&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;( pwd &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            pwd &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Empty;&#xD;
&#xD;
        &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] buffer &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MD5CryptoServiceProvider&lt;/span&gt;())&lt;span style="color: red"&gt;.&lt;/span&gt;ComputeHash(&lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Default&lt;span style="color: red"&gt;.&lt;/span&gt;GetBytes(pwd));&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BitConverter&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;ToString(buffer)&lt;span style="color: red"&gt;.&lt;/span&gt;Replace(&lt;span style="color: #a31515"&gt;"-"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;);&#xD;
    }&#xD;
&#xD;
    [&lt;span style="color: #2b91af"&gt;MyServiceMethod&lt;/span&gt;]&#xD;
    &lt;span style="color: blue"&gt;public static string &lt;/span&gt;CalcBase64(&lt;span style="color: blue"&gt;string &lt;/span&gt;str)&#xD;
    {&#xD;
        &lt;span style="color: green"&gt;// 这个方法只能由已登录用户调用。&#xD;
&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;( &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;IsNullOrEmpty(str) )&#xD;
            &lt;span style="color: blue"&gt;return string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Empty;&#xD;
&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;ToBase64String(&lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;UTF8&lt;span style="color: red"&gt;.&lt;/span&gt;GetBytes(str));&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;就这么简单，一个类，就可以成为一个服务。&lt;br /&gt;&lt;strong&gt;说明：本框架并不要求将服务类在网站项目中实现，完全可以放在类库中实现。&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;还可以支持Session哦。&lt;/p&gt;&lt;pre &gt;[&lt;span style="color: #2b91af"&gt;MyService&lt;/span&gt;(SessionMode&lt;span style="color: red"&gt;=&lt;/span&gt;&lt;span style="color: #2b91af"&gt;SessionMode&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Support)]&#xD;
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SessionDemoService &#xD;
&lt;/span&gt;{&#xD;
    [&lt;span style="color: #2b91af"&gt;MyServiceMethod&lt;/span&gt;]&#xD;
    &lt;span style="color: blue"&gt;public int &lt;/span&gt;Add(&lt;span style="color: blue"&gt;int &lt;/span&gt;a)&#xD;
    {&#xD;
        &lt;span style="color: green"&gt;// 一个累加的方法，检验是否可以访问Session&#xD;
&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;( System&lt;span style="color: red"&gt;.&lt;/span&gt;Web&lt;span style="color: red"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Current&lt;span style="color: red"&gt;.&lt;/span&gt;Session &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"Session没有开启。"&lt;/span&gt;);&#xD;
&#xD;
        &lt;span style="color: blue"&gt;object &lt;/span&gt;obj &lt;span style="color: red"&gt;= &lt;/span&gt;System&lt;span style="color: red"&gt;.&lt;/span&gt;Web&lt;span style="color: red"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Current&lt;span style="color: red"&gt;.&lt;/span&gt;Session[&lt;span style="color: #a31515"&gt;"counter"&lt;/span&gt;];&#xD;
        &lt;span style="color: blue"&gt;int &lt;/span&gt;counter &lt;span style="color: red"&gt;= &lt;/span&gt;(obj &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;&lt;span style="color: red"&gt;? &lt;/span&gt;&lt;span style="color: purple"&gt;0 &lt;/span&gt;: (&lt;span style="color: blue"&gt;int&lt;/span&gt;)obj);&#xD;
        counter &lt;span style="color: red"&gt;+= &lt;/span&gt;a;&#xD;
        System&lt;span style="color: red"&gt;.&lt;/span&gt;Web&lt;span style="color: red"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Current&lt;span style="color: red"&gt;.&lt;/span&gt;Session[&lt;span style="color: #a31515"&gt;"counter"&lt;/span&gt;] &lt;span style="color: red"&gt;= &lt;/span&gt;counter;&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;counter;&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;SessionMode的定义如下：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public enum &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SessionMode&#xD;
&lt;/span&gt;{&#xD;
    NotSupport,&#xD;
    Support,&#xD;
    ReadOnly&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;【我的服务框架】支持的序列化的种类&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在上篇博客中，我演示了使用JSON序列化的做法来实现一个服务响应。本来也是打算让框架仅支持JSON序列化的，因为传输的数据量小嘛。没想到，做到后来，还是认为有必要把XML序列化也加进来，XML序列化快呀。最后，居然想到既然是服务框架，Ajax调用也能算是服务吧，总不能不支持吧，后来干脆也能支持部分的Ajax调用了。 &lt;/p&gt;&#xD;
&lt;p&gt;在【我的服务框架】中，服务端判断客户端发送的数据序列化方式是通过判断请求头"Serializer-Format"来实现的。序列化的种类还允许继续自定义。只要实现以下接口： &lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ISerializerProvider&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;object &lt;/span&gt;Deserialize(&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;destType, &lt;span style="color: #2b91af"&gt;HttpRequest &lt;/span&gt;request);&#xD;
&#xD;
    &lt;span style="color: blue"&gt;void &lt;/span&gt;Serializer(&lt;span style="color: blue"&gt;object &lt;/span&gt;obj, &lt;span style="color: #2b91af"&gt;HttpResponse &lt;/span&gt;response);&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;然后调用以下方法就可以了：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SerializerProviderFactory&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;public static void &lt;/span&gt;RegisterSerializerProvider(&lt;span style="color: blue"&gt;string &lt;/span&gt;name, &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;type)&#xD;
    {&#xD;
        &lt;span style="color: green"&gt;// ...................................&#xD;
    &lt;/span&gt;}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;判断客户端的序列化方式，由属性FrameworkRules.GetSerializerFormat来决定： &lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FrameworkRules&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;private static string &lt;/span&gt;Internal_GetSerializerFormat(&lt;span style="color: #2b91af"&gt;HttpRequest &lt;/span&gt;request){&#xD;
        &lt;span style="color: blue"&gt;string &lt;/span&gt;flag &lt;span style="color: red"&gt;= &lt;/span&gt;request&lt;span style="color: red"&gt;.&lt;/span&gt;Headers[&lt;span style="color: #a31515"&gt;"Serializer-Format"&lt;/span&gt;];&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;IsNullOrEmpty(flag) &lt;span style="color: red"&gt;? &lt;/span&gt;&lt;span style="color: #a31515"&gt;"form" &lt;/span&gt;: flag);&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: red"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpRequest&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;_serializerFormatRule &lt;span style="color: red"&gt;= &lt;/span&gt;Internal_GetSerializerFormat;&#xD;
&#xD;
    &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// &lt;/span&gt;&lt;span style="color: green"&gt;此委托用来判断客户端发起的请求中，数据是以什么方式序列化的。&#xD;
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &lt;/span&gt;&lt;span style="color: green"&gt;返回的结果将会交给SerializerProviderFactory.GetSerializerProvider()来获取序列化提供者&#xD;
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &lt;/span&gt;&lt;span style="color: green"&gt;默认的实现是检查请求头："Serializer-Format"&#xD;
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: red"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpRequest&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;GetSerializerFormat&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;internal get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_serializerFormatRule; }&#xD;
        &lt;span style="color: blue"&gt;set&#xD;
        &lt;/span&gt;{&#xD;
            &lt;span style="color: blue"&gt;if&lt;/span&gt;( &lt;span style="color: blue"&gt;value &lt;/span&gt;&lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"value"&lt;/span&gt;);&#xD;
            _serializerFormatRule &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;value&lt;/span&gt;;&#xD;
        }&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;只是一个委托，可以自己重新实现。&lt;/p&gt;&#xD;
&lt;p&gt;目前本框架提供了三个实现了接口ISerializerProvider的类供用户使用：JsonSerializerProvider, XmlSerializerProvider, FormSerializerProvider &lt;/p&gt;&#xD;
&lt;p&gt;这里只展示JsonSerializerProvider的实现：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;internal class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;JsonSerializerProvider &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ISerializerProvider&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;private static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodInfo &lt;/span&gt;s_JSSDeserializeMI&#xD;
                                &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;JavaScriptSerializer&lt;/span&gt;)&lt;span style="color: red"&gt;.&lt;/span&gt;GetMethod(&lt;span style="color: #a31515"&gt;"Deserialize"&lt;/span&gt;);&#xD;
&#xD;
    &lt;span style="color: #2b91af"&gt;JavaScriptSerializer &lt;/span&gt;jss &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;JavaScriptSerializer&lt;/span&gt;();&#xD;
&#xD;
    &lt;span style="color: blue"&gt;public object &lt;/span&gt;Deserialize(&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;destType, &lt;span style="color: #2b91af"&gt;HttpRequest &lt;/span&gt;request)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;StreamReader &lt;/span&gt;sr &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StreamReader&lt;/span&gt;(request&lt;span style="color: red"&gt;.&lt;/span&gt;InputStream, request&lt;span style="color: red"&gt;.&lt;/span&gt;ContentEncoding);&#xD;
        &lt;span style="color: blue"&gt;string &lt;/span&gt;input &lt;span style="color: red"&gt;= &lt;/span&gt;sr&lt;span style="color: red"&gt;.&lt;/span&gt;ReadToEnd();&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;MethodInfo &lt;/span&gt;deserialize &lt;span style="color: red"&gt;= &lt;/span&gt;s_JSSDeserializeMI&lt;span style="color: red"&gt;.&lt;/span&gt;MakeGenericMethod(destType);&#xD;
&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;deserialize&lt;span style="color: red"&gt;.&lt;/span&gt;Invoke(jss, &lt;span style="color: blue"&gt;new object&lt;/span&gt;[] { input });&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Serializer(&lt;span style="color: blue"&gt;object &lt;/span&gt;obj, &lt;span style="color: #2b91af"&gt;HttpResponse &lt;/span&gt;response)&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( obj &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;return&lt;/span&gt;;&#xD;
&#xD;
        response&lt;span style="color: red"&gt;.&lt;/span&gt;ContentType &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #a31515"&gt;"application/json"&lt;/span&gt;;&#xD;
&#xD;
        response&lt;span style="color: red"&gt;.&lt;/span&gt;Write(jss&lt;span style="color: red"&gt;.&lt;/span&gt;Serialize(obj));&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;FormSerializerProvider的实现不够完善，因为再搞下去，就和【我的WEB框架】就重复了。有兴趣的自己去完善吧。 &lt;/p&gt;&#xD;
&lt;p&gt;这里再给自己的作品打个广告：&lt;br /&gt;&lt;a href="http://www.cnblogs.com/fish-li/archive/2011/05/02/2034354.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;【Asp.net MVC 框架，我也来山寨一下】&lt;/font&gt;&lt;/a&gt;， &lt;a href="http://www.cnblogs.com/fish-li/archive/2011/03/12/1982434.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;【晒晒我的Ajax服务端框架】&lt;/font&gt;&lt;/a&gt;， &lt;a href="http://www.cnblogs.com/fish-li/archive/2011/03/12/1982453.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;【我的Ajax服务端框架 - (1) JS直接调用C#方法】&lt;/font&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;【我的服务框架】对gzip的支持&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于gzip的支持，我只想说：太简单了。&lt;br /&gt;前面不是已给出DuplexGzipModule的实现代码嘛。是的，就是把它注册到web.config中就可以了。&lt;br /&gt;你说简不简单？ 完全不用写多余的代码，要不要gzip支持，也只是个配置问题！ &lt;/p&gt;&#xD;
&lt;p&gt;说到这里，我想起前段时间Artech写的一篇博客&lt;a href="http://www.cnblogs.com/artech/archive/2011/08/07/2129799.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;通过WCF扩展实现消息压缩&lt;/font&gt;&lt;/a&gt;，正如我在前篇博客的回复中说到的：&amp;#8220;本来真没兴趣看的，不过，为了验证我的猜想，还是去看了一下，果然也没让我失望。&amp;#8221;。 &lt;/p&gt;&#xD;
&lt;p&gt;在此，有必要公开一下我的想法：绝对没有半点看不起Artech的意思，只是我对WCF没有兴趣了。理由也简单：不够简单。 &lt;/p&gt;&#xD;
&lt;p&gt;还是接着说，Artech的博客展示了在WCF中压缩消息的方式，当然我相信Artech对于WCF的理解，他的方案或许应该是最简单的解决方案，但是和【我的服务框架】对gzip的支持的易用性根本没法比。 &lt;/p&gt;&#xD;
&lt;p&gt;WCF的粉丝们，当您看到这里，请先别忙着喷我。听我说完：WCF的确很强大，我的这个不到700行的框架那也是根本不能和它相比的。 &lt;/p&gt;&#xD;
&lt;p&gt;做这个比较仅仅是为了展示Asp.net是一个强大的平台，Asp.net有更高水准的扩展性。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;利用【我的服务框架】发布服务的5种方式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;【我的服务框架】可以提供5种不同的方式，让您将一个类及方法公开成一个服务，供外界调用。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法1：使用DirectProcessRequestMoudle，&lt;/strong&gt;只需要配置web.config即可。&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;DirectProcessRequestMoudle&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MySimpleServiceFramework.DirectProcessRequestMoudle&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;客户端调用URL：http://localhost:11647/service/OrderService/QueryOrder&lt;/p&gt;&#xD;
&lt;p&gt;说明：URL模式是可以自由定义的，只要给FrameworkRules.ParseNamesPair赋值即可，它的定义如下：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: red"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpRequest&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;NamesPair&lt;/span&gt;&lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;ParseNamesPair&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;默认的实现方式：&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;internal static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UrlPatternHelper&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: green"&gt;// 为了演示简单，我只定义一个URL模式。【因为我认为对于服务来说，一个就够了】&#xD;
    // 如果希望适用性更广，可以从配置文件中读取，并且可支持多组URL模式。&#xD;
    // URL中加了"/service/"只是为了能更好地区分其它请求，如果您的网站没有子目录，删除它也是可以的。&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;private static readonly string &lt;/span&gt;UrlPattern &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #a31515"&gt;@"/service/(?&amp;lt;name&amp;gt;[^/]+)/(?&amp;lt;method&amp;gt;[^/]+)[/\?]?"&lt;/span&gt;;&#xD;
&#xD;
    &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NamesPair &lt;/span&gt;ParseNamesPair(&lt;span style="color: #2b91af"&gt;HttpRequest &lt;/span&gt;request)&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( request &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"request"&lt;/span&gt;);&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;MatchCollection &lt;/span&gt;matchs &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Regex&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Matches(request&lt;span style="color: red"&gt;.&lt;/span&gt;Path, UrlPattern);&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( matchs&lt;span style="color: red"&gt;.&lt;/span&gt;Count &lt;span style="color: red"&gt;!= &lt;/span&gt;&lt;span style="color: purple"&gt;1 &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;return null&lt;/span&gt;;&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;Match &lt;/span&gt;m &lt;span style="color: red"&gt;= &lt;/span&gt;matchs[&lt;span style="color: purple"&gt;0&lt;/span&gt;];&#xD;
        &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NamesPair &lt;/span&gt;{&#xD;
            ServiceName &lt;span style="color: red"&gt;=  &lt;/span&gt;m&lt;span style="color: red"&gt;.&lt;/span&gt;Result(&lt;span style="color: #a31515"&gt;"${name}"&lt;/span&gt;),&#xD;
            MethodName &lt;span style="color: red"&gt;= &lt;/span&gt;m&lt;span style="color: red"&gt;.&lt;/span&gt;Result(&lt;span style="color: #a31515"&gt;"${method}"&lt;/span&gt;)&#xD;
        };&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;客户端调用URL： http://localhost:11647/service/OrderService/QueryOrder&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法2：使用MyServiceUrlRoutingModule，&lt;/strong&gt;只需要配置web.config即可。&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MyServiceUrlRoutingModule&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MySimpleServiceFramework.MyServiceUrlRoutingModule&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;客户端调用URL： http://localhost:11647/service/OrderService/QueryOrder&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;说明：只有这种方式才能支持Session&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法3：使用MyServiceUrlRewriteModule，&lt;/strong&gt;只需要配置web.config即可。&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;path&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;/MyService.axd&lt;/span&gt;" &lt;span style="color: red"&gt;verb&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*&lt;/span&gt;" &lt;span style="color: red"&gt;validate&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;false&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MySimpleServiceFramework.MyServiceHandler&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MyServiceUrlRewriteModule&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MySimpleServiceFramework.MyServiceUrlRewriteModule&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpModules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;客户端调用URL： http://localhost:11647/service/OrderService/QueryOrder&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法4：使用MyServiceHandler，&lt;/strong&gt;只需要配置web.config即可。&lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;path&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;/MyService.axd&lt;/span&gt;" &lt;span style="color: red"&gt;verb&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;*&lt;/span&gt;" &lt;span style="color: red"&gt;validate&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;false&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MySimpleServiceFramework.MyServiceHandler&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpHandlers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;客户端调用URL： http://localhost:11647/MyService.axd?sc=OrderService&amp;amp;op=QueryOrder&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法5：创建一个ashx，&lt;/strong&gt;不需要任何配置。&lt;/p&gt;&lt;pre &gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: #a31515"&gt;WebHandler &lt;/span&gt;&lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#" &lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="MyService" &lt;/span&gt;&lt;span style="background: #ffee62"&gt;%&amp;gt;&#xD;
&#xD;
&lt;/span&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System&lt;span style="color: red"&gt;.&lt;/span&gt;Web;&#xD;
&lt;span style="color: blue"&gt;using &lt;/span&gt;MySimpleServiceFramework;&#xD;
&#xD;
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MyService &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpHandler &lt;/span&gt;{&#xD;
    &#xD;
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;ProcessRequest (&lt;span style="color: #2b91af"&gt;HttpContext &lt;/span&gt;context) {&#xD;
        &lt;span style="color: #2b91af"&gt;NamesPair &lt;/span&gt;pair &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NamesPair&lt;/span&gt;();&#xD;
        pair&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceName &lt;span style="color: red"&gt;= &lt;/span&gt;context&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;QueryString[&lt;span style="color: #a31515"&gt;"sc"&lt;/span&gt;];&#xD;
        pair&lt;span style="color: red"&gt;.&lt;/span&gt;MethodName &lt;span style="color: red"&gt;= &lt;/span&gt;context&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;QueryString[&lt;span style="color: #a31515"&gt;"op"&lt;/span&gt;];&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;ServiceExecutor&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;ProcessRequest(context, pair);&#xD;
    }&#xD;
 &#xD;
    &lt;span style="color: blue"&gt;public bool &lt;/span&gt;IsReusable {&#xD;
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{&#xD;
            &lt;span style="color: blue"&gt;return false&lt;/span&gt;;&#xD;
        }&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;客户端调用URL： http://localhost:11647/MyService.ashx?sc=OrderService&amp;amp;op=QueryOrder&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;前三种方法，需要在IIS中做些额外的配置，因为URL中不包含文件扩展名了，IIS不知道把请求交给Asp.net来处理。&lt;br /&gt;具体配置见下图，此处省略78个字。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/281816/2011090522254360.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;我对发布服务的5种方式的建议&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;虽然，我给出了5种发布方式，但是我还是想说说我个人的想法。&lt;/p&gt;&#xD;
&lt;p&gt;在这些方法中，使用URL重写，URL路由的方法，并不是我想推荐的，写它们是主要是为了展示HttpModule 。不推荐它们是因为它们要判断URL是否符合指定模式，这个判断是有成本的。至于成本有多高，特此，我专了做门的测试。在示例代码压缩包中有个___TestRoutePerformance目录，结果如何，还是您自己去看吧，我也有点累了。 &lt;/p&gt;&#xD;
&lt;p&gt;此外，我想问：对于服务来说，URL友好有多大意义？服务的URL会让用户来输入还是让Google的爬虫来访问？ &lt;/p&gt;&#xD;
&lt;p&gt;如果以上二个问题都是否定的，那么，这二种方法就是在白白浪费机器的性能了。&lt;br /&gt;当然了，如果您的站点访问量不大，那么这点性能也可以忽略不计了，就当我没说。 &lt;/p&gt;&#xD;
&lt;p&gt;使用URL重写URL路由，还有个比较麻烦的事情：如果想通过URL多传递一个参数，那么，是不是又要修改URL模式？ &lt;/p&gt;&#xD;
&lt;p&gt;对于使用DirectProcessRequestMoudle这种模式，我以前已经说过了：除非要很好的理由，否则不建议使用这种方法。&lt;/p&gt;&#xD;
&lt;p&gt;至于其它的二种方式，本质上是一样的，只是说：处理器谁来写的差别了。&lt;br /&gt;不过，如果您要是选择手工创建一个处理器，除了不用修改web.config之外，还可以自定义URL参数名，可以选择要不要支持Session &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;【我的服务框架】的一些核心类&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ReflectionHelper类用于根据类名及服务名定位到一个服务类型以及要调用的方法。&lt;br /&gt;因此，它在框架中的作用也是非常关键的。 &lt;/p&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;internal static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ReflectionHelper&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;span style="color: red"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;TypeAndAttrInfo&lt;/span&gt;&lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;s_typeList;&#xD;
&#xD;
    &lt;span style="color: blue"&gt;static &lt;/span&gt;ReflectionHelper()&#xD;
    {&#xD;
        InitServiceTypes();&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// &lt;/span&gt;&lt;span style="color: green"&gt;加载所有的服务类型，判断方式就是检查类型是否有MyServiceAttribute&#xD;
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;private static void &lt;/span&gt;InitServiceTypes()&#xD;
    {&#xD;
        s_typeList &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;span style="color: red"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;TypeAndAttrInfo&lt;/span&gt;&lt;span style="color: red"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: purple"&gt;256&lt;/span&gt;);&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;ICollection &lt;/span&gt;assemblies &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BuildManager&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;GetReferencedAssemblies();&#xD;
        &lt;span style="color: blue"&gt;foreach&lt;/span&gt;( &lt;span style="color: #2b91af"&gt;Assembly &lt;/span&gt;assembly &lt;span style="color: blue"&gt;in &lt;/span&gt;assemblies ) {&#xD;
            &lt;span style="color: blue"&gt;try &lt;/span&gt;{&#xD;
                (&lt;span style="color: blue"&gt;from &lt;/span&gt;t &lt;span style="color: blue"&gt;in &lt;/span&gt;assembly&lt;span style="color: red"&gt;.&lt;/span&gt;GetExportedTypes()&#xD;
                 &lt;span style="color: blue"&gt;let &lt;/span&gt;a &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MyServiceAttribute&lt;/span&gt;[])t&lt;span style="color: red"&gt;.&lt;/span&gt;GetCustomAttributes(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MyServiceAttribute&lt;/span&gt;), &lt;span style="color: blue"&gt;false&lt;/span&gt;)&#xD;
                 &lt;span style="color: blue"&gt;where &lt;/span&gt;a&lt;span style="color: red"&gt;.&lt;/span&gt;Length &lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: purple"&gt;0&#xD;
                 &lt;/span&gt;&lt;span style="color: blue"&gt;select new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TypeAndAttrInfo &lt;/span&gt;{ &#xD;
                            ServiceType &lt;span style="color: red"&gt;= &lt;/span&gt;t, Attr &lt;span style="color: red"&gt;= &lt;/span&gt;a[&lt;span style="color: purple"&gt;0&lt;/span&gt;], AuthorizeAttr &lt;span style="color: red"&gt;= &lt;/span&gt;t&lt;span style="color: red"&gt;.&lt;/span&gt;GetClassAuthorizeAttribute() }&#xD;
                 )&lt;span style="color: red"&gt;.&lt;/span&gt;ToList()&lt;span style="color: red"&gt;.&lt;/span&gt;ForEach(b &lt;span style="color: red"&gt;=&amp;gt; &lt;/span&gt;s_typeList&lt;span style="color: red"&gt;.&lt;/span&gt;Add(b));&#xD;
            }&#xD;
            &lt;span style="color: blue"&gt;catch &lt;/span&gt;{ }&#xD;
        }&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;AuthorizeAttribute &lt;/span&gt;GetClassAuthorizeAttribute(&lt;span style="color: blue"&gt;this &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t)&#xD;
    {&#xD;
        &lt;span style="color: #2b91af"&gt;AuthorizeAttribute&lt;/span&gt;[] attrs &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;AuthorizeAttribute&lt;/span&gt;[])t&lt;span style="color: red"&gt;.&lt;/span&gt;GetCustomAttributes(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;AuthorizeAttribute&lt;/span&gt;), &lt;span style="color: blue"&gt;false&lt;/span&gt;);&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;(attrs&lt;span style="color: red"&gt;.&lt;/span&gt;Length &lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: purple"&gt;0 &lt;/span&gt;&lt;span style="color: red"&gt;? &lt;/span&gt;attrs[&lt;span style="color: purple"&gt;0&lt;/span&gt;] : &lt;span style="color: blue"&gt;null&lt;/span&gt;);&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// &lt;/span&gt;&lt;span style="color: green"&gt;根据一个名称获取对应的服务类型（从缓存中获取类型）&#xD;
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
    /// &amp;lt;param name="typeName"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TypeAndAttrInfo &lt;/span&gt;GetServiceType(&lt;span style="color: blue"&gt;string &lt;/span&gt;typeName)&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;IsNullOrEmpty(typeName) )&#xD;
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"typeName"&lt;/span&gt;);&#xD;
&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 查找类型的方式：如果有点号，则按全名来查找(包含命名空间)，否则只看名字。&#xD;
        // 本框架对于多个匹配条件的类型，将返回第一个匹配项。&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;( typeName&lt;span style="color: red"&gt;.&lt;/span&gt;IndexOf(&lt;span style="color: #a31515"&gt;'.'&lt;/span&gt;) &lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: purple"&gt;0 &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;return &lt;/span&gt;s_typeList&lt;span style="color: red"&gt;.&lt;/span&gt;FirstOrDefault(t &lt;span style="color: red"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Compare(t&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceType&lt;span style="color: red"&gt;.&lt;/span&gt;FullName, typeName, &lt;span style="color: blue"&gt;true&lt;/span&gt;) &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: purple"&gt;0&lt;/span&gt;);&#xD;
        &lt;span style="color: blue"&gt;else&#xD;
            return &lt;/span&gt;s_typeList&lt;span style="color: red"&gt;.&lt;/span&gt;FirstOrDefault(t &lt;span style="color: red"&gt;=&amp;gt; &lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Compare(t&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceType&lt;span style="color: red"&gt;.&lt;/span&gt;Name, typeName, &lt;span style="color: blue"&gt;true&lt;/span&gt;) &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: purple"&gt;0&lt;/span&gt;);&#xD;
    }&#xD;
    &#xD;
    &#xD;
&#xD;
    &lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Hashtable &lt;/span&gt;s_methodTable &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Hashtable&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Synchronized(&#xD;
                                        &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Hashtable&lt;/span&gt;(&lt;span style="color: purple"&gt;4096&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;StringComparer&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;OrdinalIgnoreCase));&#xD;
&#xD;
    &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// &lt;/span&gt;&lt;span style="color: green"&gt;根据指定的类型以及方法名称，获取对应的方法信息&#xD;
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
    /// &amp;lt;param name="type"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
    /// &amp;lt;param name="methodName"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodAndAttrInfo &lt;/span&gt;GetServiceMethod(&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;type, &lt;span style="color: blue"&gt;string &lt;/span&gt;methodName)&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( type &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"type"&lt;/span&gt;);&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;IsNullOrEmpty(methodName))&#xD;
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"methodName"&lt;/span&gt;);&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 首先尝试从缓存中读取&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;key &lt;span style="color: red"&gt;= &lt;/span&gt;methodName &lt;span style="color: red"&gt;+ &lt;/span&gt;&lt;span style="color: #a31515"&gt;"@" &lt;/span&gt;&lt;span style="color: red"&gt;+ &lt;/span&gt;type&lt;span style="color: red"&gt;.&lt;/span&gt;FullName;&#xD;
        &lt;span style="color: #2b91af"&gt;MethodAndAttrInfo &lt;/span&gt;mi &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MethodAndAttrInfo&lt;/span&gt;)s_methodTable[key];&#xD;
&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( mi &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;) {&#xD;
            &lt;span style="color: green"&gt;// 注意：这里不考虑方法的重载。&#xD;
            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodInfo &lt;/span&gt;method &lt;span style="color: red"&gt;= &lt;/span&gt;type&lt;span style="color: red"&gt;.&lt;/span&gt;GetMethod(methodName,&#xD;
                     &lt;span style="color: #2b91af"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Static &lt;span style="color: red"&gt;| &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Instance &lt;span style="color: red"&gt;| &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Public &lt;span style="color: red"&gt;| &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;IgnoreCase);&#xD;
&#xD;
            &lt;span style="color: blue"&gt;if&lt;/span&gt;( method &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
                &lt;span style="color: blue"&gt;return null&lt;/span&gt;;&#xD;
&#xD;
            &lt;span style="color: #2b91af"&gt;MyServiceMethodAttribute&lt;/span&gt;[] attrs &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MyServiceMethodAttribute&lt;/span&gt;[])&#xD;
                                        method&lt;span style="color: red"&gt;.&lt;/span&gt;GetCustomAttributes(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MyServiceMethodAttribute&lt;/span&gt;), &lt;span style="color: blue"&gt;false&lt;/span&gt;);&#xD;
            &lt;span style="color: blue"&gt;if&lt;/span&gt;( attrs&lt;span style="color: red"&gt;.&lt;/span&gt;Length &lt;span style="color: red"&gt;!= &lt;/span&gt;&lt;span style="color: purple"&gt;1 &lt;/span&gt;)&#xD;
                &lt;span style="color: blue"&gt;return null&lt;/span&gt;;&#xD;
&#xD;
&#xD;
            &lt;span style="color: green"&gt;// 由于服务方法的参数来源于反序列化，此时只可能包含一个参数。&#xD;
            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ParameterInfo&lt;/span&gt;[] paraInfos &lt;span style="color: red"&gt;= &lt;/span&gt;method&lt;span style="color: red"&gt;.&lt;/span&gt;GetParameters();&#xD;
            &lt;span style="color: blue"&gt;if&lt;/span&gt;( paraInfos&lt;span style="color: red"&gt;.&lt;/span&gt;Length &lt;span style="color: red"&gt;!= &lt;/span&gt;&lt;span style="color: purple"&gt;1 &lt;/span&gt;)&#xD;
                &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"指定的方法虽找到，但该方法的参数数量不是1"&lt;/span&gt;);&#xD;
&#xD;
            &lt;span style="color: #2b91af"&gt;AuthorizeAttribute&lt;/span&gt;[] auths &lt;span style="color: red"&gt;= &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;AuthorizeAttribute&lt;/span&gt;[])method&lt;span style="color: red"&gt;.&lt;/span&gt;GetCustomAttributes(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;AuthorizeAttribute&lt;/span&gt;), &lt;span style="color: blue"&gt;false&lt;/span&gt;);&#xD;
&#xD;
            mi &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MethodAndAttrInfo &lt;/span&gt;{&#xD;
                        MethodInfo &lt;span style="color: red"&gt;= &lt;/span&gt;method,&#xD;
                        ParamType &lt;span style="color: red"&gt;= &lt;/span&gt;paraInfos[&lt;span style="color: purple"&gt;0&lt;/span&gt;]&lt;span style="color: red"&gt;.&lt;/span&gt;ParameterType,&#xD;
                        Attr &lt;span style="color: red"&gt;= &lt;/span&gt;attrs[&lt;span style="color: purple"&gt;0&lt;/span&gt;],&#xD;
                        AuthorizeAttr &lt;span style="color: red"&gt;= &lt;/span&gt;(auths&lt;span style="color: red"&gt;.&lt;/span&gt;Length &lt;span style="color: red"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color: purple"&gt;0 &lt;/span&gt;&lt;span style="color: red"&gt;? &lt;/span&gt;auths[&lt;span style="color: purple"&gt;0&lt;/span&gt;] : &lt;span style="color: blue"&gt;null&lt;/span&gt;)&#xD;
            };&#xD;
&#xD;
            s_methodTable[key] &lt;span style="color: red"&gt;= &lt;/span&gt;mi;&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;mi;            &#xD;
    }&#xD;
&#xD;
&#xD;
    &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// &lt;/span&gt;&lt;span style="color: green"&gt;根据类型名称以及方法名称返回要调用的相关信息&#xD;
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
    /// &amp;lt;param name="pair"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;包含类型名称以及方法名称的对象&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&#xD;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvokeInfo &lt;/span&gt;GetInvokeInfo(&lt;span style="color: #2b91af"&gt;NamesPair &lt;/span&gt;pair)&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( pair &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"pair"&lt;/span&gt;);&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;InvokeInfo &lt;/span&gt;vkInfo &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvokeInfo&lt;/span&gt;();&#xD;
&#xD;
        vkInfo&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceTypeInfo &lt;span style="color: red"&gt;= &lt;/span&gt;GetServiceType(pair&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceName);&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( vkInfo&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceTypeInfo &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;return null&lt;/span&gt;;&#xD;
&#xD;
        vkInfo&lt;span style="color: red"&gt;.&lt;/span&gt;MethodAttrInfo &lt;span style="color: red"&gt;= &lt;/span&gt;GetServiceMethod(vkInfo&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceTypeInfo&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceType, pair&lt;span style="color: red"&gt;.&lt;/span&gt;MethodName);&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( vkInfo&lt;span style="color: red"&gt;.&lt;/span&gt;MethodAttrInfo &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;return null&lt;/span&gt;;&#xD;
&#xD;
&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( vkInfo&lt;span style="color: red"&gt;.&lt;/span&gt;MethodAttrInfo&lt;span style="color: red"&gt;.&lt;/span&gt;MethodInfo&lt;span style="color: red"&gt;.&lt;/span&gt;IsStatic &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;false &lt;/span&gt;)&#xD;
            vkInfo&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceInstance &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Activator&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;CreateInstance(vkInfo&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceTypeInfo&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceType);&#xD;
&#xD;
&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;vkInfo;&#xD;
    }&#xD;
&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ServiceExecutor用于调用服务方法，前面所说的5种服务发布方式，最终都要经过这里。 &lt;/p&gt;&lt;pre &gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
/// &lt;/span&gt;&lt;span style="color: green"&gt;最终调用服务方法的工具类。&#xD;
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
&lt;/span&gt;&lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ServiceExecutor&#xD;
&lt;/span&gt;{&#xD;
    &lt;span style="color: blue"&gt;internal static void &lt;/span&gt;ProcessRequest(&lt;span style="color: #2b91af"&gt;HttpContext &lt;/span&gt;context, &lt;span style="color: #2b91af"&gt;ServiceInfo &lt;/span&gt;info)&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( context &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"context"&lt;/span&gt;);&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( info &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;&lt;span style="color: red"&gt;|| &lt;/span&gt;info&lt;span style="color: red"&gt;.&lt;/span&gt;InvokeInfo &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"info"&lt;/span&gt;);&#xD;
&#xD;
        &lt;span style="color: green"&gt;//if( context.Request.InputStream.Length == 0 )&#xD;
        //    throw new InvalidDataException("没有调用数据，请将调用数据以请求体的方式传入。");&#xD;
        &#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;( info&lt;span style="color: red"&gt;.&lt;/span&gt;InvokeInfo&lt;span style="color: red"&gt;.&lt;/span&gt;AuthenticateRequest(context) &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;false &lt;/span&gt;)&#xD;
            &lt;span style="color: #2b91af"&gt;ExceptionHelper&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Throw403Exception(context);&#xD;
        &#xD;
        &lt;span style="color: green"&gt;// 获取客户端的数据序列化格式。    &#xD;
        //   默认实现方式：request.Headers["Serializer-Format"];&#xD;
        //   注意：这是我自定义的请求头名称，也可以不指定，默认为：form (表单)&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;serializerFormat &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FrameworkRules&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;GetSerializerFormat(context&lt;span style="color: red"&gt;.&lt;/span&gt;Request);&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;ISerializerProvider &lt;/span&gt;serializerProvider &lt;span style="color: red"&gt;=&#xD;
                    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SerializerProviderFactory&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;GetSerializerProvider(serializerFormat);&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 获取要调用方法的参数类型&#xD;
        &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;destType &lt;span style="color: red"&gt;= &lt;/span&gt;info&lt;span style="color: red"&gt;.&lt;/span&gt;InvokeInfo&lt;span style="color: red"&gt;.&lt;/span&gt;MethodAttrInfo&lt;span style="color: red"&gt;.&lt;/span&gt;ParamType;&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 获取要调用的参数&#xD;
        &lt;/span&gt;context&lt;span style="color: red"&gt;.&lt;/span&gt;Request&lt;span style="color: red"&gt;.&lt;/span&gt;InputStream&lt;span style="color: red"&gt;.&lt;/span&gt;Position &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: purple"&gt;0&lt;/span&gt;;    &lt;span style="color: green"&gt;// 防止其它Module读取过，但没有归位。&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;object &lt;/span&gt;param &lt;span style="color: red"&gt;= &lt;/span&gt;serializerProvider&lt;span style="color: red"&gt;.&lt;/span&gt;Deserialize(destType, context&lt;span style="color: red"&gt;.&lt;/span&gt;Request);&#xD;
        &#xD;
        &lt;span style="color: green"&gt;// 调用服务方法&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;object &lt;/span&gt;result &lt;span style="color: red"&gt;= &lt;/span&gt;info&lt;span style="color: red"&gt;.&lt;/span&gt;InvokeInfo&lt;span style="color: red"&gt;.&lt;/span&gt;MethodAttrInfo&lt;span style="color: red"&gt;.&lt;/span&gt;MethodInfo&lt;span style="color: red"&gt;.&lt;/span&gt;Invoke(&#xD;
                                info&lt;span style="color: red"&gt;.&lt;/span&gt;InvokeInfo&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceInstance, &lt;span style="color: blue"&gt;new object&lt;/span&gt;[] { param });&#xD;
&#xD;
        &lt;span style="color: green"&gt;// 写输出结果&#xD;
        &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;( result &lt;span style="color: red"&gt;!= &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            serializerProvider&lt;span style="color: red"&gt;.&lt;/span&gt;Serializer(result, context&lt;span style="color: red"&gt;.&lt;/span&gt;Response);&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// &lt;/span&gt;&lt;span style="color: green"&gt;【外部接口】用于根据服务的类名和方法名执行某个请求&#xD;
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&#xD;
    /// &amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
    /// &amp;lt;param name="pair"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;public static void &lt;/span&gt;ProcessRequest(&lt;span style="color: #2b91af"&gt;HttpContext &lt;/span&gt;context, &lt;span style="color: #2b91af"&gt;NamesPair &lt;/span&gt;pair)&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( pair &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"pair"&lt;/span&gt;);&#xD;
&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;IsNullOrEmpty(pair&lt;span style="color: red"&gt;.&lt;/span&gt;ServiceName) &lt;span style="color: red"&gt;|| &lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;IsNullOrEmpty(pair&lt;span style="color: red"&gt;.&lt;/span&gt;MethodName) )&#xD;
            &lt;span style="color: #2b91af"&gt;ExceptionHelper&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Throw404Exception(context);&#xD;
&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;InvokeInfo &lt;/span&gt;vkInfo &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ReflectionHelper&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;GetInvokeInfo(pair);&#xD;
        &lt;span style="color: blue"&gt;if&lt;/span&gt;( vkInfo &lt;span style="color: red"&gt;== &lt;/span&gt;&lt;span style="color: blue"&gt;null &lt;/span&gt;)&#xD;
            &lt;span style="color: #2b91af"&gt;ExceptionHelper&lt;/span&gt;&lt;span style="color: red"&gt;.&lt;/span&gt;Throw404Exception(context);&#xD;
&#xD;
        &lt;span style="color: #2b91af"&gt;ServiceInfo &lt;/span&gt;info &lt;span style="color: red"&gt;= &lt;/span&gt;&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ServiceInfo&lt;/span&gt;(pair, vkInfo);&#xD;
&#xD;
        ProcessRequest(context, info);&#xD;
    }        &#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;关于写框架&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;以前曾在网上见过几次关于&amp;#8220;重复造轮子&amp;#8221;的说法。基本上，全是反对意见。&lt;/p&gt;&#xD;
&lt;p&gt;我今天也想谈谈这个话题：要不要自己写框架？&lt;/p&gt;&#xD;
&lt;p&gt;我的答案是：要。&lt;/p&gt;&#xD;
&lt;p&gt;自己写框架的好处不在于能将它做得多强大，多完美，而是从写框架的过程中，可以学到很多东西。&lt;/p&gt;&#xD;
&lt;p&gt;一个框架写完了，不在乎要给多少人使用，而是自己感觉有没有进步，这才是关键。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;如果您不重复造轮子，可能永远不知道造轮子的过程，造轮子需要什么内容。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果不重复造轮子，世界上将只有一个操作系统。&lt;br /&gt;如果不重复造轮子，世界上将只有一个数据库。&lt;br /&gt;如果不重复造轮子，世界上将只有一种编程语言。&lt;br /&gt;这样单调会很好吗？ &lt;br /&gt;&lt;br /&gt;WebForms, MVC, Linq To SQL, Entity Framework, Remoting, Web Service, WCF&lt;br /&gt;微软不也是一直在重复造轮子吗？ &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;结束语&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;终于写完了这篇博客。这篇博客花了我最多的写作时间：整整二个周末还加上一些业余时间。&lt;br /&gt;当然了，其中也包括实现框架的时间。这其实也是希望更好地展示Asp.net的核心内容。&lt;br /&gt;写框架不是目标，展示Asp.net技术，写博客才是目标哦。 &lt;/p&gt;&#xD;
&lt;p&gt;因此，这篇博客可谓是【下足了料】，只希望：&lt;br /&gt;1. 能给大家分享Asp.net的核心内容。&lt;br /&gt;2. 这篇博客的成绩能赶上&lt;a href="http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;【细说Cookie】&lt;/font&gt;&lt;/a&gt;。&lt;br /&gt;我的写博热情也离不开您的肯定支持哦，如果您认为阅读此文有收获，别忘了点一下右下角的【推荐】，【关注 Fish Li】。&lt;span &gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;Asp.net是个伟大的平台，能完成许多应用。这些应用的实现离不开这二次博客所提过的核心对象的支持，&lt;br /&gt;本来还想再写点其它的示例，只是时间花得太多了。今天的示例已经很精彩了，到此为止吧，我也想休息了。&lt;span &gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;每个对象都是一个不朽的传奇，每个传奇背后都有一个精彩的故事。&lt;br /&gt;我是Fish Li, 感谢大家阅读我的博客，请继续关注我的后续博客。&lt;span &gt;&lt;/span&gt; &lt;/p&gt;&lt;img src="http://www.cnblogs.com/jvstudio/aggbug/2168146.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jvstudio/archive/2011/09/05/2168146.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jvstudio/archive/2011/04/16/2018281.html</id><title type="text">给页面加速，干掉Dom Level 0 Event</title><summary type="text">现在的web应用越来越复杂,需要响应各种各样的用户触发事件,因而也就不可避免的,需要给我们的html页面上的dom元素增加事件监听函数.我们知道给dom元素绑定事件监听函数的方法有如下3种:1 :页面html:&amp;lt;button onclick=”test();”&amp;gt;&amp;lt;/button&amp;gt; 2:页面html:&amp;lt;button id=”btn”&amp;gt;&amp;lt;/button&amp;gt; Javascript:document.getElementById(“btn”).onclick = test;3: 页面html: &amp;lt;button id=”btn”&amp;gt;&amp;lt;/but</summary><published>2011-04-16T07:17:00Z</published><updated>2011-04-16T07:17:00Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jvstudio/archive/2011/04/16/2018281.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/archive/2011/04/16/2018281.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;现在的web应用越来越复杂,需要响应各种各样的用户触发事件,因而也就不可避免的,需要给我们的html页面上的dom元素增加事件监听函数.&lt;/p&gt;&#xD;
&lt;p&gt;我们知道给dom元素绑定事件监听函数的方法有如下3种:&lt;/p&gt;&#xD;
&lt;p&gt;1 :&amp;nbsp;&amp;nbsp;页面html:&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;button &lt;/span&gt;&lt;span style="color: #ff0000"&gt;onclick&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;#8221;test();&amp;#8221;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&amp;nbsp; &#xD;
&lt;p&gt;2:&amp;nbsp;&amp;nbsp;页面html:&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;button &lt;/span&gt;&lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;#8221;btn&amp;#8221;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Javascript:&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000"&gt;document.getElementById(&amp;#8220;btn&amp;#8221;).onclick &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;  test;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;3: &amp;nbsp;&amp;nbsp;页面html:&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;button &lt;/span&gt;&lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;#8221;btn&amp;#8221;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Javascript:&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000"&gt;document.getElementById(&amp;#8220;btn&amp;#8221;).atachEvent(&amp;#8220;onclick&amp;#8221;,test); //ie&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;这3种方法的功能效果和差异,大家都了解,在此就不在赘述了,但是这3种方法,对页面渲染的速度,资源的消耗,却是有很大不同的.&lt;/p&gt;&#xD;
&lt;p&gt;正文后面的html代码是一个demo页面,大家可以用ie浏览器打开,通过注释不同的代码段,查看页面运行效果.&lt;/p&gt;&#xD;
&lt;p&gt;可以看到第一种方式的效率是最低的,随着页面节点的增多,页面渲染时间急剧增加,在ie7下运行,大概670ms;&lt;/p&gt;&#xD;
&lt;p&gt;第二种方式明显好一些,在ie7下,大概250ms&lt;/p&gt;&#xD;
&lt;p&gt;而第三种方式则是最快的方法,也是web前端开发推荐的标准写法,在ie7下,大概188ms;&lt;/p&gt;&#xD;
&lt;p&gt;然后我们去掉事件绑定的逻辑,发现只渲染dom元素,不绑定事件的时间,仅仅125ms,可见事件绑定的时间消耗还是很大的&amp;nbsp;,尤其是第一种方式,也就是Dom Level 0 Event,最为耗时.&lt;/p&gt;&#xD;
&lt;p&gt;另外,大家运行各段代码的时候,不妨打开任务管理器,找到浏览器对应的进程,查看代码运行时cpu的消耗以及内存的使用.&lt;/p&gt;&#xD;
&lt;p&gt;我们可以看到,Dom Level 0 Event,对cpu的消耗明显要高很多.&lt;/p&gt;&#xD;
&lt;p&gt;对内存的消耗分析:&lt;/p&gt;&#xD;
&lt;p&gt;重新打开浏览器,空白页面的内存占用量大概是37M,虚拟内存为28M,页面渲染后:&lt;/p&gt;&#xD;
&lt;p&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;内存使用&amp;nbsp;54M,虚拟内存41M&lt;/p&gt;&#xD;
&lt;p&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;内存使用44M,虚拟内存31M&lt;/p&gt;&#xD;
&lt;p&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;内存使用44M,虚拟内存31M&lt;/p&gt;&#xD;
&lt;p&gt;可见Dom Level 0 Event对内存的消耗,也远远超出了其它方式.&lt;/p&gt;&#xD;
&lt;p&gt;为什么Dom Level 0 Event会这么消耗系统资源呢?对cpu和内存的消耗都远远超出了其它方式.我们来做一个简单分析.&lt;/p&gt;&#xD;
&lt;p&gt;为了便于分析,我们不妨修改一下我们的代码&amp;nbsp; &amp;lt;button onclick=&amp;#8221;debugger;test();&amp;#8221;&amp;gt;&amp;lt;/button&amp;gt; ,然后运行页面,在ie的script debugger里我们找到堆栈调用这一项,可以看到有一个anonymos function,这个function是从何而来的呢.原来浏览器在对Dom Level 0 Event做绑定的时候,会自动生成一个包含我们的代码的匿名函数,然后把这个匿名函数绑定到事件.类似于如下方式:&lt;/p&gt;&#xD;
&lt;p&gt;document.getElementById(&amp;#8220;btn&amp;#8221;).onclick = function(event){&lt;/p&gt;&#xD;
&lt;p&gt;test();&lt;/p&gt;&#xD;
&lt;p&gt;} ;&lt;/p&gt;&#xD;
&lt;p&gt;而ie浏览器又没有足够的智能,区分出众多内部功能完全一致的匿名函数并合并它们的引用,所以导致了随着dom事件绑定的越来越多,匿名函数的个数也越来越多.因为要声明数量众多的事件处理匿名函数,也就不难明白,为什么会消耗如此多的系统资源了.&lt;/p&gt;&#xD;
&lt;p&gt;随着dom元素的增多,这个资源消耗就会越来越严重.而且我们可以尝试着刷新一下页面,发现随着刷新的次数增加,页面运行越来越慢,cpu消耗也越来越多,内存也会有少量增加.可见,Dom Level 0 Event&amp;nbsp;还会带来少量的内存泄露.至于时间的延长,cpu消耗的加聚,推测是因为浏览器忙于释放众多的匿名函数所占用的资源所带来的后果.&lt;/p&gt;&#xD;
&lt;p&gt;进一步深入,由于ie浏览器是基于冒泡的事件模型,子元素的event会冒泡到父元素,所以更极致的优化,是去掉众多子元素的事件绑定,而将事件绑定到父元素,在正文后的demo中,也有这方面的尝试,可以看到不仅cpu,内存消耗最低,时间上也跟渲染干净的html页面是一样的.&lt;/p&gt;&#xD;
&lt;p&gt;所以我们在页面事件绑定中,要尽量避免Dom Level 0 Event,而且要尽可能的将事件上升．（当然也要考虑事件处理的灵活性）．&lt;/p&gt;&#xD;
&lt;p&gt;demo： &lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BODY&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ul &lt;/span&gt;&lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="list"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;SCRIPT &lt;/span&gt;&lt;span style="color: #ff0000"&gt;LANGUAGE&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="JavaScript"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;var&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; $ &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;=&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; &lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;function&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;(id){&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;return&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; document.getElementById(id)&lt;br /&gt;        };&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;function&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; test(){&lt;br /&gt;            alert(&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;1&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;)&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;var&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; ul &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;=&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; $(&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;"&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;list&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;"&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;var&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; count &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;=&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;5000&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt; ie7 &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;    &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;SCRIPT&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;var&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; d &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;=&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; &lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;new&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; Date()&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;var&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; str &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;=&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; [];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;for&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;var&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; i &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;=&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;0&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;;i&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;count;i&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;++&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;){&lt;br /&gt;        str.push(&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;'&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&amp;lt;li onclick="test();"&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;'&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;+&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;i&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;+&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;'&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;'&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;)&lt;br /&gt;    }&lt;br /&gt;    ul.innerHTML &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;=&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; str.join(&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;""&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;);&lt;br /&gt;    alert(&lt;/span&gt;&lt;span style="color: #0000ff; background-color: #f5f5f5"&gt;new&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; Date &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;-&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt; d);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;670  刷新时时间增加   85&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;SCRIPT &lt;/span&gt;&lt;span style="color: #ff0000"&gt;LANGUAGE&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="JavaScript"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;/*&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;var d = new Date()&lt;br /&gt;    var str = [];&lt;br /&gt;    for(var i = 0;i&amp;lt;count;i++){&lt;br /&gt;        str.push('&amp;lt;li&amp;gt;'+i+'&amp;lt;/li&amp;gt;')&lt;br /&gt;    }&lt;br /&gt;    ul.innerHTML = str.join("");&lt;br /&gt;    alert(new Date - d); &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;*/&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;  &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;125&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;  &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;SCRIPT&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;SCRIPT &lt;/span&gt;&lt;span style="color: #ff0000"&gt;LANGUAGE&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="JavaScript"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;/*&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;var d = new Date()&lt;br /&gt;    var str = [];&lt;br /&gt;    for(var i = 0;i&amp;lt;count;i++){&lt;br /&gt;        str.push('&amp;lt;li&amp;gt;'+i+'&amp;lt;/li&amp;gt;')&lt;br /&gt;    }&lt;br /&gt;    ul.innerHTML = str.join("");&lt;br /&gt;    var li = document.getElementsByTagName("li");&lt;br /&gt;    var l = li.length;&lt;br /&gt;    for(var i=0;i&amp;lt;l;i++){&lt;br /&gt;        li[i].onclick = test;&lt;br /&gt;    }&lt;br /&gt;    li = null;&lt;br /&gt;    alert(new Date - d);&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;*/&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;250&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;  &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;SCRIPT&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;SCRIPT &lt;/span&gt;&lt;span style="color: #ff0000"&gt;LANGUAGE&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="JavaScript"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;/*&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;var d = new Date()&lt;br /&gt;    var str = [];&lt;br /&gt;    for(var i = 0;i&amp;lt;count;i++){&lt;br /&gt;        str.push('&amp;lt;li&amp;gt;'+i+'&amp;lt;/li&amp;gt;')&lt;br /&gt;    }&lt;br /&gt;    ul.innerHTML = str.join("");&lt;br /&gt;    var li = document.getElementsByTagName("li");&lt;br /&gt;    var l = li.length;&lt;br /&gt;    for(var i=0;i&amp;lt;l;i++){&lt;br /&gt;        li[i].attachEvent("onclick",test);&lt;br /&gt;    }&lt;br /&gt;    li = null;&lt;br /&gt;    alert(new Date - d);&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;*/&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;188&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;  &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;SCRIPT&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;SCRIPT &lt;/span&gt;&lt;span style="color: #ff0000"&gt;LANGUAGE&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="JavaScript"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;/*&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;var d = new Date()&lt;br /&gt;    var str = [];&lt;br /&gt;    for(var i = 0;i&amp;lt;count;i++){&lt;br /&gt;        str.push('&amp;lt;li&amp;gt;'+i+'&amp;lt;/li&amp;gt;')&lt;br /&gt;    }&lt;br /&gt;    ul.innerHTML = str.join("");&lt;br /&gt;    ul.attachEvent("onclick",test);&lt;br /&gt;    alert(new Date - d);&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;*/&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;125&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;  &lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #008000; background-color: #f5f5f5"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000; background-color: #f5f5f5"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;SCRIPT&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;BODY&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jvstudio/aggbug/2018281.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jvstudio/archive/2011/04/16/2018281.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jvstudio/archive/2011/04/16/2018167.html</id><title type="text">Asp.net中网站级异常捕获</title><summary type="text">近在公司某管理系统中，用了一些独立的模块，在这些类的实现中，错误是直接抛出异常的，我想这是我们通常的做法。然而，问题也来了，由于自己在Asp.net页面中没有去捕获这些异常，并且多处页面中都使用了这些类，于是在多个页面都会出现不友好的错误提示信息。 怎么办？又不想一处一处修改代码，既费时又费力，这样编程不就变成了体力劳动，从而失去了乐趣。 这时让我想起了自定义错误页，于是Google，终于找到了答案。1、配置web.config:&amp;lt;customErrorsmode=&amp;quot;RemoteOnly&amp;quot;defaultRedirect=&amp;quot;ErrorPage.aspx&amp;quo</summary><published>2011-04-16T06:34:00Z</published><updated>2011-04-16T06:34:00Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jvstudio/archive/2011/04/16/2018167.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/archive/2011/04/16/2018167.html"/><content type="html">近在公司某管理系统中，用了一些独立的模块，在这些类的实现中，错误是直接抛出异常的，我想这是我们通常的做法。然而，问题也来了，由于自己在Asp.net页面中没有去捕获这些异常，并且多处页面中都使用了这些类，于是在多个页面都会出现不友好的错误提示信息。 &#xD;
&lt;p&gt;怎么办？又不想一处一处修改代码，既费时又费力，这样编程不就变成了体力劳动，从而失去了乐趣。 这时让我想起了自定义错误页，于是Google，终于找到了答案。&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、配置web.config:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;customErrors&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;mode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="RemoteOnly"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;defaultRedirect&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ErrorPage.aspx"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;redirectMode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ResponseRewrite"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&amp;nbsp;关键是redirectMode属性，该属性默认为ResponseRedirect，由于被Redirect了，异常也就被忽略了，&lt;strong&gt;使你无法捕获到异常&lt;/strong&gt;。这里罗嗦一句：因为出错前后被认为是两次请求，我们知道http协议是一种无状态的协议，第二次请求忽略了第一次的异常也就不奇怪了。于是有人用了Session或Application来保存异常，这是不可取的。正确的做法是使用&amp;#8220;ResponseRewrite"。 &#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2、输出异常信息：&lt;/p&gt;&#xD;
&lt;p&gt;我们知道网站出错时，会自动导向我们的ErrorPage.apx页面，在ErrorPage.aspx中如何访问这个异常呢？答案是:Server.GetLastError()，当然有可能是Server.GetLastError().&lt;span style="color: #0000ff"&gt;InnerException&lt;/span&gt;。这要具体分析了。&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(Server.GetLastError()&lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Response.Write(Server.GetLastError().Message);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;顺便说一下： &lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Asp.net MVC中就简单多了，框架自带了一个Error.aspx，异常保存在Model.Exception中，并且Web.config中也为我们配置好了。&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在下从去年以来开发的网页就基本是MVC的了，结构清晰，扩展方便，清凉的HTML代码输出。有空看看MVC的源代码还是很有帮助的。&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jvstudio/aggbug/2018167.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jvstudio/archive/2011/04/16/2018167.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jvstudio/archive/2011/03/17/1986782.html</id><title type="text">vsjitdebugger.exe 进程解决方法</title><summary type="text">服务器上时不时就会出现vsjitdebugger.exe这个进程，还经常是好多一起出现，一旦出现，服务器上运行的软件就不工作了，甚是郁闷！远程桌面到服务器上，能看到每一个进程其实就是一个visual studio的调试窗口，挨个关掉就好了。有没有更好的解决方法呢？今天上网查了查，终于找到了解决办法，但不知道给程序调试会不会留下什么隐患，后来想想反正服务器上也不做debug，就这样吧。禁用实时调试：打开VS2005，在“工具”菜单中单击“选项”，选择“调试”文件夹，选择“实时”页，清除相关的程序类型：“托管”、“本机”、“脚本”，单击“确定”。删除以下注册表项：[HKEY_LOCAL_MACHI</summary><published>2011-03-17T02:44:00Z</published><updated>2011-03-17T02:44:00Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jvstudio/archive/2011/03/17/1986782.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/archive/2011/03/17/1986782.html"/><content type="html">&lt;div  id="blog_text"&gt;&#xD;
&lt;p&gt;服务器上时不时就会出现vsjitdebugger.exe这个进程，还经常是好多一起出现，一旦出现，服务器上运行的软件就不工作了，甚是郁闷！远程桌面到服务器上，能看到每一个进程其实就是一个visual studio的调试窗口，挨个关掉就好了。有没有更好的解决方法呢？&lt;/p&gt;&#xD;
&lt;p&gt;今天上网查了查，终于找到了解决办法，但不知道给程序调试会不会留下什么隐患，后来想想反正服务器上也不做debug，就这样吧。&lt;/p&gt;&#xD;
&lt;p&gt;禁用实时调试：打开VS2005，在&amp;#8220;工具&amp;#8221;菜单中单击&amp;#8220;选项&amp;#8221;，选择&amp;#8220;调试&amp;#8221;文件夹，选择&amp;#8220;实时&amp;#8221;页，清除相关的程序类型：&amp;#8220;托管&amp;#8221;、&amp;#8220;本机&amp;#8221;、&amp;#8220;脚本&amp;#8221;，单击&amp;#8220;确定&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;删除以下注册表项：&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]&lt;/p&gt;&#xD;
&lt;p&gt;"Debugger"="C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld&lt;/p&gt;&#xD;
&lt;p&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]&lt;/p&gt;&#xD;
&lt;p&gt;"DbgManagedDebugger"="C:\WINDOWS\system32\vsjitdebugger.exe" PID %d APPDOM %d EXTEXT "%s" EVTHDL %d&lt;/p&gt;&#xD;
&lt;p&gt;这样，windows就没有任何调试器了。&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;font size="2"&gt;如果想恢复原来的调试： &lt;br /&gt;选上相关的程序类型：&amp;#8220;托管&amp;#8221;、&amp;#8220;本机&amp;#8221;、&amp;#8220;脚本&amp;#8221; &lt;br /&gt;或 执行： drwtsn32 -i &lt;/font&gt;&lt;img src="http://www.cnblogs.com/jvstudio/aggbug/1986782.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jvstudio/archive/2011/03/17/1986782.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jvstudio/archive/2011/02/24/1963672.html</id><title type="text">Sql2000把数据库备份到网络上其余地电脑上</title><summary type="text">SQL code--你是否有足够的权限?如果有足够的权限,可以备份到本机--如果有,可以用下面的方法,查询分析器中操作:-- 创建共享目录exec master.dbo.XP_cmdshell &amp;#39;md c:\bak&amp;#39;exec master.dbo.XP_cmdshell &amp;#39;net share bak=c:\bak&amp;#39;--进行数据备份backup database 数据库 to disk=&amp;#39;c:\bak\备份.bak&amp;#39;/*--以下操作在我的电脑中进行: 打开我的电脑,地址栏中输入: http://www.cnblogs.com/jvstudio/ad</summary><published>2011-02-24T05:16:00Z</published><updated>2011-02-24T05:16:00Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jvstudio/archive/2011/02/24/1963672.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/archive/2011/02/24/1963672.html"/><content type="html">&lt;dl &gt;SQL code&lt;pre&gt;&lt;!--&#xD;
&#xD;
&#xD;
&#xD;
Code highlighting produced by Actipro CodeHighlighter (freeware)&#xD;
&#xD;
http://www.CodeHighlighter.com/&#xD;
&#xD;
&#xD;
&#xD;
--&gt;--你是否有足够的权限?如果有足够的权限,可以备份到本机&lt;/pre&gt;&lt;pre&gt;--如果有,可以用下面的方法,查询分析器中操作:&lt;/pre&gt;&lt;pre&gt;-- 创建共享目录&#xD;
exec master.dbo.XP_cmdshell 'md c:\bak'&#xD;
exec master.dbo.XP_cmdshell 'net share bak=c:\bak'&#xD;
&#xD;
--进行数据备份&#xD;
backup database 数据库 to disk='c:\bak\备份.bak'&#xD;
&#xD;
/*--以下操作在我的电脑中进行:&#xD;
   打开我的电脑,地址栏中输入:&#xD;
   &lt;a href="http://www.cnblogs.com/jvstudio/admin/file://\\SQL"&gt;http://www.cnblogs.com/jvstudio/admin/file://\\SQL&lt;/a&gt;服务器的计算机名\bak\&#xD;
   复制里面的备份.bak到你的电脑就行了&#xD;
&#xD;
--我的电脑中的操作结束--*/&#xD;
&#xD;
--删除备份生成的文件&#xD;
exec master..xp_cmdshell 'del c:\bak\备份.bak'&#xD;
&#xD;
--删除共享&#xD;
exec master.dbo.XP_cmdshell 'net share c:\bak /delete /y'&#xD;
exec master.dbo.XP_cmdshell 'rd c:\bak'&#xD;
&#xD;
--否则,你还是完全共享你本机的目录,用下面的方法备份:&#xD;
backup database 数据库 to disk='\\你的计算机名\共享目录名\备份文件名'&#xD;
&#xD;
---或通过映射网络驱动器(这样可以解决权限问题)&lt;/pre&gt;&lt;pre&gt;--1.映射&#xD;
exec master..xp_cmdshell 'net use z: \\xz\c$ "密码" /user:xz\administrator'&#xD;
&#xD;
/*--说明:&#xD;
z:            是映射网络路径对应本机的盘符,与下面的备份对应&#xD;
\\xz\c$            是要映射的网络路径&#xD;
xz\administrator        xz是远程的计算机名,administrator是登陆的用户名&#xD;
密码                        上面指定的administrator用户的密码&#xD;
--*/&#xD;
&#xD;
--2.进行数据库备份&#xD;
backup database 数据库名 to disk='z:\备份文件名'&#xD;
&#xD;
--3.备份完成后删除映射&#xD;
exec master..xp_cmdshell 'net use z: /delete'&#xD;
&lt;/pre&gt;&lt;/dl&gt;&lt;img src="http://www.cnblogs.com/jvstudio/aggbug/1963672.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jvstudio/archive/2011/02/24/1963672.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jvstudio/archive/2010/08/12/1797812.html</id><title type="text">使用InternalsVisibleToAttribute控制internal成员的访问</title><summary type="text">在上一篇文章中，为了解决成员访问级别的问题，我采用了一个object adapter，使得客户程序无法轻易地修改对象的属性。网友评论说，我的这种做法就是绕了一圈，的确，这种方法没办法阻止客户程序刻意地去修改对象的属性，但在一定程度上起到了保护作用：至少降低了误操作的可能性。今天发现其实可以用System.Runtime.CompilerServices.InternalsVisibleToAttr...</summary><published>2010-08-12T01:24:00Z</published><updated>2010-08-12T01:24:00Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jvstudio/archive/2010/08/12/1797812.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/archive/2010/08/12/1797812.html"/><content type="html">&lt;p&gt;在上一篇文章中，为了解决成员访问级别的问题，我采用了一个object adapter，使得客户程序无法轻易地修改对象的属性。网友评论说，我的这种做法就是绕了一圈，的确，这种方法没办法阻止客户程序刻意地去修改对象的属性，但在一定程度上起到了保护作用：至少降低了误操作的可能性。&lt;/p&gt;&#xD;
&lt;p&gt;今天发现其实可以用System.Runtime.CompilerServices.InternalsVisibleToAttribute这个特性达到同样的效果。以下是操作步骤。&lt;/p&gt;&#xD;
&lt;ol&gt;&lt;li&gt;假设ExposedSetter.Library这个class library中包含了一个具有internal setter属性的SourcedAggregationRoot类。首先，对ExposedSetter.Library作数字签名。在ExposedSetter.Library项目上点右键选择&amp;#8220;Properties&amp;#8221;。在&amp;#8220;Signing&amp;#8221;页下选择&amp;#8220;Sign the assembly&amp;#8221;选项，然后指定一个强名称密钥文件。SourcedAggregationRoot的代码以及ExposedSetter.Library的签名设置如下 &#xD;
&lt;div &gt;&#xD;
&lt;div  title="标题"&gt;&lt;span  title="工具栏区域"&gt;&lt;span  onmouseover="ChangeIcon(this,true)" title="显示/隐藏源代码行号" tabindex="0" onmouseout="ChangeIcon(this,false)" onclick="LineNumberVisible(this)"&gt;隐藏行号&lt;/span&gt; &lt;span  onmouseover="ChangeIcon(this,true)" title="将源代码复制到剪贴板上" tabindex="1" onkeypress="CopyCode_CheckKey(this,true)" onmouseout="ChangeIcon(this,false)" onclick="CopyCode(this)"&gt;复制代码&lt;/span&gt; &lt;span  onmouseover="ChangeIcon(this,true)" title="关于本程序" tabindex="2" onmouseout="ChangeIcon(this,false)" onclick="AboutMe()"&gt;？&lt;/span&gt; &lt;/span&gt;代码 &lt;/div&gt;&#xD;
&lt;div  title="源代码区域"&gt;&#xD;
&lt;ol &gt;&lt;li value="1"&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SourcedAggregationRoot &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IVersionControllable&lt;/span&gt;&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: #2b91af"&gt;&lt;/span&gt;{&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;private long &lt;/span&gt;version;&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;private long &lt;/span&gt;branch;&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;#region &lt;/span&gt;IVersionControllable Members&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;public long &lt;/span&gt;Version&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;{&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return this&lt;/span&gt;.version; }&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;internal set &lt;/span&gt;{ &lt;span style="color: blue"&gt;this&lt;/span&gt;.version = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;}&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;public long &lt;/span&gt;Branch&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;{&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return this&lt;/span&gt;.branch; }&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;internal set &lt;/span&gt;{ &lt;span style="color: blue"&gt;this&lt;/span&gt;.branch = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;}&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;#endregion&lt;/span&gt;&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;    public override string &lt;/span&gt;ToString()&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;{&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: blue"&gt;return string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"Version = {0}, Branch = {1}"&lt;/span&gt;,&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;version, branch);&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;}&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;}&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&lt;!--&#xD;
.src_container{background-color:#e7e5dc; width:99%; overflow:hidden; margin:12px 0 12px 0 !important; padding:0px 3px 3px 0px}&#xD;
.src_container .titlebar{ background-color:#d4dfff;  border:1px solid #4f81bd;  border-bottom:0;  padding:3px 24px;  margin:0;  width:auto;  line-height:120%;  overflow:hidden;  text-align:left;  font-size:12px}&#xD;
.src_container .toolbar{ display:inline;  font-weight:normal;  font-size:100%;  float:right;  cursor:hand;  color:#00f;  text-align:left;  overflow:hidden}&#xD;
.toolbar span.button{ display:inline;  font-weight:normal;  font-size:100%;  cursor:hand;  color:#00f;  text-align:left;  overflow:hidden;  cursor:pointer;}&#xD;
.src_container div.clientarea{ background-color:white;  border:1px solid #4f81bd;  margin:0;  width:auto !important;  width:100%;  height:auto;  overflow:auto;  text-align:left;  font-size:12px;  font-family: "Courier New","Consolas","Fixedsys",courier,monospace,serif}&#xD;
.src_container ol.mainarea{ padding:0 0 0 52px;  margin:0;  background-color:#f7f7ff !important}&#xD;
.number_show{ padding-left:52px !important;  list-style:decimal outside !important}&#xD;
.number_show li{ list-style:decimal outside !important;  border-left:1px dotted #4f81bd}&#xD;
.number_hide{ padding-left:0px !important;  list-style-type:none !important}&#xD;
.number_hide li{ list-style-type:none !important;  border-left:0px}&#xD;
ol.mainarea li{ display:list-item !important;  font-size:12px !important;  margin:0 !important;  line-height:18px !important;  padding:0 0 0 0px !important;  background-color:#f7f7ff !important;  color:#4f81bd}&#xD;
ol.mainarea li pre{color:black; line-height:18px;  padding:0 0 0 12px !important; margin:0em;  background-color:#fff !important}&#xD;
.linewrap ol.mainarea li pre{white-space:pre-wrap; white-space:-moz-pre-wrapwhite-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word}&#xD;
ol.mainarea li pre.alt{ background-color:#f7f7ff !important}&#xD;
--&gt;&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/daxnet/WindowsLiveWriter/InternalsVisibleToAttributeinternal_6FED/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/daxnet/WindowsLiveWriter/InternalsVisibleToAttributeinternal_6FED/image_thumb.png" width="375" height="94" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;新建一个class library，以调用ExposedSetter.Library中SourcedAggregationRoot的internal setter属性。为方便描述，我们将这个class library命名为ExposedSetter.Library2。在这个class library上添加对ExposedSetter.Library的引用，同时随便写一个测试的类，在类里直接调用SourcedAggregationRoot的internal setter属性来设置属性值。 &#xD;
&lt;div &gt;&#xD;
&lt;div  title="标题"&gt;&lt;span  title="工具栏区域"&gt;&lt;span  onmouseover="ChangeIcon(this,true)" title="显示/隐藏源代码行号" tabindex="0" onmouseout="ChangeIcon(this,false)" onclick="LineNumberVisible(this)"&gt;隐藏行号&lt;/span&gt; &lt;span  onmouseover="ChangeIcon(this,true)" title="将源代码复制到剪贴板上" tabindex="1" onkeypress="CopyCode_CheckKey(this,true)" onmouseout="ChangeIcon(this,false)" onclick="CopyCode(this)"&gt;复制代码&lt;/span&gt; &lt;span  onmouseover="ChangeIcon(this,true)" title="关于本程序" tabindex="2" onmouseout="ChangeIcon(this,false)" onclick="AboutMe()"&gt;？&lt;/span&gt; &lt;/span&gt;代码 &lt;/div&gt;&#xD;
&lt;div  title="源代码区域"&gt;&#xD;
&lt;ol &gt;&lt;li value="1"&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Class1&lt;/span&gt;&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: #2b91af"&gt;&lt;/span&gt;{&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SourcedAggregationRoot &lt;/span&gt;Test()&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;{&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;span style="color: #2b91af"&gt;SourcedAggregationRoot &lt;/span&gt;sar = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SourcedAggregationRoot&lt;/span&gt;();&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;sar.Branch = &lt;span style="color: magenta"&gt;125&lt;/span&gt;;&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;span style="color: blue"&gt;return &lt;/span&gt;sar;&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;}&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;}&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&lt;!--&#xD;
.src_container{background-color:#e7e5dc; width:99%; overflow:hidden; margin:12px 0 12px 0 !important; padding:0px 3px 3px 0px}&#xD;
.src_container .titlebar{ background-color:#d4dfff;  border:1px solid #4f81bd;  border-bottom:0;  padding:3px 24px;  margin:0;  width:auto;  line-height:120%;  overflow:hidden;  text-align:left;  font-size:12px}&#xD;
.src_container .toolbar{ display:inline;  font-weight:normal;  font-size:100%;  float:right;  cursor:hand;  color:#00f;  text-align:left;  overflow:hidden}&#xD;
.toolbar span.button{ display:inline;  font-weight:normal;  font-size:100%;  cursor:hand;  color:#00f;  text-align:left;  overflow:hidden;  cursor:pointer;}&#xD;
.src_container div.clientarea{ background-color:white;  border:1px solid #4f81bd;  margin:0;  width:auto !important;  width:100%;  height:auto;  overflow:auto;  text-align:left;  font-size:12px;  font-family: "Courier New","Consolas","Fixedsys",courier,monospace,serif}&#xD;
.src_container ol.mainarea{ padding:0 0 0 52px;  margin:0;  background-color:#f7f7ff !important}&#xD;
.number_show{ padding-left:52px !important;  list-style:decimal outside !important}&#xD;
.number_show li{ list-style:decimal outside !important;  border-left:1px dotted #4f81bd}&#xD;
.number_hide{ padding-left:0px !important;  list-style-type:none !important}&#xD;
.number_hide li{ list-style-type:none !important;  border-left:0px}&#xD;
ol.mainarea li{ display:list-item !important;  font-size:12px !important;  margin:0 !important;  line-height:18px !important;  padding:0 0 0 0px !important;  background-color:#f7f7ff !important;  color:#4f81bd}&#xD;
ol.mainarea li pre{color:black; line-height:18px;  padding:0 0 0 12px !important; margin:0em;  background-color:#fff !important}&#xD;
.linewrap ol.mainarea li pre{white-space:pre-wrap; white-space:-moz-pre-wrapwhite-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word}&#xD;
ol.mainarea li pre.alt{ background-color:#f7f7ff !important}&#xD;
--&gt;&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;同样，为ExposedSetter.Library2做数字签名（这一点很重要！）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;启动Visual Studio的Command Line，使用sn.exe获得ExposedSetter.Library2的公共密钥（public key），注意：是public key，而不是public key token&lt;br /&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/daxnet/WindowsLiveWriter/InternalsVisibleToAttributeinternal_6FED/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/daxnet/WindowsLiveWriter/InternalsVisibleToAttributeinternal_6FED/image_thumb_1.png" width="666" height="328" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;打开ExposedSetter.Library的AssemblyInfo.cs文件，向其添加InternalsVisibleToAttribute： &#xD;
&lt;div &gt;&#xD;
&lt;div  title="标题"&gt;&lt;span  title="工具栏区域"&gt;&lt;span  onmouseover="ChangeIcon(this,true)" title="显示/隐藏源代码行号" tabindex="0" onmouseout="ChangeIcon(this,false)" onclick="LineNumberVisible(this)"&gt;隐藏行号&lt;/span&gt; &lt;span  onmouseover="ChangeIcon(this,true)" title="将源代码复制到剪贴板上" tabindex="1" onkeypress="CopyCode_CheckKey(this,true)" onmouseout="ChangeIcon(this,false)" onclick="CopyCode(this)"&gt;复制代码&lt;/span&gt; &lt;span  onmouseover="ChangeIcon(this,true)" title="关于本程序" tabindex="2" onmouseout="ChangeIcon(this,false)" onclick="AboutMe()"&gt;？&lt;/span&gt; &lt;/span&gt;代码 &lt;/div&gt;&#xD;
&lt;div  title="源代码区域"&gt;&#xD;
&lt;ol &gt;&lt;li value="1"&gt;&lt;pre &gt;[&lt;span style="color: blue"&gt;assembly&lt;/span&gt;: &lt;span style="color: #2b91af"&gt;InternalsVisibleTo&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"ExposedSetter.Library2, PublicKey=0024000004800000940000000602000000240" &lt;/span&gt;+&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: #a31515"&gt;"000525341310004000001000100bbccb249a2e7a1" &lt;/span&gt;+&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;"7cbddf86e24532777568cb13c2ea7643b61cf60367068f2b9ca785dca303c49f015823e4eaa17b" &lt;/span&gt;+&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: #a31515"&gt;"50ed60ac47563dc8d8771358f10c3dc41f288530cfa350e6a2a24781dedeb8ec4138f93e76c537" &lt;/span&gt;+&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre &gt;&lt;span style="color: #a31515"&gt;"bce6c5aa7b25858fa90d6ef5c6ea613b1b49e6e287f9ebb7f990cfa0ce17fbfe1c338e95e88c14" &lt;/span&gt;+&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="color: #a31515"&gt;"81f9598f"&lt;/span&gt;)]&#xD;
&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&lt;!--&#xD;
.src_container{background-color:#e7e5dc; width:99%; overflow:hidden; margin:12px 0 12px 0 !important; padding:0px 3px 3px 0px}&#xD;
.src_container .titlebar{ background-color:#d4dfff;  border:1px solid #4f81bd;  border-bottom:0;  padding:3px 24px;  margin:0;  width:auto;  line-height:120%;  overflow:hidden;  text-align:left;  font-size:12px}&#xD;
.src_container .toolbar{ display:inline;  font-weight:normal;  font-size:100%;  float:right;  cursor:hand;  color:#00f;  text-align:left;  overflow:hidden}&#xD;
.toolbar span.button{ display:inline;  font-weight:normal;  font-size:100%;  cursor:hand;  color:#00f;  text-align:left;  overflow:hidden;  cursor:pointer;}&#xD;
.src_container div.clientarea{ background-color:white;  border:1px solid #4f81bd;  margin:0;  width:auto !important;  width:100%;  height:auto;  overflow:auto;  text-align:left;  font-size:12px;  font-family: "Courier New","Consolas","Fixedsys",courier,monospace,serif}&#xD;
.src_container ol.mainarea{ padding:0 0 0 52px;  margin:0;  background-color:#f7f7ff !important}&#xD;
.number_show{ padding-left:52px !important;  list-style:decimal outside !important}&#xD;
.number_show li{ list-style:decimal outside !important;  border-left:1px dotted #4f81bd}&#xD;
.number_hide{ padding-left:0px !important;  list-style-type:none !important}&#xD;
.number_hide li{ list-style-type:none !important;  border-left:0px}&#xD;
ol.mainarea li{ display:list-item !important;  font-size:12px !important;  margin:0 !important;  line-height:18px !important;  padding:0 0 0 0px !important;  background-color:#f7f7ff !important;  color:#4f81bd}&#xD;
ol.mainarea li pre{color:black; line-height:18px;  padding:0 0 0 12px !important; margin:0em;  background-color:#fff !important}&#xD;
.linewrap ol.mainarea li pre{white-space:pre-wrap; white-space:-moz-pre-wrapwhite-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word}&#xD;
ol.mainarea li pre.alt{ background-color:#f7f7ff !important}&#xD;
--&gt;&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;注意，InternalsVisibleToAttribute的参数指定了允许访问其internal成员的assembly名称和公共密钥数据。在此不能设置assembly的版本等信息，否则编译都过不去。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;编译解决方案 &lt;/li&gt;&lt;/ol&gt;&#xD;
&lt;p&gt;这种方式有点像C++的友元。与我上文提到的引入object adapter的解决方案相比，这种做法更加professional一些，毕竟可以通过.NET Framework直接支持，而且也更加安全一些，它能够明确指定哪些assembly可以访问，其余的则不能访问。但这种做法也有弊端：假设我今后又有一个assembly希望使用ExposedSetter.Library中的internal成员，我需要去修改ExposedSetter.Library中的代码，以添加一个InteralsVisibleToAttribute特性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;转帖地址：&lt;a href="http://www.cnblogs.com/daxnet/archive/2010/08/12/1797782.html"&gt;http://www.cnblogs.com/daxnet/archive/2010/08/12/1797782.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jvstudio/aggbug/1797812.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jvstudio/archive/2010/08/12/1797812.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jvstudio/archive/2010/08/12/1797809.html</id><title type="text">XML数据读取方式性能比较（一）</title><summary type="text">几个月来，疑被SOA，一直在和XML操作打交道，SQL差不多又忘光了。现在已经知道，至少有四种常用人XML数据操作方式(好像Java差不多)，不过还没有实际比较过这些方式各有哪些特点或优劣。正好看到网上也没有这方面的实验，偶来总结一下。　　测试开始先读取XML源，用一个比较大的RSS文件链接，复制到项目bin/debug目录下。[代码]　　　　　一、XmlDocument 方式代码 　　二、XPa...</summary><published>2010-08-12T01:19:00Z</published><updated>2010-08-12T01:19:00Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jvstudio/archive/2010/08/12/1797809.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/archive/2010/08/12/1797809.html"/><content type="html">&lt;p&gt;几个月来，疑被SOA，一直在和XML操作打交道，SQL差不多又忘光了。现在已经知道，至少有四种常用人XML数据操作方式(好像Java差不多)，不过还没有实际比较过这些方式各有哪些特点或优劣。正好看到网上也没有这方面的实验，偶来总结一下。&lt;/p&gt;&#xD;
&lt;p&gt;测试开始先读取XML源，用一个比较大的RSS文件&lt;a href="http://tda.msn-int.com/br/investingglossary.aspx"&gt;链接&lt;/a&gt;，复制到项目bin/debug目录下。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;Stream xmlStream &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; MemoryStream(File.ReadAllBytes(path));&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;一、XmlDocument 方式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('82a8d033-7542-4b3f-8ba3-6e82adacf538')"&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; IList testXmlDocument()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #000000"&gt;    var doc &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; XmlDocument();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #000000"&gt;    doc.Load(xmlStream);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #000000"&gt;    var nodeList &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; doc.DocumentElement.ChildNodes;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #000000"&gt;    var lstChannel &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;(nodeList.Count );&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (XmlNode node &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; nodeList)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #000000"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;span style="color: #000000"&gt;        var channel &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;span style="color: #000000"&gt;            Title &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).InnerText,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #000000"&gt;            Link &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;link&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).InnerText,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt; &lt;span style="color: #000000"&gt;            Description &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;description&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).InnerText,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt; &lt;span style="color: #000000"&gt;            Content &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;content&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).InnerText,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt; &lt;span style="color: #000000"&gt;            PubDate &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;pubDate&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).InnerText,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt; &lt;span style="color: #000000"&gt;            Author &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;author&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).InnerText,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt; &lt;span style="color: #000000"&gt;            Category &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;category&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).InnerText&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt; &lt;span style="color: #000000"&gt;        };&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt; &lt;span style="color: #000000"&gt;        lstChannel.Add(channel);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt; &lt;span style="color: #000000"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt; &lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; lstChannel;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;二、XPathNavigator 方式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('42ab3de1-622d-49ae-8a6b-c72320ce35a1')"&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; IList testXmlNavigator()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #000000"&gt;    var doc &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; XmlDocument();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #000000"&gt;    doc.Load(xmlStream);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #000000"&gt;    var nav &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; doc.CreateNavigator();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #000000"&gt;    nav.MoveToRoot();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #000000"&gt;    var nodeList &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; nav.Select(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;/channel/item&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #000000"&gt;    var lstChannel &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;(nodeList.Count);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (XPathNavigator node &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; nodeList)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; &lt;span style="color: #000000"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;span style="color: #000000"&gt;        var channel &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt; &lt;span style="color: #000000"&gt;            Title &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt; &lt;span style="color: #000000"&gt;            Link &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;link&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt; &lt;span style="color: #000000"&gt;            Description &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;description&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt; &lt;span style="color: #000000"&gt;            Content &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;content&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt; &lt;span style="color: #000000"&gt;            PubDate &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;pubDate&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt; &lt;span style="color: #000000"&gt;            Author &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;author&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt; &lt;span style="color: #000000"&gt;            Category &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;category&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt; &lt;span style="color: #000000"&gt;        };&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt; &lt;span style="color: #000000"&gt;        lstChannel.Add(channel);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt; &lt;span style="color: #000000"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt; &lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; lstChannel;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;三、XmlTextReader 方式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('35d1ed73-b927-48a4-af86-37cd47aaea3d')"&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Channel&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; testXmlReader()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #000000"&gt;    var lstChannel &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Channel&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #000000"&gt;    var reader &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; XmlReader.Create(xmlStream);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt; (reader.Read())&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #000000"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (reader.Name &lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;item&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; reader.NodeType &lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt; XmlNodeType.Element)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #000000"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;span style="color: #000000"&gt;            var channel &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; Channel();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; &lt;span style="color: #000000"&gt;            lstChannel.Add(channel);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt; (reader.Read())&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #000000"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (reader.Name &lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;item&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (reader.NodeType &lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt; XmlNodeType.Element) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;continue&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt; (reader.Name)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt; &lt;span style="color: #000000"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt; &lt;span style="color: #000000"&gt;                        channel.Title &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; reader.ReadString();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt; &lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;link&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt; &lt;span style="color: #000000"&gt;                        channel.Link &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; reader.ReadString();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt; &lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;description&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt; &lt;span style="color: #000000"&gt;                        channel.Description &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; reader.ReadString();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt; &lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;content&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt; &lt;span style="color: #000000"&gt;                        channel.Content &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; reader.ReadString();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt; &lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;pubDate&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt; &lt;span style="color: #000000"&gt;                        channel.PubDate &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; reader.ReadString();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt; &lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;author&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt; &lt;span style="color: #000000"&gt;                        channel.Author &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; reader.ReadString();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;34&lt;/span&gt; &lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;35&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;category&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;36&lt;/span&gt; &lt;span style="color: #000000"&gt;                        channel.Category &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; reader.ReadString();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;37&lt;/span&gt; &lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;38&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;default&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;39&lt;/span&gt; &lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;40&lt;/span&gt; &lt;span style="color: #000000"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;41&lt;/span&gt; &lt;span style="color: #000000"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;42&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;43&lt;/span&gt; &lt;span style="color: #000000"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;44&lt;/span&gt; &lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; lstChannel;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;45&lt;/span&gt; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;四、Linq to XML&amp;nbsp;方式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('184f02ef-3bf1-4855-97da-8f158d427067')"&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; IList testXmlLinq()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #000000"&gt;    var xd &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; XDocument.Load(xmlStream);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #000000"&gt;    var list &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; from node &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; xd.Elements(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;channel&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Descendants(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;item&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #000000"&gt;                select &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #000000"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #000000"&gt;                    Title &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.Element(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #000000"&gt;                    Link &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.Element(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;link&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;span style="color: #000000"&gt;                    Description &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.Element(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;description&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; &lt;span style="color: #000000"&gt;                    Content &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.Element(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;content&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;span style="color: #000000"&gt;                    PubDate &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.Element(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;pubDate&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #000000"&gt;                    Author &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.Element(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;author&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt; &lt;span style="color: #000000"&gt;                    Category &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; node.Element(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;category&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt; &lt;span style="color: #000000"&gt;                };&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt; &lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; list.ToList();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;测试结果：&lt;/p&gt;&#xD;
&lt;table style="width: 176px; border-collapse: collapse; height: 88px; margin-left: 27px" border="1" bordercolor="#000000"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;XmlDocment&lt;/td&gt;&#xD;
&lt;td&gt;47ms&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;XPathNavigator&lt;/td&gt;&#xD;
&lt;td&gt;42ms&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;XmlTextReader&lt;/td&gt;&#xD;
&lt;td&gt;23ms&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;Xml Linq&lt;/td&gt;&#xD;
&lt;td&gt;28ms&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;小结一下自己的认识，XmlDocument的操作基本按W3C的DOM操作方式，不过要将全部节点解析成对象加载到内存中，往往造成很大浪费。所以微软自己的编程规范也不推荐用它。这里由于读取了所有节点，可能因此性能和Navigator方式相差不大。在三种随机读取方式中，Xml Linq性能最高，只是方法名有点别扭。XmlTextReader方式是所谓的SAX，只读向前，无疑性能最高，不过实现上麻烦了不少，要比较精确的控制访问逻辑，也无法用匿名类存储数据。&lt;/p&gt;&#xD;
&lt;p&gt;.Net 3.5发布Xml Linq可以很好地取代前两种方式，通常情况下，最好用它。只有个别场合，如果对性能要求极高，或者读取Xml数据量太大不能一下子下载或读取到内存中，那就只好痛苦委身于XmlTextReader了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;转帖地址：&lt;a href="http://www.cnblogs.com/XmNotes/archive/2010/08/12/1796162.html"&gt;http://www.cnblogs.com/XmNotes/archive/2010/08/12/1796162.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jvstudio/aggbug/1797809.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jvstudio/archive/2010/08/12/1797809.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jvstudio/archive/2010/07/17/1779584.html</id><title type="text">使用c#生成gif动画验证码及给gif动画加上水印代码</title><summary type="text">using System;  using System.IO; using System.Web; using System.Drawing; //GIF验证码类 public class Validate {  //设置最少4位验证码 private byte TrueValidateCodeCount = 4;  public byte ValidateCodeCount { get  { r...</summary><published>2010-07-17T06:42:00Z</published><updated>2010-07-17T06:42:00Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jvstudio/archive/2010/07/17/1779584.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/archive/2010/07/17/1779584.html"/><content type="html">&lt;div&gt;&amp;nbsp;&amp;nbsp; using System;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  using System.IO;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using System.Web;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using System.Drawing;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //GIF验证码类&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Validate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //设置最少4位验证码&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private byte TrueValidateCodeCount = 4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  public byte ValidateCodeCount&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TrueValidateCodeCount;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //验证码至少为3位&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  if (value &amp;gt; 4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TrueValidateCodeCount =  value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected string  ValidateCode = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //是否消除锯齿&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool  FontTextRenderingHint = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //验证码字体&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public  string ValidateCodeFont = "Arial";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //验证码型号(像素)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  public float ValidateCodeSize = 13;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int ImageHeight =  23;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //定义验证码中所有的字符&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string AllChar =  "1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //获得随机四位数&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void  CreateValidate()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ValidateCode = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //将验证码中所有的字符保存在一个字符串数组中&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] CharArray =  AllChar.Split(',');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int Temp = -1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //生成一个随机对象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Random RandCode = new Random();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //根据验证码的位数循环&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; ValidateCodeCount;  i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //主要是防止生成相同的验证码&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  if (Temp != -1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //加入时间的刻度&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  RandCode = new Random(i * Temp * ((int)DateTime.Now.Ticks));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int t = RandCode.Next(35);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if  (Temp == t)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //相等的话重新生成&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  CreateValidate();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Temp = t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  ValidateCode += CharArray[Temp];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //错误检测,去除超过指定位数的验证码&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ValidateCode.Length &amp;gt;  TrueValidateCodeCount)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ValidateCode =  ValidateCode.Remove(TrueValidateCodeCount);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //生成一帧的BMP图象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void CreateImageBmp(out Bitmap  ImageFrame)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //获得验证码字符&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  char[] CodeCharArray = ValidateCode.ToCharArray(0, ValidateCodeCount);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //图像的宽度-与验证码的长度成一定比例&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int ImageWidth =  (int)(TrueValidateCodeCount * ValidateCodeSize * 1.3 + 4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //创建一个长20，宽iwidth的图像对象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ImageFrame = new  Bitmap(ImageWidth, ImageHeight);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //创建一个新绘图对象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Graphics ImageGraphics = Graphics.FromImage(ImageFrame);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //清除背景色，并填充背景色&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Note:Color.Transparent为透明&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  ImageGraphics.Clear(Color.White);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //绘图用的字体和字号&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Font CodeFont = new Font(ValidateCodeFont, ValidateCodeSize,  FontStyle.Bold);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //绘图用的刷子大小&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Brush  ImageBrush = new SolidBrush(Color.Red);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //字体高度计算&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  int FontHeight = (int)Math.Max(ImageHeight - ValidateCodeSize - 3, 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //创建随机对象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Random rand = new Random();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //开始随机安排字符的位置，并画到图像里&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt;  TrueValidateCodeCount; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //生成随机点，决定字符串的开始输出范围&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int[] FontCoordinate = new  int[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FontCoordinate[0] = (int)(i *  ValidateCodeSize + rand.Next(1)) + 3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  FontCoordinate[1] = rand.Next(FontHeight);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Point  FontDrawPoint = new Point(FontCoordinate[0], FontCoordinate[1]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //消除锯齿操作&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FontTextRenderingHint)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  ImageGraphics.TextRenderingHint =  System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ImageGraphics.TextRenderingHint =  System.Drawing.Text.TextRenderingHint.AntiAlias;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //格式化刷子属性-用指定的刷子、颜色等在指定的范围内画图&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  ImageGraphics.DrawString(CodeCharArray[i].ToString(), CodeFont,  ImageBrush, FontDrawPoint);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  ImageGraphics.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //处理生成的BMP&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  private void DisposeImageBmp(ref Bitmap ImageFrame)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //创建绘图对象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Graphics ImageGraphics =  Graphics.FromImage(ImageFrame);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //创建铅笔对象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Pen ImagePen = new Pen(Color.Red, 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //创建随机对象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Random rand = new Random();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //创建随机点&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Point[] RandPoint = new Point[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //随机画线&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  for (int i = 0; i &amp;lt; 15; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  RandPoint[0] = new Point(rand.Next(ImageFrame.Width),  rand.Next(ImageFrame.Height));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RandPoint[1] = new  Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  ImageGraphics.DrawLine(ImagePen, RandPoint[0], RandPoint[1]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ImageGraphics.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //创建GIF动画&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void CreateImageGif()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Bitmap ImageFrame;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Kissogram.Drawing.Gif.AnimatedGifEncoder GifPic = new  Kissogram.Drawing.Gif.AnimatedGifEncoder();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemoryStream  BmpMemory = new MemoryStream();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GifPic.Start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //确保视觉残留&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GifPic.SetDelay(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //-1:no  repeat,0:always repeat&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GifPic.SetRepeat(0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  for (int i = 0; i &amp;lt; 20; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //创建一帧的图像&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateImageBmp(out ImageFrame);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //生成随机线条&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DisposeImageBmp(ref ImageFrame);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //输出绘图,将图像保存到指定的流&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ImageFrame.Save(BmpMemory,  System.Drawing.Imaging.ImageFormat.Png);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  GifPic.AddFrame(Image.FromStream(BmpMemory));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  BmpMemory = new MemoryStream();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  GifPic.OutPut(ref BmpMemory);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  HttpContext.Current.Response.ClearContent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //配置输出类型&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  HttpContext.Current.Response.ContentType = "image/Gif";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //输出内容&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  HttpContext.Current.Response.BinaryWrite(BmpMemory.ToArray());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  BmpMemory.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BmpMemory.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //输出验证码&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void OutPutValidate(string  ValidateCodeSession)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateValidate();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  CreateImageGif();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //把生成的验证码输入到SESSION&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  HttpContext.Current.Session[ValidateCodeSession] = ValidateCode;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt; &lt;div&gt;//加水印的代码：&lt;/div&gt; &lt;div&gt;public static Bitmap  WaterMarkWithText(System.Drawing.Bitmap origialGif, string text,string  filePath) &lt;br /&gt;{ &lt;br /&gt;//用于存放桢 &lt;br /&gt;List&amp;lt;Frame&amp;gt; frames = new  List&amp;lt;Frame&amp;gt;(); &lt;br /&gt;//如果不是gif文件,直接返回原图像 &lt;br /&gt;if  (origialGif.RawFormat.Guid !=  System.Drawing.Imaging.ImageFormat.Gif.Guid) &lt;br /&gt;{ &lt;br /&gt;return  origialGif; &lt;br /&gt;} &lt;br /&gt;//如果该图像是gif文件 &lt;br /&gt;foreach (Guid guid in  origialGif.FrameDimensionsList) &lt;br /&gt;{ &lt;br /&gt;System.Drawing.Imaging.FrameDimension  frameDimension = new System.Drawing.Imaging.FrameDimension(guid); &lt;br /&gt;int  frameCount = origialGif.GetFrameCount(frameDimension); &lt;br /&gt;for (int i =  0; i &amp;lt; frameCount; i++) &lt;br /&gt;{ &lt;br /&gt;if  (origialGif.SelectActiveFrame(frameDimension, i) == 0) &lt;br /&gt;{ &lt;br /&gt;int  delay =  Convert.ToInt32(origialGif.GetPropertyItem(20736).Value.GetValue(i)); &lt;br /&gt;Image  img = Image.FromHbitmap(origialGif.GetHbitmap()); &lt;br /&gt;Font font = new  Font(new FontFamily("宋体"), 35.0f,FontStyle.Bold); &lt;br /&gt;Graphics g =  Graphics.FromImage(img); &lt;br /&gt;g.DrawString(text, font,  Brushes.BlanchedAlmond, new PointF(10.0f, 10.0f)); &lt;br /&gt;Frame frame = new  Frame(img, delay); &lt;br /&gt;frames.Add(frame); &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;Gif.Components.AnimatedGifEncoder  gif = new Gif.Components.AnimatedGifEncoder(); &lt;br /&gt;gif.Start(filePath);  &lt;br /&gt;gif.SetDelay(100); &lt;br /&gt;gif.SetRepeat(0); &lt;br /&gt;for (int i = 0; i &amp;lt;  frames.Count; i++) &lt;br /&gt;{ &lt;br /&gt;gif.AddFrame(frames[i].Image); &lt;br /&gt;} &lt;br /&gt;gif.Finish();  &lt;br /&gt;try &lt;br /&gt;{ &lt;br /&gt;Bitmap gifImg = (Bitmap)Bitmap.FromFile(filePath); &lt;br /&gt;return  gifImg; &lt;br /&gt;} &lt;br /&gt;catch &lt;br /&gt;{ &lt;br /&gt;return origialGif; &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;return  origialGif; &lt;br /&gt;}&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jvstudio/aggbug/1779584.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jvstudio/archive/2010/07/17/1779584.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jvstudio/archive/2010/07/13/1776425.html</id><title type="text">详解JQuery上传插件Uploadify</title><summary type="text">Uploadify是JQuery的一个上传插件，实现的效果非常不错，带进度显示。不过官方提供的实例时php版本的，本文将详细介绍 Uploadify在Aspnet中的使用。　　首先按下面的步骤来实现一个简单的上传功能。　　1 创建Web项目，命名为JQueryUploadDemo，从官网上下载最新的版本解压后添加到项目中。　　2 在项目中添加UploadHandler.ashx文件用来处理文件的上...</summary><published>2010-07-13T05:41:00Z</published><updated>2010-07-13T05:41:00Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jvstudio/archive/2010/07/13/1776425.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/archive/2010/07/13/1776425.html"/><content type="html">&lt;p&gt;Uploadify是JQuery的一个上传插件，实现的效果非常不错，带进度显示。不过官方提供的实例时php版本的，本文将详细介绍 Uploadify在Aspnet中的使用。&lt;/p&gt;&#xD;
&lt;p&gt;首先按下面的步骤来实现一个简单的上传功能。&lt;/p&gt;&#xD;
&lt;p&gt;1 创建Web项目，命名为JQueryUploadDemo，从官网上下载最新的版本解压后添加到项目中。&lt;/p&gt;&#xD;
&lt;p&gt;2 在项目中添加UploadHandler.ashx文件用来处理文件的上传。&lt;/p&gt;&#xD;
&lt;p&gt;3 在项目中添加UploadFile文件夹，用来存放上传的文件。&lt;/p&gt;&#xD;
&lt;p&gt;进行完上面三步后项目的基本结构如下图:&lt;/p&gt;&#xD;
&lt;p&gt;4 Default.aspx的html页的代码修改如下：&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt; &lt;br /&gt;&amp;lt;head runat="server"&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Uploadify&amp;lt;/title&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link href="JS/jquery.uploadify-v2.1.0/example/css/default.css" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rel="stylesheet" type="text/css" /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link href="JS/jquery.uploadify-v2.1.0/uploadify.css" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rel="stylesheet" type="text/css" /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; src="JS/jquery.uploadify-v2.1.0/jquery-1.3.2.min.js"&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; src="JS/jquery.uploadify-v2.1.0/swfobject.js"&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript" &lt;br /&gt;&amp;nbsp;&amp;nbsp; src="JS/jquery.uploadify-v2.1.0/jquery.uploadify.v2.1.0.min.js"&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(document).ready(function() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#uploadify").uploadify({ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'uploader': 'JS/jquery.uploadify-v2.1.0/uploadify.swf', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'script': 'UploadHandler.ashx', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'cancelImg': 'JS/jquery.uploadify-v2.1.0/cancel.png', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'folder': 'UploadFile', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'queueID': 'fileQueue', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'auto': false, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'multi': true &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;/head&amp;gt; &lt;br /&gt;&amp;lt;body&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="fileQueue"&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="file" name="uploadify" id="uploadify" /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="javascript:$('#uploadify').uploadifyUpload()"&amp;gt;上传&amp;lt;/a&amp;gt;|&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="javascript:$('#uploadify').uploadifyClearQueue()"&amp;gt;取消上传&amp;lt;/a&amp;amp; gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt; &lt;br /&gt;&amp;lt;/body&amp;gt; &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　5 UploadHandler类的ProcessRequest方法代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　public void ProcessRequest(HttpContext context) &lt;br /&gt;　　{ &lt;br /&gt;　　context.Response.ContentType = "text/plain"; &lt;br /&gt;　　context.Response.Charset = "utf-8"; &lt;br /&gt;　　HttpPostedFile file = context.Request.Files["Filedata"]; &lt;br /&gt;　　string uploadPath = &lt;br /&gt;　　HttpContext.Current.Server.MapPath(@context.Request["folder"])+"\\"; &lt;br /&gt;　　if (file != null) &lt;br /&gt;　　{ &lt;br /&gt;　　if (!Directory.Exists(uploadPath)) &lt;br /&gt;　　{ &lt;br /&gt;　　Directory.CreateDirectory(uploadPath); &lt;br /&gt;　　} &lt;br /&gt;　　file.SaveAs(uploadPath + file.FileName); &lt;br /&gt;　　//下面这句代码缺少的话，上传成功后上传队列的显示不会自动消失 &lt;br /&gt;　　context.Response.Write("1"); &lt;br /&gt;　　} &lt;br /&gt;　　else &lt;br /&gt;　　{ &lt;br /&gt;　　context.Response.Write("0"); &lt;br /&gt;　　} &lt;br /&gt;　　}&lt;/p&gt;&#xD;
&lt;p&gt;6 运行后效果如下图：&lt;/p&gt;&#xD;
&lt;p&gt;7 选择了两个文件后，点击上传，就可以看到UploadFile文件夹中会增加这两个文件。&lt;/p&gt;&#xD;
&lt;p&gt;上面简单地实现了一个上传的功能，依靠函数uploadify实现，uploadify函数的参数为json格式，可以对json对象的key 值的修改来进行自定义的设置，如multi设置为true或false来控制是否可以进行多文件上传，下面就来介绍下这些key值的意思：&lt;/p&gt;&#xD;
&lt;p&gt;uploader ： uploadify.swf 文件的相对路径，该swf文件是一个带有文字BROWSE的按钮，点击后淡出打开文件对话框，默认值：uploadify.swf。&lt;/p&gt;&#xD;
&lt;p&gt;script ： 后台处理程序的相对路径 。默认值：uploadify.php&lt;/p&gt;&#xD;
&lt;p&gt;checkScript ：用来判断上传选择的文件在服务器是否存在的后台处理程序的相对路径&lt;/p&gt;&#xD;
&lt;p&gt;fileDataName ：设置一个名字，在服务器处理程序中根据该名字来取上传文件的数据。默认为Filedata&lt;/p&gt;&#xD;
&lt;p&gt;method ： 提交方式Post 或Get 默认为Post&lt;/p&gt;&#xD;
&lt;p&gt;scriptAccess ：flash脚本文件的访问模式，如果在本地测试设置为always，默认值：sameDomain&lt;/p&gt;&#xD;
&lt;p&gt;folder ： 上传文件存放的目录 。&lt;/p&gt;&#xD;
&lt;p&gt;queueID ： 文件队列的ID，该ID与存放文件队列的div的ID一致。&lt;/p&gt;&#xD;
&lt;p&gt;queueSizeLimit ： 当允许多文件生成时，设置选择文件的个数，默认值：999 。&lt;/p&gt;&#xD;
&lt;p&gt;multi ： 设置为true时可以上传多个文件。&lt;/p&gt;&#xD;
&lt;p&gt;auto ： 设置为true当选择文件后就直接上传了，为false需要点击上传按钮才上传 。&lt;/p&gt;&#xD;
&lt;p&gt;fileDesc ： 这个属性值必须设置fileExt属性后才有效，用来设置选择文件对话框中的提示文本，如设置fileDesc为&amp;#8220;请选择rar doc pdf文件&amp;#8221;，打开文件选择框效果如下图：&lt;/p&gt;&#xD;
&lt;p&gt;fileExt ： 设置可以选择的文件的类型，格式如：'*.doc;*.pdf;*.rar' 。&lt;/p&gt;&#xD;
&lt;p&gt;sizeLimit ： 上传文件的大小限制 。&lt;/p&gt;&#xD;
&lt;p&gt;simUploadLimit ： 允许同时上传的个数 默认值：1 。&lt;/p&gt;&#xD;
&lt;p&gt;buttonText ： 浏览按钮的文本，默认值：BROWSE 。&lt;/p&gt;&#xD;
&lt;p&gt;buttonImg ： 浏览按钮的图片的路径 。&lt;/p&gt;&#xD;
&lt;p&gt;hideButton ： 设置为true则隐藏浏览按钮的图片 。&lt;/p&gt;&#xD;
&lt;p&gt;rollover ： 值为true和false，设置为true时当鼠标移到浏览按钮上时有反转效果。&lt;/p&gt;&#xD;
&lt;p&gt;width ： 设置浏览按钮的宽度 ，默认值：110。&lt;/p&gt;&#xD;
&lt;p&gt;height ： 设置浏览按钮的高度 ，默认值：30。&lt;/p&gt;&#xD;
&lt;p&gt;wmode ： 设置该项为transparent 可以使浏览按钮的flash背景文件透明，并且flash文件会被置为页面的最高层。 默认值：opaque 。&lt;/p&gt;&#xD;
&lt;p&gt;cancelImg ：选择文件到文件队列中后的每一个文件上的关闭按钮图标，如下图：&lt;/p&gt;&#xD;
&lt;p&gt;上面介绍的key值的value都为字符串或是布尔类型，比较简单，接下来要介绍的key值的value为一个函数，可以在选择文件、出错或其他一些操作的时候返回一些信息给用户。&lt;/p&gt;&#xD;
&lt;p&gt;onInit : 做一些初始化的工作。&lt;/p&gt;&#xD;
&lt;p&gt;onSelect ：选择文件时触发，该函数有三个参数&lt;/p&gt;&#xD;
&lt;p&gt;event:事件对象。&lt;/p&gt;&#xD;
&lt;p&gt;queueID：文件的唯一标识，由6为随机字符组成。&lt;/p&gt;&#xD;
&lt;p&gt;fileObj：选择的文件对象，有name、size、creationDate、modificationDate、type 5个属性。&lt;/p&gt;&#xD;
&lt;p&gt;代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　$(document).ready(function() &lt;br /&gt;　　{ &lt;br /&gt;　　$("#uploadify").uploadify({ &lt;br /&gt;　　'uploader': 'JS/jquery.uploadify-v2.1.0/uploadify.swf', &lt;br /&gt;　　'script': 'UploadHandler.ashx', &lt;br /&gt;　　'cancelImg': 'JS/jquery.uploadify-v2.1.0/cancel.png', &lt;br /&gt;　　'folder': 'UploadFile', &lt;br /&gt;　　'queueID': 'fileQueue', &lt;br /&gt;　　'auto': false, &lt;br /&gt;　　'multi': true, &lt;br /&gt;　　'onInit':function(){alert("1");}, &lt;br /&gt;　　'onSelect': function(e, queueId, fileObj) &lt;br /&gt;　　{ &lt;br /&gt;　　alert("唯一标识:" + queueId + "\r\n" + &lt;br /&gt;　　"文件名：" + fileObj.name + "\r\n" + &lt;br /&gt;　　"文件大小：" + fileObj.size + "\r\n" + &lt;br /&gt;　　"创建时间：" + fileObj.creationDate + "\r\n" + &lt;br /&gt;　　"最后修改时间：" + fileObj.modificationDate + "\r\n" + &lt;br /&gt;　　"文件类型：" + fileObj.type &lt;br /&gt;　　); &lt;br /&gt;　　} &lt;br /&gt;　　}); &lt;br /&gt;　　});&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当选择一个文件后弹出的消息如下图：&lt;/p&gt;&#xD;
&lt;p&gt;onSelectOnce ：在单文件或多文件上传时，选择文件时触发。该函数有两个参数event，data，data对象有以下几个属性：&lt;/p&gt;&#xD;
&lt;p&gt;fileCount：选择文件的总数。&lt;/p&gt;&#xD;
&lt;p&gt;filesSelected：同时选择文件的个数，如果一次选择了3个文件该属性值为3。&lt;/p&gt;&#xD;
&lt;p&gt;filesReplaced：如果文件队列中已经存在A和B两个文件，再次选择文件时又选择了A和B，该属性值为2。&lt;/p&gt;&#xD;
&lt;p&gt;allBytesTotal：所有选择的文件的总大小。&lt;/p&gt;&#xD;
&lt;p&gt;onCancel : 当点击文件队列中文件的关闭按钮或点击取消上传时触发。该函数有event、queueId、fileObj、data四个参数，前三个参数同 onSelect 中的三个参数，data对象有两个属性fileCount和allBytesTotal。&lt;/p&gt;&#xD;
&lt;p&gt;fileCount：取消一个文件后，文件队列中剩余文件的个数。&lt;/p&gt;&#xD;
&lt;p&gt;allBytesTotal：取消一个文件后，文件队列中剩余文件的大小。&lt;/p&gt;&#xD;
&lt;p&gt;onClearQueue ：当调用函数fileUploadClearQueue时触发。有event和data两个参数，同onCancel 中的两个对应参数。&lt;/p&gt;&#xD;
&lt;p&gt;onQueueFull ：当设置了queueSizeLimit并且选择的文件个数超出了queueSizeLimit的值时触发。该函数有两个参数event和 queueSizeLimit。&lt;/p&gt;&#xD;
&lt;p&gt;onError ：当上传过程中发生错误时触发。该函数有event、queueId、fileObj、errorObj四个参数，其中前三个参数同上，errorObj 对象有type和info两个属性。&lt;/p&gt;&#xD;
&lt;p&gt;type：错误的类型，有三种&amp;#8216;HTTP&amp;#8217;, &amp;#8216;IO&amp;#8217;, or &amp;#8216;Security&amp;#8217;&lt;/p&gt;&#xD;
&lt;p&gt;info：错误的描述&lt;/p&gt;&#xD;
&lt;p&gt;onOpen ：点击上传时触发，如果auto设置为true则是选择文件时触发，如果有多个文件上传则遍历整个文件队列。该函数有event、queueId、 fileObj三个参数，参数的解释同上。&lt;/p&gt;&#xD;
&lt;p&gt;onProgress ：点击上传时触发，如果auto设置为true则是选择文件时触发，如果有多个文件上传则遍历整个文件队列，在onOpen之后触发。该函数有 event、queueId、fileObj、data四个参数，前三个参数的解释同上。data对象有四个属性percentage、 bytesLoaded、allBytesLoaded、speed：&lt;/p&gt;&#xD;
&lt;p&gt;percentage：当前完成的百分比&lt;/p&gt;&#xD;
&lt;p&gt;bytesLoaded：当前上传的大小&lt;/p&gt;&#xD;
&lt;p&gt;allBytesLoaded：文件队列中已经上传完的大小&lt;/p&gt;&#xD;
&lt;p&gt;speed：上传速率 kb/s&lt;/p&gt;&#xD;
&lt;p&gt;onComplete：文件上传完成后触发。该函数有四个参数event、queueId、fileObj、response、data五个参数，前三个参数同上。response为后台处理程序返回的值，在上面的例子中为1或0，data有两个属性fileCount和speed&lt;/p&gt;&#xD;
&lt;p&gt;fileCount：剩余没有上传完成的文件的个数。&lt;/p&gt;&#xD;
&lt;p&gt;speed：文件上传的平均速率 kb/s&lt;/p&gt;&#xD;
&lt;p&gt;onAllComplete：文件队列中所有的文件上传完成后触发。该函数有event和data两个参数，data有四个属性，分别为：&lt;/p&gt;&#xD;
&lt;p&gt;filesUploaded :上传的所有文件个数。&lt;/p&gt;&#xD;
&lt;p&gt;errors ：出现错误的个数。&lt;/p&gt;&#xD;
&lt;p&gt;allBytesLoaded ：所有上传文件的总大小。&lt;/p&gt;&#xD;
&lt;p&gt;speed ：平均上传速率 kb/s&lt;/p&gt;&#xD;
&lt;p&gt;相关函数介绍&lt;/p&gt;&#xD;
&lt;p&gt;在上面的例子中已经用了uploadifyUpload和uploadifyClearQueue两个函数，除此之外还有几个函数：&lt;/p&gt;&#xD;
&lt;p&gt;uploadifySettings：可以动态修改上面介绍的那些key值，如下面代码：&lt;/p&gt;&#xD;
&lt;p&gt;$('#uploadify').uploadifySettings('folder','JS');如果上传按钮的事件写成下面这样，文件将会上传到uploadifySettings定义的目录中&lt;/p&gt;&#xD;
&lt;p&gt;上传uploadifyCancel：该函数接受一个queueID作为参数，可以取消文件队列中指定queueID的文件。&lt;/p&gt;&#xD;
&lt;p&gt;$('#uploadify').uploadifyCancel(id);花了一个晚上，终于写完了，对JQuery这个上传插件也基本了解了，希望对大家有所帮助，不对之处还望大家指正&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jvstudio/aggbug/1776425.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jvstudio/archive/2010/07/13/1776425.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jvstudio/archive/2010/07/13/1776421.html</id><title type="text">提高ASP.NET首页性能的十大方法</title><summary type="text">前言本文是我对ASP.NET页面载入速度提高的一些做法，这些做法分为以下部分：1.采用 HTTP Module 控制页面的生命周期。2.自定义Response.Filter得到输出流stream生成动态页面的静态内容(磁盘缓存)。3.页面GZIP压缩。4.OutputCache 编程方式输出页面缓存。5.删除页面空白字符串。（类似Google）6.完全删除ViewState。7.删除服务器控件生成...</summary><published>2010-07-13T05:40:00Z</published><updated>2010-07-13T05:40:00Z</updated><author><name>JV Studio</name><uri>http://www.cnblogs.com/jvstudio/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jvstudio/archive/2010/07/13/1776421.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jvstudio/archive/2010/07/13/1776421.html"/><content type="html">&lt;p&gt;前言&lt;/p&gt;&#xD;
&lt;p&gt;本文是我对ASP.NET页面载入速度提高的一些做法，这些做法分为以下部分：&lt;/p&gt;&#xD;
&lt;p&gt;1.采用 HTTP Module 控制页面的生命周期。&lt;/p&gt;&#xD;
&lt;p&gt;2.自定义Response.Filter得到输出流stream生成动态页面的静态内容(磁盘缓存)。&lt;/p&gt;&#xD;
&lt;p&gt;3.页面GZIP压缩。&lt;/p&gt;&#xD;
&lt;p&gt;4.OutputCache 编程方式输出页面缓存。&lt;/p&gt;&#xD;
&lt;p&gt;5.删除页面空白字符串。（类似Google）&lt;/p&gt;&#xD;
&lt;p&gt;6.完全删除ViewState。&lt;/p&gt;&#xD;
&lt;p&gt;7.删除服务器控件生成的垃圾NamingContainer。&lt;/p&gt;&#xD;
&lt;p&gt;8.使用计划任务按时生成页面。（本文不包含该做法的实现）&lt;/p&gt;&#xD;
&lt;p&gt;9.JS，CSS压缩、合并、缓存，图片缓存。（限于文章篇幅，本文不包含该做法的实现）&lt;/p&gt;&#xD;
&lt;p&gt;10.缓存破坏。（不包含第9做法的实现）&lt;/p&gt;&#xD;
&lt;p&gt;针对上述做法，我们首先需要一个 HTTP 模块，它是整个页面流程的入口和核心。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;一、自定义Response.Filter得到输出流stream生成动态页面的静态内容(磁盘缓存)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如下的代码我们可以看出，我们以 request.RawUrl 为缓存基础，因为它可以包含任意的QueryString变量，然后我们用MD5加密RawUrl 得到服务器本地文件名的变量，再实例化一个FileInfo操作该文件，如果文件最后一次生成时间小于7天，我们就使用.Net2.0新增的 TransmitFile方法将存储文件的静态内容发送到浏览器。如果文件不存在，我们就操作 response.Filter 得到的 Stream 传递给 CommonFilter 类，并利用FileStream写入动态页面的内容到静态文件中。&lt;/p&gt;&lt;pre&gt;&lt;ol &gt;&lt;li &gt;&lt;span &gt;namespace&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;ASPNET_CL.Code.HttpModules&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;CommonModule&amp;nbsp;:&amp;nbsp;IHttpModule&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;Init(&amp;nbsp;HttpApplication&amp;nbsp;application&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;application.BeginRequest&amp;nbsp;+=&amp;nbsp;Application_BeginRequest; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;Application_BeginRequest(&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;context&amp;nbsp;=&amp;nbsp;HttpContext.Current; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;request&amp;nbsp;=&amp;nbsp;context.Request; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;url&amp;nbsp;=&amp;nbsp;request.RawUrl; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;response&amp;nbsp;=&amp;nbsp;context.Response; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;path&amp;nbsp;=&amp;nbsp;GetPath(&amp;nbsp;url&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;file&amp;nbsp;=&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;FileInfo(&amp;nbsp;path&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;(&amp;nbsp;DateTime.Now.Subtract(&amp;nbsp;file.LastWriteTime&amp;nbsp;).TotalDays&amp;nbsp;&amp;lt;&amp;nbsp;7&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.TransmitFile(&amp;nbsp;path&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.End(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;try&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;stream&amp;nbsp;=&amp;nbsp;file.OpenWrite(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.Filter&amp;nbsp;=&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;CommonFilter(&amp;nbsp;response.Filter,&amp;nbsp;stream&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;catch&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;(&amp;nbsp;Exception&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//Log.Insert(""); &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;Dispose()&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;static&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;GetPath(&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;url&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;hash&amp;nbsp;=&amp;nbsp;Hash(&amp;nbsp;url&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;fold&amp;nbsp;=&amp;nbsp;HttpContext.Current.Server.MapPath(&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;"~/Temp/"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;.Concat(&amp;nbsp;fold,&amp;nbsp;hash&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;static&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;Hash(&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;url&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;url.ToUpperInvariant(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;md5&amp;nbsp;=&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;System.Security.Cryptography.MD5CryptoServiceProvider(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;bs&amp;nbsp;=&amp;nbsp;md5.ComputeHash(&amp;nbsp;Encoding.ASCII.GetBytes(&amp;nbsp;url&amp;nbsp;)&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;s&amp;nbsp;=&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;StringBuilder(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;foreach&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;(&amp;nbsp;var&amp;nbsp;b&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;in&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;bs&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s.Append(&amp;nbsp;b.ToString(&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;"x2"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;).ToLower()&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;s.ToString(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;二、页面GZIP压缩&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对页面GZIP压缩几乎是每篇讲解高性能WEB程序的几大做法之一，因为使用GZIP压缩可以降低服务器发送的字节数，能让客户感觉到网页的速度更快也减少了对带宽的使用情况。当然，这里也存在客户端的浏览器是否支持它。因此，我们要做的是，如果客户端支持GZIP，我们就发送GZIP压缩过的内容，如果不支持，我们直接发送静态文件的内容。幸运的是，现代浏览器IE6.7.8.0，火狐等都支持GZIP。&lt;/p&gt;&#xD;
&lt;p&gt;为了实现这个功能，我们需要改写上面的 Application_BeginRequest 事件：&lt;/p&gt;&lt;pre&gt;&lt;ol &gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Application_BeginRequest(&amp;nbsp;&lt;/span&gt;&lt;span &gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;context&amp;nbsp;=&amp;nbsp;HttpContext.Current; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;request&amp;nbsp;=&amp;nbsp;context.Request; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;url&amp;nbsp;=&amp;nbsp;request.RawUrl; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;response&amp;nbsp;=&amp;nbsp;context.Response; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;path&amp;nbsp;=&amp;nbsp;GetPath(&amp;nbsp;url&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;file&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;FileInfo(&amp;nbsp;path&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;使用页面压缩 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ResponseCompressionType&amp;nbsp;compressionType&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.GetCompressionMode(&amp;nbsp;request&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;compressionType&amp;nbsp;!=&amp;nbsp;ResponseCompressionType.None&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.AppendHeader(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"Content-Encoding"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;compressionType.ToString().ToLower()&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;compressionType&amp;nbsp;==&amp;nbsp;ResponseCompressionType.GZip&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.Filter&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;GZipStream(&amp;nbsp;response.Filter,&amp;nbsp;CompressionMode.Compress&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.Filter&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;DeflateStream(&amp;nbsp;response.Filter,&amp;nbsp;CompressionMode.Compress&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;DateTime.Now.Subtract(&amp;nbsp;file.LastWriteTime&amp;nbsp;).TotalMinutes&amp;nbsp;&amp;lt;&amp;nbsp;5&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.TransmitFile(&amp;nbsp;path&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.End(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;return&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;try&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;stream&amp;nbsp;=&amp;nbsp;file.OpenWrite(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.Filter&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;CommonFilter(&amp;nbsp;response.Filter,&amp;nbsp;stream&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;catch&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;Exception&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;//Log.Insert(""); &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;ResponseCompressionType&amp;nbsp;GetCompressionMode(&amp;nbsp;HttpRequest&amp;nbsp;request&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;acceptEncoding&amp;nbsp;=&amp;nbsp;request.Headers[&amp;nbsp;&lt;/span&gt;&lt;span &gt;"Accept-Encoding"&lt;/span&gt;&lt;span&gt;&amp;nbsp;]; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;.IsNullOrEmpty(&amp;nbsp;acceptEncoding&amp;nbsp;)&amp;nbsp;) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;ResponseCompressionType.None; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acceptEncoding&amp;nbsp;=&amp;nbsp;acceptEncoding.ToUpperInvariant(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;acceptEncoding.Contains(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"GZIP"&lt;/span&gt;&lt;span&gt;&amp;nbsp;)&amp;nbsp;) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;ResponseCompressionType.GZip; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;acceptEncoding.Contains(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"DEFLATE"&lt;/span&gt;&lt;span&gt;&amp;nbsp;)&amp;nbsp;) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;ResponseCompressionType.Deflate; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;ResponseCompressionType.None; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;enum&lt;/span&gt;&lt;span&gt;&amp;nbsp;ResponseCompressionType&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;None, &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GZip, &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Deflate &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;三、OutputCache 编程方式输出页面缓存&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ASP.NET内置的 OutputCache 缓存可以将内容缓存在三个地方：Web服务器、代理服务器和浏览器。当用户访问一个被设置为 OutputCache的页面时，ASP.NET在MSIL之后，先将结果写入output cache缓存，然后在发送到浏览器，当用户访问同一路径的页面时，ASP.NET将直接发送被Cache的内容，而不经过.aspx编译以及执行 MSIL的过程，所以，虽然程序的本身效率没有提升，但是页面载入速度却得到了提升。&lt;/p&gt;&#xD;
&lt;p&gt;为了实现这个功能，我们继续改写上面的 Application_BeginRequest 事件，我们在 TransmitFile 后，将这个路径的页面以OutputCache编程的方式缓存起来：&lt;/p&gt;&lt;pre&gt;&lt;ol &gt;&lt;li &gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Application_BeginRequest(&amp;nbsp;&lt;/span&gt;&lt;span &gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//............. &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;DateTime.Now.Subtract(&amp;nbsp;file.LastWriteTime&amp;nbsp;).TotalMinutes&amp;nbsp;&amp;lt;&amp;nbsp;5&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.TransmitFile(&amp;nbsp;path&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;添加&amp;nbsp;OutputCache&amp;nbsp;缓存头，并缓存在客户端 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.Cache.SetExpires(&amp;nbsp;DateTime.Now.AddMinutes(&amp;nbsp;5&amp;nbsp;)&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.Cache.SetCacheability(&amp;nbsp;HttpCacheability.Public&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.End(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//............ &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;四、实现CommonFilter类过滤ViewState、过滤NamingContainer、空白字符串，以及生成磁盘的缓存文件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们传入response.Filter的Stream对象给CommonFilter类：&lt;/p&gt;&#xD;
&lt;p&gt;首先，我们用先Stream的Write方法实现生成磁盘的缓存文件，代码如下，在这些代码中，只有初始化构造函数，Write方法，Close方式是有用的，其中FileStream字段是生成静态文件的操作对象：&lt;/p&gt;&lt;pre&gt;&lt;ol &gt;&lt;li &gt;&lt;span &gt;namespace&lt;/span&gt;&lt;span&gt;&amp;nbsp;ASPNET_CL.Code.HttpModules&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;CommonFilter&amp;nbsp;:&amp;nbsp;Stream&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;readonly&lt;/span&gt;&lt;span&gt;&amp;nbsp;Stream&amp;nbsp;_responseStream; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;readonly&lt;/span&gt;&lt;span&gt;&amp;nbsp;FileStream&amp;nbsp;_cacheStream; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;CanRead&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;CanSeek&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;CanWrite&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;_responseStream.CanWrite; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;Length&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;throw&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;NotSupportedException(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;Position&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;throw&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;NotSupportedException(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;throw&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;NotSupportedException(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;CommonFilter(&amp;nbsp;Stream&amp;nbsp;responseStream,&amp;nbsp;FileStream&amp;nbsp;stream&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_responseStream&amp;nbsp;=&amp;nbsp;responseStream; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_cacheStream&amp;nbsp;=&amp;nbsp;stream; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;Seek(&amp;nbsp;&lt;/span&gt;&lt;span &gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;offset,&amp;nbsp;SeekOrigin&amp;nbsp;origin&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;throw&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;NotSupportedException(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;SetLength(&amp;nbsp;&lt;/span&gt;&lt;span &gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;length&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;throw&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;NotSupportedException(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;Read(&amp;nbsp;&lt;/span&gt;&lt;span &gt;byte&lt;/span&gt;&lt;span&gt;[]&amp;nbsp;buffer,&amp;nbsp;&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;offset,&amp;nbsp;&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;count&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;throw&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;NotSupportedException(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Flush()&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_responseStream.Flush(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_cacheStream.Flush(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Write(&amp;nbsp;&lt;/span&gt;&lt;span &gt;byte&lt;/span&gt;&lt;span&gt;[]&amp;nbsp;buffer,&amp;nbsp;&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;offset,&amp;nbsp;&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;count&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_cacheStream.Write(&amp;nbsp;buffer,&amp;nbsp;offset,&amp;nbsp;count&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_responseStream.Write(&amp;nbsp;buffer,&amp;nbsp;offset,&amp;nbsp;count&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Close()&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_responseStream.Close(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_cacheStream.Close(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &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 &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Dispose(&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;disposing&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;disposing&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_responseStream.Dispose(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_cacheStream.Dispose(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;然后我们利用正则完全删除ViewState：&lt;/p&gt;&lt;pre&gt;&lt;ol &gt;&lt;li &gt;&lt;span &gt;//&amp;nbsp;过滤ViewState &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;ViewStateFilter(&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;strHTML&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;matchString1&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;"type=\"hidden\"&amp;nbsp;name=\"__VIEWSTATE\"&amp;nbsp;id=\"__VIEWSTATE\""&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;matchString2&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;"type=\"hidden\"&amp;nbsp;name=\"__EVENTVALIDATION\"&amp;nbsp;id=\"__EVENTVALIDATION\""&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;matchString3&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;"type=\"hidden\"&amp;nbsp;name=\"__EVENTTARGET\"&amp;nbsp;id=\"__EVENTTARGET\""&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;matchString4&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;"type=\"hidden\"&amp;nbsp;name=\"__EVENTARGUMENT\"&amp;nbsp;id=\"__EVENTARGUMENT\""&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;positiveLookahead1&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;"(?=.*("&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;Regex.Escape(&amp;nbsp;matchString1&amp;nbsp;)&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"))"&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;positiveLookahead2&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;"(?=.*("&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;Regex.Escape(&amp;nbsp;matchString2&amp;nbsp;)&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"))"&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;positiveLookahead3&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;"(?=.*("&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;Regex.Escape(&amp;nbsp;matchString3&amp;nbsp;)&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"))"&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;positiveLookahead4&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;"(?=.*("&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;Regex.Escape(&amp;nbsp;matchString4&amp;nbsp;)&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"))"&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegexOptions&amp;nbsp;opt&amp;nbsp;=&amp;nbsp;RegexOptions.IgnoreCase&amp;nbsp;|&amp;nbsp;RegexOptions.Singleline&amp;nbsp;|&amp;nbsp;RegexOptions.CultureInvariant&amp;nbsp;|&amp;nbsp;RegexOptions.Compiled; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Regex[]&amp;nbsp;arrRe&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex[]&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&lt;/span&gt;&lt;span &gt;"\\s*&amp;lt;div&amp;gt;"&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;positiveLookahead1&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"(.*?)&amp;lt;/div&amp;gt;\\s*"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;opt), &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&lt;/span&gt;&lt;span &gt;"\\s*&amp;lt;div&amp;gt;"&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;positiveLookahead2&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"(.*?)&amp;lt;/div&amp;gt;\\s*"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;opt), &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&lt;/span&gt;&lt;span &gt;"\\s*&amp;lt;div&amp;gt;"&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;positiveLookahead3&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"(.*?)&amp;lt;/div&amp;gt;\\s*"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;opt), &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&lt;/span&gt;&lt;span &gt;"\\s*&amp;lt;div&amp;gt;"&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;positiveLookahead3&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"(.*?)&amp;lt;/div&amp;gt;\\s*"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;opt), &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&lt;/span&gt;&lt;span &gt;"\\s*&amp;lt;div&amp;gt;"&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;positiveLookahead4&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"(.*?)&amp;lt;/div&amp;gt;\\s*"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;opt) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;foreach&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;Regex&amp;nbsp;re&amp;nbsp;&lt;/span&gt;&lt;span &gt;in&lt;/span&gt;&lt;span&gt;&amp;nbsp;arrRe&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strHTML&amp;nbsp;=&amp;nbsp;re.Replace(&amp;nbsp;strHTML,&amp;nbsp;&lt;/span&gt;&lt;span &gt;""&lt;/span&gt;&lt;span&gt;&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;strHTML; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;以下是删除页面空白的方法：&lt;/p&gt;&lt;pre&gt;&lt;ol &gt;&lt;li &gt;&lt;span &gt;//&amp;nbsp;删除空白 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex&amp;nbsp;tabsRe&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"\\t"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;RegexOptions.Compiled&amp;nbsp;|&amp;nbsp;RegexOptions.Multiline&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex&amp;nbsp;carriageReturnRe&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"&amp;gt;\\r\\n&amp;lt;"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;RegexOptions.Compiled&amp;nbsp;|&amp;nbsp;RegexOptions.Multiline&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex&amp;nbsp;carriageReturnSafeRe&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"\\r\\n"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;RegexOptions.Compiled&amp;nbsp;|&amp;nbsp;RegexOptions.Multiline&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex&amp;nbsp;multipleSpaces&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"&amp;nbsp;&amp;nbsp;"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;RegexOptions.Compiled&amp;nbsp;|&amp;nbsp;RegexOptions.Multiline&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex&amp;nbsp;spaceBetweenTags&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"&amp;gt;\\s&amp;lt;"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;RegexOptions.Compiled&amp;nbsp;|&amp;nbsp;RegexOptions.Multiline&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;WhitespaceFilter(&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;html&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;tabsRe.Replace(&amp;nbsp;html,&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;.Empty&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;carriageReturnRe.Replace(&amp;nbsp;html,&amp;nbsp;&lt;/span&gt;&lt;span &gt;"&amp;gt;&amp;lt;"&lt;/span&gt;&lt;span&gt;&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;carriageReturnSafeRe.Replace(&amp;nbsp;html,&amp;nbsp;&lt;/span&gt;&lt;span &gt;"&amp;nbsp;"&lt;/span&gt;&lt;span&gt;&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;multipleSpaces.IsMatch(&amp;nbsp;html&amp;nbsp;)&amp;nbsp;) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;multipleSpaces.Replace(&amp;nbsp;html,&amp;nbsp;&lt;/span&gt;&lt;span &gt;"&amp;nbsp;"&lt;/span&gt;&lt;span&gt;&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;spaceBetweenTags.Replace(&amp;nbsp;html,&amp;nbsp;&lt;/span&gt;&lt;span &gt;"&amp;gt;&amp;lt;"&lt;/span&gt;&lt;span&gt;&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;html.Replace(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"//&amp;lt;![CDATA["&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span &gt;""&lt;/span&gt;&lt;span&gt;&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;html.Replace(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"//]]&amp;gt;"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span &gt;""&lt;/span&gt;&lt;span&gt;&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;html; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;以下是删除ASP.NET控件的垃圾UniqueID名称方法：&lt;/p&gt;&lt;pre&gt;&lt;ol &gt;&lt;li &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 &gt;//&amp;nbsp;过滤NamingContainer &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;NamingContainerFilter(&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;html&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegexOptions&amp;nbsp;opt&amp;nbsp;= &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegexOptions.IgnoreCase&amp;nbsp;| &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegexOptions.Singleline&amp;nbsp;| &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegexOptions.CultureInvariant&amp;nbsp;| &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegexOptions.Compiled; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Regex&amp;nbsp;re&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Regex(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"(&amp;nbsp;name=\")(?=.*("&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;Regex.Escape(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"$"&lt;/span&gt;&lt;span&gt;&amp;nbsp;)&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"))([^\"]+?)(\")"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;opt&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;html&amp;nbsp;=&amp;nbsp;re.Replace(&amp;nbsp;html,&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;MatchEvaluator(&amp;nbsp;&lt;/span&gt;&lt;span &gt;delegate&lt;/span&gt;&lt;span&gt;(&amp;nbsp;Match&amp;nbsp;m&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;lastDollarSignIndex&amp;nbsp;=&amp;nbsp;m.Value.LastIndexOf(&amp;nbsp;&lt;/span&gt;&lt;span &gt;'$'&lt;/span&gt;&lt;span&gt;&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;lastDollarSignIndex&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;m.Groups[&amp;nbsp;1&amp;nbsp;].Value&amp;nbsp;+&amp;nbsp;m.Value.Substring(&amp;nbsp;lastDollarSignIndex&amp;nbsp;+&amp;nbsp;1&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;m.Value; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;)&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;html; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;最后，我们把以上过滤方法整合到CommonFilter类的Write方法：&lt;/p&gt;&lt;pre&gt;&lt;ol &gt;&lt;li &gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Write(&amp;nbsp;&lt;/span&gt;&lt;span &gt;byte&lt;/span&gt;&lt;span&gt;[]&amp;nbsp;buffer,&amp;nbsp;&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;offset,&amp;nbsp;&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;count&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;转换buffer为字符串 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;byte&lt;/span&gt;&lt;span&gt;[]&amp;nbsp;data&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;byte&lt;/span&gt;&lt;span&gt;[&amp;nbsp;count&amp;nbsp;]; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Buffer.BlockCopy(&amp;nbsp;buffer,&amp;nbsp;offset,&amp;nbsp;data,&amp;nbsp;0,&amp;nbsp;count&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;System.Text.Encoding.UTF8.GetString(&amp;nbsp;buffer&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;// &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;以下整合过滤方法 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;// &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;NamingContainerFilter(&amp;nbsp;html&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;ViewStateFilter(&amp;nbsp;html&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;WhitespaceFilter(&amp;nbsp;html&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;byte&lt;/span&gt;&lt;span&gt;[]&amp;nbsp;outdata&amp;nbsp;=&amp;nbsp;System.Text.Encoding.UTF8.GetBytes(&amp;nbsp;html&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;写入磁盘 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_cacheStream.Write(&amp;nbsp;outdata,&amp;nbsp;0,&amp;nbsp;outdata.GetLength(&amp;nbsp;0&amp;nbsp;)&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_responseStream.Write(&amp;nbsp;outdata,&amp;nbsp;0,&amp;nbsp;outdata.GetLength(&amp;nbsp;0&amp;nbsp;)&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;五、缓存破坏&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;经过以上程序的实现，网页已经被高速缓存在客户端了，如果果用户访问网站被缓存过的页面，则页面会以0请求的速度加载页面。但是，如果后台更新了某些数据，前台用户则不能及时看到最新的数据，因此要改变这种情况，我们必须破坏缓存。根据我们如上的程序，我们破坏缓存只需要做2步：更新服务器上的临时文件，删除OutputCache过的页面。&lt;/p&gt;&#xD;
&lt;p&gt;更新服务器上的文件我们只需删除这个文件即可，当某一用户第一次访问该页面时会自动生成，当然，你也可以用程序先删除后生成：&lt;/p&gt;&lt;pre&gt;&lt;ol &gt;&lt;li &gt;&lt;span &gt;//&amp;nbsp;更新文件 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;foreach&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&amp;nbsp;var&amp;nbsp;file&amp;nbsp;&lt;/span&gt;&lt;span &gt;in&lt;/span&gt;&lt;span&gt;&amp;nbsp;Directory.GetFiles(&amp;nbsp;HttpRuntime.AppDomainAppPath&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"Temp"&lt;/span&gt;&lt;span&gt;&amp;nbsp;)&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File.Delete(&amp;nbsp;file&amp;nbsp;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;要删除OutputCache关联的缓存项，代码如下，我们只需要保证该方法的参数，指页面的绝对路径是正确的，路径不能使用../这样的相对路径：&lt;/p&gt;&lt;pre&gt;&lt;ol &gt;&lt;li &gt;&lt;span &gt;//&amp;nbsp;删除缓存 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;HttpResponse.RemoveOutputCacheItem(&amp;nbsp;&lt;/span&gt;&lt;span &gt;"/Default.aspx"&lt;/span&gt;&lt;span&gt;&amp;nbsp;);&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;到此，我们实现了针对一个页面的性能，重点是载入速度的提高的一些做法，希望对大家有用～！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jvstudio/aggbug/1776421.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jvstudio/archive/2010/07/13/1776421.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
