<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://ghj1976.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fghj1976.spaces.live.com%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>蝈蝈俊的共享空间</title><description /><link>http://ghj1976.spaces.live.com/</link><language>en-US</language><pubDate>Fri, 08 Aug 2008 23:48:06 GMT</pubDate><lastBuildDate>Fri, 08 Aug 2008 23:48:06 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><live:identity><live:id>1107058300674074913</live:id><live:alias>ghj1976</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>点燃主火炬的火炬手我猜是 “体操王子”李宁。 采用方式类似凌波微步或者叫凤回巢的方式飞过去。</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!306.entry</link><description>&lt;p&gt;写个非技术的。  &lt;p&gt;奥运会点燃主火炬的我猜是“体操王子”李宁。  &lt;p&gt;点火方式我猜会吊钢丝，类似中国功夫的凌波微步，或者叫凤回巢的方式飞过去。  &lt;p&gt;李宁的照片，看起来老了。  &lt;p&gt;&lt;img alt="" src="http://img1.qq.com/2008/pics/12150/12150370.jpg"&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+%e7%82%b9%e7%87%83%e4%b8%bb%e7%81%ab%e7%82%ac%e7%9a%84%e7%81%ab%e7%82%ac%e6%89%8b%e6%88%91%e7%8c%9c%e6%98%af+%e2%80%9c%e4%bd%93%e6%93%8d%e7%8e%8b%e5%ad%90%e2%80%9d%e6%9d%8e%e5%ae%81%e3%80%82+%e9%87%87%e7%94%a8%e6%96%b9%e5%bc%8f%e7%b1%bb%e4%bc%bc%e5%87%8c%e6%b3%a2%e5%be%ae%e6%ad%a5%e6%88%96%e8%80%85%e5%8f%ab%e5%87%a4%e5%9b%9e%e5%b7%a2%e7%9a%84%e6%96%b9%e5%bc%8f%e9%a3%9e%e8%bf%87%e5%8e%bb%e3%80%82&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><category>娱乐</category><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!306.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!306.entry</guid><pubDate>Thu, 07 Aug 2008 08:47:55 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!306/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!306.entry#comment</wfw:comment><dcterms:modified>2008-08-07T08:47:55Z</dcterms:modified></item><item><title>应用程序池 与 W3WP.exe 进程的对应关系</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!305.entry</link><description>&lt;p&gt;       阅读本博客前，建议阅读我前一篇博客：&lt;a href="http://blog.joycode.com/ghj/archive/2008/07/25/115200.aspx" target="_blank"&gt;IIS5、IIS6、IIS7的ASP.net 请求处理过程比较&lt;/a&gt;  这样知识会比较连贯。  &lt;p&gt;       对于 IIS6、IIS7，  每个应用程序池都会创建一个 W3WP.exe 进程。  但是， 并不是所有情况都是一个应用程序池对应一个 W3WP.exe 进程。 Web Garden ， 或者一些异常发生时候，就会一个 应用程序池对应多个 W3WP.exe 进程。  &lt;p&gt;   &lt;p&gt;       Web Garden 指的是一个应用程序可以在多个进程(w3wp.exe)中来执行，一次请求使用其中的一个。用这个的主要目的是提高程序的可用性。当其中一个进程发生错误，那么也不会影响其他进程。发生错误的进程可以根据规则关闭，而其他的进程则可以继续工作。  &lt;p&gt;       需要注意的是：一般使用 InProc HttpSessionState / HttpApplicationState / 静态变量来储存关键信息 的程序是不支持 Web Garden的。   &lt;p&gt;   &lt;p&gt;       由于应用程序池会在没有请求的时候定时回收，或者发生错误的时候，自动重新建立一个处理进程 W3WP.exe 进程。如果你中大运，你可能会看到没有配置 Web Garden 时， 一个应用程序池对应多个 W3WP.exe 进程， 如这篇文章中提到的 &lt;a title="http://www.eggheadcafe.com/forumarchives/inetserveriis/Feb2006/post25881024.asp" href="http://www.eggheadcafe.com/forumarchives/inetserveriis/Feb2006/post25881024.asp"&gt;http://www.eggheadcafe.com/forumarchives/inetserveriis/Feb2006/post25881024.asp&lt;/a&gt; 。  &lt;p&gt;          &lt;p&gt;IIS 6 （Win2003 ）中查看某个应用程序池对应那个 W3WP.exe 进程，可以使用如下命令，输出结果类似如下：   &lt;p&gt;C:\WINDOWS\system32&amp;gt;cscript iisapp.vbs    &lt;br&gt;Microsoft (R) Windows Script Host Version 5.6     &lt;br&gt;Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.     &lt;br&gt;W3WP.exe PID: 1172 AppPoolId: StsAdminAppPool     &lt;br&gt;W3WP.exe PID: 2656 AppPoolId: MSSharePointAppPool     &lt;br&gt;W3WP.exe PID: 2148 AppPoolId: WMS App Pool     &lt;br&gt;W3WP.exe PID: 3604 AppPoolId: defaultwebsite  &lt;p&gt;参看这篇博客： &lt;a title="http://blogs.msdn.com/jb/archive/2006/02/22/536693.aspx" href="http://blogs.msdn.com/jb/archive/2006/02/22/536693.aspx"&gt;http://blogs.msdn.com/jb/archive/2006/02/22/536693.aspx&lt;/a&gt;  &lt;p&gt;   &lt;p&gt;IIS 7 中则是如下命令，输出结果类似如下：    &lt;br&gt;    &lt;br&gt;&lt;strong&gt;C:\Windows\system32&amp;gt;%windir%/system32/inetsrv/appcmd list wp      &lt;br&gt;&lt;/strong&gt;WP “5716″ (applicationPool:DefaultAppPool)     &lt;br&gt;WP “968″ (applicationPool:MyOtherAppPool)     &lt;br&gt;WP “5836″ (applicationPool:TheThirdAppPool)  &lt;p&gt;参看： &lt;a title="http://dirk.net/2008/06/01/identify-which-w3wpexe-belongs-to-which-application-pool-in-iis7/" href="http://dirk.net/2008/06/01/identify-which-w3wpexe-belongs-to-which-application-pool-in-iis7/"&gt;http://dirk.net/2008/06/01/identify-which-w3wpexe-belongs-to-which-application-pool-in-iis7/&lt;/a&gt;  &lt;p&gt;   &lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;  &lt;p&gt;找出“w3wp.exe进程”对应的“应用程序池”    &lt;br&gt;&lt;a title="http://www.cnblogs.com/windpole/archive/2007/11/19/964819.html" href="http://www.cnblogs.com/windpole/archive/2007/11/19/964819.html"&gt;http://www.cnblogs.com/windpole/archive/2007/11/19/964819.html&lt;/a&gt;  &lt;p&gt;Which w3wp.exe process belongs to which App Pool in IIS6    &lt;br&gt;&lt;a title="http://weblogs.asp.net/owscott/archive/2004/09/21/Which-w3wp.exe-process-belongs-to-which-App-Pool-in-IIS6.aspx" href="http://weblogs.asp.net/owscott/archive/2004/09/21/Which-w3wp.exe-process-belongs-to-which-App-Pool-in-IIS6.aspx"&gt;http://weblogs.asp.net/owscott/archive/2004/09/21/Which-w3wp.exe-process-belongs-to-which-App-Pool-in-IIS6.aspx&lt;/a&gt;  &lt;p&gt;What Application Pool does this W3WP.EXE belong to?    &lt;br&gt;&lt;a title="http://blogs.msdn.com/jb/archive/2006/02/22/536693.aspx" href="http://blogs.msdn.com/jb/archive/2006/02/22/536693.aspx"&gt;http://blogs.msdn.com/jb/archive/2006/02/22/536693.aspx&lt;/a&gt;  &lt;p&gt;New in IIS 7 - App Pool Isolation    &lt;br&gt;&lt;a title="http://adopenstatic.com/cs/blogs/ken/archive/2008/01/29/15759.aspx" href="http://adopenstatic.com/cs/blogs/ken/archive/2008/01/29/15759.aspx"&gt;http://adopenstatic.com/cs/blogs/ken/archive/2008/01/29/15759.aspx&lt;/a&gt;  &lt;p&gt;对w3wp.exe的一点认识!    &lt;br&gt;&lt;a title="http://www.cnblogs.com/hjh1982/archive/2006/06/28/438032.html" href="http://www.cnblogs.com/hjh1982/archive/2006/06/28/438032.html"&gt;http://www.cnblogs.com/hjh1982/archive/2006/06/28/438032.html&lt;/a&gt;  &lt;p&gt;关于Web Garden与Web Farms    &lt;br&gt;&lt;a title="http://www.cnblogs.com/huashanlin/archive/2007/07/30/836652.html" href="http://www.cnblogs.com/huashanlin/archive/2007/07/30/836652.html"&gt;http://www.cnblogs.com/huashanlin/archive/2007/07/30/836652.html&lt;/a&gt;  &lt;p&gt;你的程序支持 IIS6 - Web Garden 吗?    &lt;br&gt;&lt;a title="http://blog.joycode.com/lostinet/archive/2005/02/02/44017.aspx" href="http://blog.joycode.com/lostinet/archive/2005/02/02/44017.aspx"&gt;http://blog.joycode.com/lostinet/archive/2005/02/02/44017.aspx&lt;/a&gt;  &lt;p&gt;Web Farm And Web Garden    &lt;br&gt;&lt;a title="http://www.cnblogs.com/kingclever/archive/2007/12/13/993152.html" href="http://www.cnblogs.com/kingclever/archive/2007/12/13/993152.html"&gt;http://www.cnblogs.com/kingclever/archive/2007/12/13/993152.html&lt;/a&gt;  &lt;p&gt;Identify which w3wp.exe belongs to which Application Pool in IIS7    &lt;br&gt;&lt;a title="http://dirk.net/2008/06/01/identify-which-w3wpexe-belongs-to-which-application-pool-in-iis7/" href="http://dirk.net/2008/06/01/identify-which-w3wpexe-belongs-to-which-application-pool-in-iis7/"&gt;http://dirk.net/2008/06/01/identify-which-w3wpexe-belongs-to-which-application-pool-in-iis7/&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e6%b1%a0+%e4%b8%8e+W3WP.exe+%e8%bf%9b%e7%a8%8b%e7%9a%84%e5%af%b9%e5%ba%94%e5%85%b3%e7%b3%bb&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!305.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!305.entry</guid><pubDate>Wed, 30 Jul 2008 01:43:48 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!305/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!305.entry#comment</wfw:comment><dcterms:modified>2008-07-30T01:43:48Z</dcterms:modified></item><item><title>IIS5、IIS6、IIS7的ASP.net 请求处理过程比较</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!302.entry</link><description>&lt;p&gt;ASP.NET是一个非常强大的构建Web应用的平台，它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用。    &lt;br&gt;绝大多数的人只熟悉高层的框架如： WebForms 和 WebServices --这些都在ASP.NET层次结构在最高层。  &lt;p&gt;这篇文章的资料收集整理自各种微软公开的文档，通过比较 IIS5、IIS6、IIS7 这三代 IIS 对请求的处理过程， 让我们熟悉 ASP.NET的底层机制 并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解。通过对底层机制的了解，可以让我们对 ASP.net 有更深的理解。  &lt;p&gt;&lt;strong&gt;IIS 5 的 ASP.net 请求处理过程&lt;/strong&gt;  &lt;p&gt;&lt;img src="http://blog.joycode.com/images/blog.joycode.com/ghj/1362/o_8001.gif"&gt;  &lt;p&gt;对图的解释：  &lt;p&gt;IIS 5.x 一个显著的特征就是 Web Server 和真正的 ASP.NET Application 的分离。作为 Web Server 的IIS运行在一个名为 InetInfo.exe 的进程上，InetInfo.exe 是一个Native Executive，并不是一个托管的程序，而我们真正的 ASP.NET Application 则是运行在一个叫做 aspnet_wp 的 Worker Process 上面，在该进程初始化的时候会加载CLR，所以这是一个托管的环境。  &lt;p&gt;ISAPI：  指能够处理各种后缀名的应用程序。 ISAPI 是下面单词的简写 ：Internet Server Application Programe Interface，互联网服务器应用程序接口。  &lt;p&gt;IIS 5 模式的特点：  &lt;p&gt;1、首先，同一台主机上在同一时间只能运行一个 aspnet_wp 进程，每个基于虚拟目录的 ASP.NET Application 对应一个 Application Domain ，也就是说每个 Application 都运行在同一个 Worker Process 中，Application之间的隔离是基于 Application Domain 的，而不是基于Process的。   &lt;p&gt;2、其次，ASP.NET  ISAPI 不但负责创建 aspnet_wp Worker Process，而且负责监控该进程，如果检测到 aspnet_wp 的 Performance 降低到某个设定的下限，ASP.NET  ISAPI 会负责结束掉该进程。当 aspnet_wp 结束掉之后，后续的 Request 会导致ASP.NET ISAPI 重新创建新的 aspnet_wp Worker Process。   &lt;p&gt;3、最后，由于 IIS 和 Application 运行在他们各自的进程中，他们之间的通信必须采用特定的通信机制。本质上 IIS 所在的 InetInfo 进程和 Worker Process 之间的通信是同一台机器不同进程的通信（local interprocess communications），处于Performance的考虑，他们之间采用基于Named pipe的通信机制。ASP.NET ISAPI和Worker Process之间的通信通过他们之间的一组Pipe实现。同样处于Performance的原因，ASP.NET ISAPI 通过异步的方式将Request 传到Worker Process 并获得 Response，但是 Worker Process 则是通过同步的方式向 ASP.NET ISAPI 获得一些基于 Server 的变量。   &lt;p&gt;   &lt;p&gt;&lt;strong&gt;IIS6 的 ASP.net 请求处理过程&lt;/strong&gt;  &lt;p&gt;&lt;img src="http://blog.joycode.com/images/blog.joycode.com/ghj/1362/o_8002.gif"&gt;  &lt;p&gt;对图的解释：  &lt;p&gt;IIS 5.x 是通过 InetInfo.exe 监听 Request 并把Request分发到Work Process。换句话说，在IIS 5.x中对Request的监听和分发是在User Mode中进行，在IIS 6中，这种工作被移植到kernel Mode中进行，所有的这一切都是通过一个新的组件：http.sys 来负责。   &lt;p&gt;注：为了避免用户应用程序访问或者修改关键的操作系统数据，windows提供了两种处理器访问模式：用户模式（User Mode）和内核模式（Kernel Mode）。一般地，用户程序运行在User mode下，而操作系统代码运行在Kernel Mode下。Kernel Mode的代码允许访问所有系统内存和所有CPU指令。  &lt;p&gt;在User Mode下，http.sys接收到一个基于 aspx 的http request，然后它会根据IIS中的 Metabase 查看该基于该 Request 的 Application 属于哪个Application Pool， 如果该Application Pool不存在，则创建之。否则直接将 request 发到对应Application Pool 的 Queue中。  &lt;p&gt;每个 Application Pool 对应着一个Worker Process：w3wp.exe，毫无疑问他是运行在User Mode下的。在IIS Metabase 中维护着 Application Pool 和worker process的Mapping。WAS（Web Administrative service）根据这样一个mapping，将存在于某个Application Pool Queue的request 传递到对应的worker process(如果没有，就创建这样一个进程)。在 worker process 初始化的时候，加载ASP.NET ISAPI，ASP.NET ISAPI 进而加载CLR。最后的流程就和IIS 5.x一样了：通过AppManagerAppDomainFactory 的 Create方法为 Application 创建一个Application Domain；通过 ISAPIRuntime 的 ProcessRequest处理Request，进而将流程进入到ASP.NET Http Runtime Pipeline。  &lt;p&gt;   &lt;p&gt;&lt;strong&gt;IIS 7  的 ASP.net 请求处理过程&lt;/strong&gt;  &lt;p&gt;   &lt;p&gt;IIS7 站点启动并处理请求的步骤如下图：  &lt;p&gt;步骤 1 到 6 ，是处理应用启动，启动好后，以后就不需要再走这个步骤了。  &lt;p&gt;&lt;img src="http://blog.joycode.com/images/blog.joycode.com/ghj/1362/o_9010.jpg" width=690 height=617&gt;  &lt;p&gt;上图的8个步骤分别如下：  &lt;p&gt;1、当客户端浏览器开始HTTP 请求一个WEB 服务器的资源时，HTTP.sys 拦截到这个请求。    &lt;br&gt;2、HTTP.sys contacts WAS to obtain information from the configuration store.   &lt;p&gt;3、WAS 向配置存储中心请求配置信息。applicationHost.config。    &lt;br&gt;4、WWW 服务接受到配置信息，配置信息指类似应用程序池配置信息，站点配置信息等等。     &lt;br&gt;5、WWW 服务使用配置信息去配置 HTTP.sys 处理策略。     &lt;br&gt;6、WAS starts a worker process for the application pool to which the request was made.   &lt;p&gt;7、The worker process processes the request and returns a response to HTTP.sys.   &lt;p&gt;8、客户端接受到处理结果信息。  &lt;p&gt;W3WP.exe 进程中又是如果处理得呢？？ IIS 7 的应用程序池的托管管道模式分两种： 经典和集成。 这两种模式下处理策略各不相通。  &lt;p&gt;&lt;font color="#ffffff"&gt;本文作者：郭红俊&lt;/font&gt; &lt;a title="http://blog.joycode.com/ghj" href="http://blog.joycode.com/ghj"&gt;&lt;font color="#ffffff"&gt;http://blog.joycode.com/ghj&lt;/font&gt;&lt;/a&gt;  &lt;p&gt;   &lt;p&gt;&lt;strong&gt;IIS 6 以及 IIS7 经典模式的托管管道的架构&lt;/strong&gt;  &lt;p&gt;       在IIS7之前，ASP.NET 是以 IIS ISAPI extension 的方式外加到 IIS，其实包括 ASP 以及 PHP，也都以相同的方式配置（PHP 在 IIS 采用了两种配置方式，除了 IIS ISAPI extension 的方式，也包括了 CGI 的方式，系统管理者能选择 PHP 程序的执行方式），因此客户端对 IIS 的 HTTP 请求会先经由 IIS 处理，然后 IIS 根据要求的内容类型，如果是 HTML 静态网页就由 IIS 自行处理，如果不是，就根据要求的内容类型，分派给各自的 IIS ISAPI extension；如果要求的内容类型是 ASP.NET，就分派给负责处理 ASP.NET 的 IIS ISAPI extension，也就是 aspnet_isapi.dll。下图是这个架构的示意图。   &lt;p&gt;IIS  7 应用程序池的 托管管道模式  经典  模式也是这样的工作原理。 这种模式是兼容IIS 6 的方式， 以减少升级的成本。  &lt;p&gt;&lt;img src="http://blog.joycode.com/images/blog.joycode.com/ghj/1362/o_9003.jpg"&gt;  &lt;p&gt;IIS6 的执行架构图，以及 IIS7  应用程序池配置成经典模式的执行架构图  &lt;p&gt;   &lt;p&gt;&lt;strong&gt;IIS  7 应用程序池的 托管管道模式  集成模式&lt;/strong&gt;  &lt;p&gt;       而 IIS 7 完全整合 .NET 之后，架构的处理顺序有了很大的不同（如下图），最主要的原因就是 ASP.NET 从 IIS 插件（ISAPI extension）的角色，进入了 IIS 核心，而且也能以 ASP.NET 模块负责处理 IIS 7 的诸多类型要求。这些 ASP.NET 模块不只能处理 ASP.NET 网页程序，也能处理其他如 ASP 程序、PHP 程序或静态 HTML 网页，也因为 ASP.NET 的诸多功能已经成为 IIS 7 的一部份，因此 ASP 程序、PHP 程序或静态 HTML 网页等类型的要求，也能使用像是Forms认证（Forms Authentication）或输出缓存（Output Cache）等 ASP.NET 2.0 的功能（但须修改 IIS 7 的设定值）。也因为 IIS 7 允许自行以 ASP.NET API 开发并加入模块，因此 ASP.NET 网页开发人员将更容易扩充 IIS 7 和网站应用程序的功能，甚至能自行以 .NET 编写管理 IIS 7 的程序（例如以程控 IIS 7 以建置网站或虚拟目录）。  &lt;p&gt;&lt;img src="http://blog.joycode.com/images/blog.joycode.com/ghj/1362/o_9004.jpg"&gt;  &lt;p&gt;IIS 7 的执行架构图（集成托管信道模式下的架构）  &lt;p&gt;   &lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;  &lt;p&gt;IIS5 到 IIS6 的改进，主要是 HTTP.sys 的改进。  &lt;p&gt;IIS6 到 IIS7 的改进，主要是 ISAPI 的改进。  &lt;p&gt;  &lt;p&gt;   &lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;  &lt;p&gt;ASP.NET Process Model之一：IIS 和 ASP.NET ISAPI    &lt;br&gt;&lt;a title="http://www.cnblogs.com/artech/archive/2007/09/09/887528.html" href="http://www.cnblogs.com/artech/archive/2007/09/09/887528.html"&gt;http://www.cnblogs.com/artech/archive/2007/09/09/887528.html&lt;/a&gt;  &lt;p&gt;ASP.NET Internals – IIS and the Process Model    &lt;br&gt;&lt;a title="http://dotnetslackers.com/articles/iis/ASPNETInternalsIISAndTheProcessModel.aspx" href="http://dotnetslackers.com/articles/iis/ASPNETInternalsIISAndTheProcessModel.aspx"&gt;http://dotnetslackers.com/articles/iis/ASPNETInternalsIISAndTheProcessModel.aspx&lt;/a&gt;  &lt;p&gt;模组化的IIS 7 与.NET 能力整合    &lt;br&gt;&lt;a title="http://www.microsoft.com/taiwan/technet/columns/profwin/33-iis7-componentization-integration.mspx" href="http://www.microsoft.com/taiwan/technet/columns/profwin/33-iis7-componentization-integration.mspx"&gt;http://www.microsoft.com/taiwan/technet/columns/profwin/33-iis7-componentization-integration.mspx&lt;/a&gt;  &lt;p&gt;Introduction to IIS 7.0 Architecture    &lt;br&gt;&lt;a title="http://learn.iis.net/page.aspx/101/introduction-to-iis7-architecture/" href="http://learn.iis.net/page.aspx/101/introduction-to-iis7-architecture/"&gt;http://learn.iis.net/page.aspx/101/introduction-to-iis7-architecture/&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+IIS5%e3%80%81IIS6%e3%80%81IIS7%e7%9a%84ASP.net+%e8%af%b7%e6%b1%82%e5%a4%84%e7%90%86%e8%bf%87%e7%a8%8b%e6%af%94%e8%be%83&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!302.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!302.entry</guid><pubDate>Fri, 25 Jul 2008 07:14:29 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!302/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!302.entry#comment</wfw:comment><dcterms:modified>2008-07-25T07:14:29Z</dcterms:modified></item><item><title>ASP.net 页面被关闭后，服务器端是否仍然执行中？</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!300.entry</link><description>&lt;p&gt;问题：当一个正在执行中的ASPX页面执行到一半的时候，浏览器中你关闭了这个页面，服务器端对应的这个页面的代码仍然在执行么？  &lt;p&gt;答案：除非你代码里面做了特殊判断，否则仍然正在执行。  &lt;p&gt;   &lt;p&gt;&lt;strong&gt;注意点：&lt;/strong&gt;  &lt;p&gt;1、客户端显示页面的时候，后台已经执行完了的页面对象早已经不存在了。当然这时候谈不上服务器段执行不执行的问题了。  &lt;p&gt;2、页面还没有返回，处于等待状态的时候。关闭ASPX页面，才会涉及到上面提到的服务器端仍然在执行的情况。  &lt;p&gt;3、客户端关闭的时候根本不向服务器发送指令。  &lt;p&gt;4、除非你代码里面做了特殊判断，这里的特殊判断指用 if(!Response.IsClientConnected) 来检测状态而用代码终止运行。  &lt;p&gt;下面的简单代码就是演示关闭页面后，看是否仍然在执行？  &lt;p&gt;你可以在这个页面打开后， 还没有返回任何信息的时候把这个页面关闭，然后看指定目录下是否有对应文件被创建并填写内容。  &lt;pre&gt;        &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            StringBuilder txt = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; StringBuilder();

            txt.AppendLine();
            txt.AppendLine(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
            txt.AppendLine(&amp;quot;&lt;span style="color:#8b0000"&gt;asvd&lt;/span&gt;&amp;quot;);

            Response.Write(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
            Response.Write(&amp;quot;&lt;span style="color:#8b0000"&gt;&amp;lt;br /&amp;gt;\r\n&lt;/span&gt;&amp;quot;);
            Thread.Sleep(50000);


            txt.AppendLine(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
            Response.Write(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
            Response.Write(&amp;quot;&lt;span style="color:#8b0000"&gt;&amp;lt;br /&amp;gt;\r\n&lt;/span&gt;&amp;quot;);

            &lt;span style="color:#008000"&gt;// 把一些信息写到另外一个文件,借此察看是否正在运行&lt;/span&gt;
            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, &amp;quot;&lt;span style="color:#8b0000"&gt;logs&lt;/span&gt;&amp;quot;);
            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            DateTime dt = DateTime.Now;
            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; shortfileName = &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000"&gt;errors_{0:0000}{1:00}{2:00}.log&lt;/span&gt;&amp;quot;, dt.Year, dt.Month, dt.Day);
            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; fileName = Path.Combine(dir, shortfileName);

            StreamWriter sw;
            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (File.Exists(fileName))
                sw = File.AppendText(fileName);
            &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;
                sw = File.CreateText(fileName);

            sw.Write(txt.ToString());
            sw.Close();
            sw = &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;;

        }&lt;/pre&gt;

&lt;p&gt; 

&lt;p&gt;作了特殊判断的情况简单例子：

&lt;p&gt;注意： IsClientConnected 的判断在 VS.net 开发工具自带的开发站点 ASP.NET Development Server  是不支持的。 ASP.NET Development Server 永远返回 true 。

&lt;p&gt;IIS 才是支持的。

&lt;pre&gt;        &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
        {

            StringBuilder txt = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; StringBuilder();

            &lt;span style="color:#0000ff"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 100; i++)
            {
                &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.Response.IsClientConnected)
                {
                    txt.AppendLine();
                    txt.AppendLine(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
                    txt.AppendLine(i.ToString());

                    Response.Write(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
                    Response.Write(&amp;quot;&lt;span style="color:#8b0000"&gt;&amp;lt;br /&amp;gt;\r\n&lt;/span&gt;&amp;quot;);
                    Thread.Sleep(500);
                }
                &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;
                {
                    Response.End();
                    &lt;span style="color:#0000ff"&gt;return&lt;/span&gt;;
                }
            }

            txt.AppendLine(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
            Response.Write(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
            Response.Write(&amp;quot;&lt;span style="color:#8b0000"&gt;&amp;lt;br /&amp;gt;\r\n&lt;/span&gt;&amp;quot;);

            &lt;span style="color:#008000"&gt;// 把一些信息写到另外一个文件,借此察看是否正在运行&lt;/span&gt;
            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, &amp;quot;&lt;span style="color:#8b0000"&gt;logs&lt;/span&gt;&amp;quot;);
            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            DateTime dt = DateTime.Now;
            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; shortfileName = &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000"&gt;errors_{0:0000}{1:00}{2:00}.log&lt;/span&gt;&amp;quot;, dt.Year, dt.Month, dt.Day);
            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; fileName = Path.Combine(dir, shortfileName);

            StreamWriter sw;
            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (File.Exists(fileName))
                sw = File.AppendText(fileName);
            &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;
                sw = File.CreateText(fileName);

            sw.Write(txt.ToString());
            sw.Close();
            sw = &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;;
        }&lt;/pre&gt;

&lt;p&gt;这个例子中是发现中断，就抛弃之前做的任何东西。

&lt;p&gt;当然我们也可以简单的修改上述代码，让把已经处理完成的东西记录下来，类似下面的代码

&lt;pre&gt;        &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            StringBuilder txt = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; StringBuilder();

            &lt;span style="color:#0000ff"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 100; i++)
            {
                &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.Response.IsClientConnected)
                {
                    txt.AppendLine();
                    txt.AppendLine(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
                    txt.Append(&amp;quot;&lt;span style="color:#8b0000"&gt;**********  &lt;/span&gt;&amp;quot;);
                    txt.AppendLine(i.ToString());

                    Response.Write(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
                    Response.Write(&amp;quot;&lt;span style="color:#8b0000"&gt;&amp;lt;br /&amp;gt;\r\n&lt;/span&gt;&amp;quot;);
                    Thread.Sleep(500);
                }
                &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;
                {
                    &lt;span style="color:#0000ff"&gt;break&lt;/span&gt;;
                }
            }

            txt.AppendLine(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
            Response.Write(DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000"&gt;u&lt;/span&gt;&amp;quot;));
            Response.Write(&amp;quot;&lt;span style="color:#8b0000"&gt;&amp;lt;br /&amp;gt;\r\n&lt;/span&gt;&amp;quot;);

            &lt;span style="color:#008000"&gt;// 把一些信息写到另外一个文件,借此察看是否正在运行&lt;/span&gt;
            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, &amp;quot;&lt;span style="color:#8b0000"&gt;logs&lt;/span&gt;&amp;quot;);
            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            DateTime dt = DateTime.Now;
            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; shortfileName = &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000"&gt;errors_{0:0000}{1:00}{2:00}.log&lt;/span&gt;&amp;quot;, dt.Year, dt.Month, dt.Day);
            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; fileName = Path.Combine(dir, shortfileName);

            StreamWriter sw;
            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (File.Exists(fileName))
                sw = File.AppendText(fileName);
            &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;
                sw = File.CreateText(fileName);

            sw.Write(txt.ToString());
            sw.Close();
            sw = &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;;
        }&lt;/pre&gt;

&lt;p&gt;需要注意的是， 使用 isClientConnected   是要占用一定的系统资源的。 

&lt;p&gt;isClientConnected   实际上需要向客户端输出一点东西，然后才知道客户端是否仍然在线。

&lt;p&gt;这样，除非你的应用非常耗时，否则建议你不要用 isClientConnected   。 免得判断 isClientConnected   使用的资源比你实际业务逻辑使用的资源还要多。

&lt;p&gt;在任何情况下， Response.IsClientConnected 都要有些开销，所以，只有在执行至少要用 500 毫秒（如果想维持每秒几十页的吞吐量，这是一个很长的时间了）的操作前才使用它。作为通常的规则，不要在紧密循环的每次迭代中调用它，例如当绘制表中的行，可能每  20 行或每 50 行调用一次。 

&lt;p&gt; 

&lt;p&gt; 

&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;

&lt;p&gt;how to increase timeout on aspx page? 
  &lt;br&gt;&lt;a title="http://p2p.wrox.com/topic.asp?TOPIC_ID=7504" href="http://p2p.wrox.com/topic.asp?TOPIC_ID=7504"&gt;http://p2p.wrox.com/topic.asp?TOPIC_ID=7504&lt;/a&gt;

&lt;p&gt;asp.net能不能在客户端关闭后在后台继续将页面执行完毕？ 
  &lt;br&gt;&lt;a title="http://topic.csdn.net/u/20070202/14/85ea5576-907a-4960-9c53-b206a05228e4.html" href="http://topic.csdn.net/u/20070202/14/85ea5576-907a-4960-9c53-b206a05228e4.html"&gt;http://topic.csdn.net/u/20070202/14/85ea5576-907a-4960-9c53-b206a05228e4.html&lt;/a&gt;

&lt;p&gt;在 ASP.NET 中使用计时器（Timer） 
  &lt;br&gt;&lt;a title="http://blog.joycode.com/percyboy/articles/3595.aspx" href="http://blog.joycode.com/percyboy/articles/3595.aspx"&gt;http://blog.joycode.com/percyboy/articles/3595.aspx&lt;/a&gt;

&lt;p&gt;ASP.NET 2.0 中的异步页 
  &lt;br&gt;&lt;a title="http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true" href="http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true"&gt;http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true&lt;/a&gt;

&lt;p&gt;IsClientConnected的问题 
  &lt;br&gt;&lt;a title="http://topic.csdn.net/u/20080712/19/74fa4070-84bd-4fda-a99b-ac361f874738.html" href="http://topic.csdn.net/u/20080712/19/74fa4070-84bd-4fda-a99b-ac361f874738.html"&gt;http://topic.csdn.net/u/20080712/19/74fa4070-84bd-4fda-a99b-ac361f874738.html&lt;/a&gt;

&lt;p&gt;Response.IsClientConnected 原理和用法 
  &lt;br&gt;&lt;a title="http://blog.51ait.cn/article.asp?id=357" href="http://blog.51ait.cn/article.asp?id=357"&gt;http://blog.51ait.cn/article.asp?id=357&lt;/a&gt;    第一个地址比较慢，可以看下一个地址 

  &lt;br&gt;&lt;a title="http://blog.joycode.com/ghj/archive/2008/07/23/115198.aspx" href="http://blog.joycode.com/ghj/archive/2008/07/23/115198.aspx"&gt;http://blog.joycode.com/ghj/archive/2008/07/23/115198.aspx&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+ASP.net+%e9%a1%b5%e9%9d%a2%e8%a2%ab%e5%85%b3%e9%97%ad%e5%90%8e%ef%bc%8c%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%af%e6%98%af%e5%90%a6%e4%bb%8d%e7%84%b6%e6%89%a7%e8%a1%8c%e4%b8%ad%ef%bc%9f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><category>.net 技术</category><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!300.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!300.entry</guid><pubDate>Wed, 23 Jul 2008 07:48:22 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!300/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!300.entry#comment</wfw:comment><dcterms:modified>2008-07-23T07:48:22Z</dcterms:modified></item><item><title>写给刚工作的网站技术人员</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!297.entry</link><description>&lt;p&gt;       工作九年了，网站相关的开发工作也干了八年多。负责带领团队也好几年了。面试和带领刚工作的人也不少了。其中的优秀者不少，但是大多数都存在下面提到的几个认识误区。把这些问题提出来，希望对刚参加工作没有多久的程序员们有所帮助，少走弯路。  &lt;p&gt;   &lt;p&gt;      公司招你进来，其实最重要的就是看到你的工作能力和工作态度是可以接受的。  &lt;p&gt;            工作能力指你能满足他们的工作期望，或者在可接受的时间范围内，经过培训后，可以满足这个工作期望。  &lt;p&gt;            工作态度指你能有些做职员的基本素质。  &lt;p&gt;      这个道理应该所有人都清楚。但是到实际事情时候就经常犯迷糊。下面几点是经常会出问题的地方：  &lt;p&gt;   &lt;p&gt;1、不经测试，Review，就认为自己工作完成了。  &lt;p&gt;       你的代码或者应用一旦被别人Review ，或者进行试用。这时候你代码的好坏，或者功能是否在各种场景下是否可用，都会影响你这个人在上级及同事眼里的可信任度。  &lt;p&gt;       代码书写的规范，性能的高质量，各种功能在各个场景都可用，则表示你这个人是完全可信的。下次上级给你分派任务的时候，就可以给你更多的自由度来发挥。长此以往，前途和钱途自然就随手可得。  &lt;p&gt;        反之，代码不规范，功能好些场景不可用。这只能让上级或同事觉得你不可信任。每次都需要处理你带来的这些问题，说恶心点就是你每次拉完大便都没擦屁股，每次都得你的同事和上级帮你擦屁股。数次都这样后，上级或同事下次跟你沟通的时候就会觉得你这个人不可信任，一件事情必须反复多次强调，总觉得你还会作出问题。你的信用已经非常危险了。  &lt;p&gt;       你在别人眼里的信用就这样被你慢慢透支了。透支到一定程度，走人吧。整个团队的效率会因为你而变慢（每个人跟你沟通的成本都会影响到他本人的产出），你不走人谁走人。  &lt;p&gt;   &lt;p&gt;2、最短可接受的工作时限  &lt;p&gt;       你有没有统计过，公司分派给你一个工作时候，上级指定的这项工作计划做多久的预计，跟你自己的预计有多大差异？  &lt;p&gt;       如果你预计时间大于上级给的工作计划时间，同时上级没有增派人手进行相关工作。除了BT的领导外，那只有一种情况：上级对你的工作态度非常不满，认为你的薪水对应的工作能力不是这么点。  &lt;p&gt;       对于刚工作的，更多的是你表现出来的工作能力在公司的平均工作能力之下。同时公司觉得你对工作没有表现出足够的热情。 一个能力在平均水平下面，又缺乏工作激情的人，他的前途在那里？？   &lt;p&gt;       如果这个人还没有表现出几个月后能达到平均水平之上的希望，为啥会留这样一个人呢？  &lt;p&gt;   &lt;p&gt;3、工作能力不等于技术水平  &lt;p&gt;       我曾看到过有人抱怨说大公司的员工也不过是这技术水平， 这么简单的技术问题都不会。我自己早期也有这样想法，后来发现是不对的。  &lt;p&gt;       不论大公司还是小公司，要得是解决问题的工作能力。 我的曾经手下就有好几个技术水平很牛的，但是作出来的应用却一次次返工的。为啥，工作能力这些非技术因素他们做的很不好。  &lt;p&gt;       工作能力的非技术因素包括的很多： 责任心，表现就是对自己写出来的代码有一定要让人放心的责任； 沟通能力，一个典型的表现就是需求不理解或者需求不明时，及时得跟相关人沟通，而不是自己先按自己想法实现，造成代码写完后再返工的恶果等等。   &lt;p&gt;       技术水平低，但是解决问题能力强的，我也碰到过一些人。 工作的能力更重要的是这些非技术的工作能力，而不是技术水平。技术人员很容易技术水平高，但是非技术的工作能力差。 这是很糟糕的。  &lt;p&gt;        &lt;p&gt;   &lt;p&gt;4、发展潜力，学习能力  &lt;p&gt;      公司使用的技术不可能一直不变，一直不变的公司只能慢慢被市场淘汰。这就要求员工能不断的学习新的知识，并应用到工作中来。  &lt;p&gt;      要想不会出现几年后，自己发现跳槽找个工作都没人要，赶快学习吧。  &lt;p&gt;      坚持，是一个人最难做到的。 但是不坚持，那就等着灭亡吧。  &lt;p&gt;   &lt;p&gt;   &lt;p&gt;5、笨鸟先飞  &lt;p&gt;      一个人，在公司，如果工作能力在平均线以下， 加班吧， 不要有任何幻想。  &lt;p&gt;      最可怕的是自己没这个意识， 自认为自己技术水平很牛， 但是解决问题的工作能力却在平均水平线以下， 眼高手低 ， 这样的人， 公司是不能留的。  &lt;p&gt;   &lt;p&gt;   &lt;p&gt;6、承诺到的事情一定要做到，不要找理由  &lt;p&gt;       一件事情没有被做完，想找理由能找很多的。既然你承诺了某个时间点前完成，就不要再找各种理由推脱。  &lt;p&gt;       公司同事和上级虽然可能这次接受了你的理由，但是下次呢， 慢慢的就会让你的上级，同事觉得你是一个喜欢推托的人。 感觉你干事是非常不可靠的。不知道那次就会不完成，下次谁敢再找你干事？  &lt;p&gt;   &lt;p&gt;&lt;strong&gt;新补充的：&lt;/strong&gt;  &lt;p&gt;7、有能力者不用加班，能力在平均线之下的自觉加班吧  &lt;p&gt;从CSDN的评论中，争议最大的一个在加班。我这里就补充一下我对加班的看法。  &lt;p&gt;首先，所有人加班，这肯定是领导者的责任， 整体的工作进度压力过大了。  &lt;p&gt;连续的不间断的加班，这也是领导者的责任，人不可能一直处于线绑紧的状态。  &lt;p&gt;但是，如果一个部门，部分人加班，部分人不加班，而且并不是因为领导弱智的把一些人工作分派多，一些人工作分派少导致的。加班的人只能说明他的工作能力在部门的平均线之下。    &lt;br&gt;同一个工作， A 员工干的话 3 天完成， B 员工干的话 5天完成。 最后如果这个工作分派给 B 员工， 很可能是要求他 4天完成。 而且他必须自觉加班。  &lt;p&gt;这就是我所说的 ： 有能力者不用加班，能力在平均线之下的自觉加班。  &lt;p&gt;   &lt;p&gt;        可能很多人在看到我这篇博客的时候，觉得我写的很刻薄，好像都是从公司的角度欺压技术人员。很没有人情味。  &lt;p&gt;        只要你不是公司的董事， 你永远是被剥削者，公司的目的就是利润最大化，这是公司存活的根本目的。作为普通的职员，要有所为的白领意识，其实就是被剥削意识。这是个适者生存的生态圈，不适用的人只能被淘汰。  &lt;p&gt;        实际的公司其实有很多人情味在里面，或者同事和领导有些话不便于说出口。 这也就造成了一些技术人员被开除，还自以为如何如何？ 都是没有这些意识造成的。我写这篇博客就是希望能增加技术人员的这些意识，不要犯了这些问题还自己不知道。&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+%e5%86%99%e7%bb%99%e5%88%9a%e5%b7%a5%e4%bd%9c%e7%9a%84%e7%bd%91%e7%ab%99%e6%8a%80%e6%9c%af%e4%ba%ba%e5%91%98&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><category>.net 技术</category><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!297.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!297.entry</guid><pubDate>Tue, 22 Jul 2008 07:12:26 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!297/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!297.entry#comment</wfw:comment><dcterms:modified>2008-07-23T08:34:50Z</dcterms:modified></item><item><title>UTF-8 BOM导致的无法正常模拟Http请求</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!296.entry</link><description>&lt;p&gt;&lt;strong&gt;本文概述&lt;/strong&gt;  &lt;p&gt;StreamWriter 在产生UTF-8编码的内容时候，会在产生的这个UTF-8内容中增加BOM的信息，而这个BOM的信息，会干扰我们在一些情况的使用。    &lt;br&gt;本文描述的情况，就是这种干扰让我们无法正常工作的一种情况。  &lt;p&gt;   &lt;p&gt;&lt;strong&gt;何为BOM？&lt;/strong&gt;  &lt;p&gt;BOM(Byte Order Mark)，BOM签名。    &lt;br&gt;BOM的内容就可以表示unicode文件是何种编码。BOM签名的意思就是告诉编辑器当前文件采用何种编码，方便编辑器识别。  &lt;p&gt;对于UTF-8 ， BOM 信息为 EF BB BF。 我们如果在Google搜索 UTF-8 BOM 就会搜索到很多文章， BOM 在不少情况下，都会给我们添乱子。  &lt;p&gt;   &lt;p&gt;&lt;strong&gt;下面是我碰到这个问题的描述&lt;/strong&gt;  &lt;p&gt;我碰到这个问题的场景:在书写一段模拟HTTP Post 请求的时候， 代码如下，但是却无法模拟Post请求：  &lt;pre&gt;&lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#0000ff"&gt;do&lt;/span&gt;2()
 {
     &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; url = &amp;quot;&lt;span style="color:#8b0000"&gt;&lt;a href="http://localhost:39749/Default.aspx&amp;quot;;"&gt;http://localhost:39749/Default.aspx&lt;/a&gt;&lt;/span&gt;&amp;quot;;
&lt;br&gt;&lt;br&gt;     &lt;br&gt;&lt;/pre&gt;

&lt;pre&gt;     &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; indata = &amp;quot;&lt;span style="color:#8b0000"&gt;__VIEWSTATE=%2FwEPDwUKMTQ2OTkzNDMyMWRkyGd&lt;/span&gt;&amp;quot;;
      indata += &amp;quot;&lt;span style="color:#8b0000"&gt;iqWjBKr5rIKmHzSdD9AaojKw%3D&amp;amp;Button1=Button&amp;amp;__EVENTVALIDATION=%&lt;/span&gt;&amp;quot;;
      indata += &amp;quot;&lt;span style="color:#8b0000"&gt;2FwEWAgLohfrVDQKM54rGBu49QLoa7JmG9cEfUpTccMrUmJfD&lt;/span&gt;&amp;quot;;&lt;/pre&gt;

&lt;pre&gt;     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
     req.ContentType = &amp;quot;&lt;span style="color:#8b0000"&gt;application/x-www-form-urlencoded&lt;/span&gt;&amp;quot;;
     req.Method = &amp;quot;&lt;span style="color:#8b0000"&gt;Post&lt;/span&gt;&amp;quot;;


     Stream myRequestStream = req.GetRequestStream();
     StreamWriter myStreamWriter = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; StreamWriter(myRequestStream, Encoding.UTF8);
     myStreamWriter.Write(indata);
     myStreamWriter.Close();
     myRequestStream.Close();
     myStreamWriter.Dispose();
     myRequestStream.Dispose();


     HttpWebResponse res = (HttpWebResponse)req.GetResponse();
     StreamReader reader = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; StreamReader(res.GetResponseStream(), Encoding.UTF8);
     &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; info = reader.ReadToEnd();
     reader.Close();
     res.Close();
     reader.Dispose();
     MessageBox.Show(info);
 }&lt;/pre&gt;

&lt;p&gt;而文中中间的代码修改成下面代码则可以成功模拟。

&lt;pre&gt;&lt;span style="color:#0000ff"&gt;byte&lt;/span&gt;[] bytes = System.Text.Encoding.UTF8.GetBytes(indata);
req.ContentLength = bytes.Length;
Stream myRequestStream = req.GetRequestStream();
myRequestStream.Write(bytes, 0, bytes.Length);
myRequestStream.Close();&lt;/pre&gt;

&lt;p&gt;为何会这样呢？分析原因，竟然是 UTF-8 BOM 在作怪。

&lt;p&gt;StreamWriter 在产生UTF-8编码的内容时候，会在产生的这个UTF-8内容中增加BOM的信息， 这样他发送的Post信息就比正常多了三个字节  EF BB BF。 就是因为这三个字节导致服务器端无法处理正常的Post请求。

&lt;p&gt; 

&lt;p&gt;&lt;strong&gt;解决方法：&lt;/strong&gt;

&lt;p&gt;1、自己重写UTF-8类，参看 &lt;a title="http://www.19870202.com/?tid=381" href="http://www.19870202.com/?tid=381"&gt;http://www.19870202.com/?tid=381&lt;/a&gt;  。在调用的时候用这个自己写的类。 

  &lt;br&gt;重写代码： 

  &lt;br&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; UTF8EncodingNoPreamble : System.Text.UTF8Encoding 

  &lt;br&gt;{ 

  &lt;br&gt;        &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;byte&lt;/span&gt;[] GetPreamble() 

  &lt;br&gt;        { 

  &lt;br&gt;            &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;byte&lt;/span&gt;[0]; 

  &lt;br&gt;        } 

  &lt;br&gt;}

&lt;p&gt;2、不要用 StreamWriter ，参看我上面的替代方案。

&lt;p&gt; 

&lt;p&gt;&lt;strong&gt;参考资料:&lt;/strong&gt;

&lt;p&gt;System.IO.StreamWriter写UTF-8文件不写BOM 
  &lt;br&gt;&lt;a title="http://www.19870202.com/?tid=381" href="http://www.19870202.com/?tid=381"&gt;http://www.19870202.com/?tid=381&lt;/a&gt;

&lt;p&gt;UTF-8, UTF-16, UTF-32 &amp;amp; BOM 
  &lt;br&gt;&lt;a title="http://unicode.org/faq/utf_bom.html#BOM" href="http://unicode.org/faq/utf_bom.html#BOM"&gt;http://unicode.org/faq/utf_bom.html#BOM&lt;/a&gt;

&lt;p&gt;utf-8 保存文件的 bom 问题 
  &lt;br&gt;&lt;a title="http://www.uuzone.com/blog/tom/101761.htm" href="http://www.uuzone.com/blog/tom/101761.htm"&gt;http://www.uuzone.com/blog/tom/101761.htm&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+UTF-8+BOM%e5%af%bc%e8%87%b4%e7%9a%84%e6%97%a0%e6%b3%95%e6%ad%a3%e5%b8%b8%e6%a8%a1%e6%8b%9fHttp%e8%af%b7%e6%b1%82&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><category>.net 技术</category><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!296.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!296.entry</guid><pubDate>Wed, 25 Jun 2008 06:27:38 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!296/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!296.entry#comment</wfw:comment><dcterms:modified>2008-06-25T06:27:38Z</dcterms:modified></item><item><title>WEB Service 传递信息时候,会把 /r/n 变成 /n</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!283.entry</link><description>&lt;p&gt;我们在使用WEB Service时，需要注意的一点是，传递过程中会丢失一些字符，比较典型的是 /r/n 中 /r 回车字符会被丢弃。这是XML规范所导致的问题。XML规范关于这部分的描述如下：  &lt;p&gt;2.11 行尾处理   &lt;br&gt;为编辑的方便起见，存储XML已析实体的计算机文件经常用行来组织。通常这些行用回车符(#xD)和换行符(#xA)的一些组合来分隔。   &lt;p&gt;为了使应用的工作简单化，对于一个外部已析实体或内部已析实体的常量实体值中包含的任何两字符常量序列&amp;quot;#xD#xA&amp;quot;或单独的常量#xD，XML处理器都应换成#xA传递给应用。(这可以通过在进行语法分析前将所有行分隔符规范成#xA而方便地实现。)   &lt;p&gt;\r   回车(跑到最前面)   &lt;br&gt;\n  换行(下一行)     &lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;  &lt;p&gt;WebServices eat \r in \r\n    &lt;br&gt;&lt;a title="http://vidmar.net/weblog/archive/2005/04/03/1203.aspx" href="http://vidmar.net/weblog/archive/2005/04/03/1203.aspx"&gt;http://vidmar.net/weblog/archive/2005/04/03/1203.aspx&lt;/a&gt;    &lt;br&gt;    &lt;br&gt;XML规范对此相关的解释    &lt;br&gt;&lt;a title="http://www.w3.org/TR/2004/REC-xml-20040204/#sec-line-ends" href="http://www.w3.org/TR/2004/REC-xml-20040204/#sec-line-ends"&gt;http://www.w3.org/TR/2004/REC-xml-20040204/#sec-line-ends&lt;/a&gt;    &lt;br&gt;中文版的介绍看下面地址：    &lt;br&gt;&lt;a title="http://xml.coverpages.org/xml10-chinese.html#sec-line-ends" href="http://xml.coverpages.org/xml10-chinese.html#sec-line-ends"&gt;http://xml.coverpages.org/xml10-chinese.html#sec-line-ends&lt;/a&gt;  &lt;p&gt;\r\n和\r   &lt;br&gt;&lt;a title="http://topic.csdn.net/t/20060317/09/4620216.html" href="http://topic.csdn.net/t/20060317/09/4620216.html"&gt;http://topic.csdn.net/t/20060317/09/4620216.html&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+WEB+Service+%e4%bc%a0%e9%80%92%e4%bf%a1%e6%81%af%e6%97%b6%e5%80%99%2c%e4%bc%9a%e6%8a%8a+%2fr%2fn+%e5%8f%98%e6%88%90+%2fn&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><category>.net 技术</category><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!283.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!283.entry</guid><pubDate>Fri, 06 Jun 2008 09:30:04 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!283/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!283.entry#comment</wfw:comment><dcterms:modified>2008-06-06T09:30:04Z</dcterms:modified></item><item><title>动态封杀与解封IP</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!279.entry</link><description>&lt;p&gt;我们在应对网站的恶意请求时候，一个解决方法就是把有问题的请求IP封杀掉。 &lt;p&gt;如果想快速处理这种问题，就需要编写一段代码，达到一定门槛，自动封杀。再复杂点就是不是永久封杀，还可以自动在一定时间后解封。 &lt;p&gt;封杀的逻辑代码看后面提供的。 &lt;p&gt;需要说明的是：IIS7时，情况发生了不同。 &lt;p&gt;  &lt;p&gt;下面的代码，在处理封杀IP时候，不论IIS6还是IIS7 都可以把需要封杀的IP加入封杀列表。但是需要注意的是我们代码写的是全部替换原先的数据。但是在IIS7下，执行的效果是原先的不替换，新加一批封杀IP。当然IIS7下，如果新加的IP原来就有了，则会报如下异常： &lt;p&gt;System.Runtime.InteropServices.COMException was caught&lt;br&gt;  Message=&amp;quot;当文件已存在时，无法创建该文件。 (异常来自 HRESULT:0x800700B7)&amp;quot;&lt;br&gt;  Source=&amp;quot;System.DirectoryServices&amp;quot;&lt;br&gt;  ErrorCode=-2147024713&lt;br&gt;  StackTrace:&lt;br&gt;       在 System.DirectoryServices.DirectoryEntry.CommitChanges()&lt;br&gt;       在 IIS_Security_ConsoleApplication.Program.IPDeny() 位置 D:\MyCodes\IIS_Security_ConsoleApplication\IIS_Security_ConsoleApplication\Program.cs:行号 109&lt;br&gt;  InnerException:  &lt;p&gt;这就是说，IIS7， 我们可以通过编程接口增加封杀IP名单，但是没发通过编程接口剔出封杀IP。 &lt;p&gt;  &lt;p&gt;&lt;strong&gt;参考代码：&lt;/strong&gt; &lt;p&gt;这里提供了两套参考代码，其实原理都是一样的。 &lt;p&gt;在IIS 6 下，都没有任何问题， IIS 7 下都会有没发删除原先已有数据的问题。  &lt;p&gt;&lt;strong&gt;代码一：&lt;/strong&gt;&lt;pre&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; System.DirectoryServices;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; System.Reflection;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; System;&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; Program&lt;br&gt;    {&lt;br&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; IPDeny()&lt;br&gt;        {&lt;br&gt;&lt;br&gt;            &lt;span style="color:#0000ff"&gt;try&lt;/span&gt;&lt;br&gt;            {&lt;br&gt;                &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; serverName = &amp;quot;&lt;span style="color:#8b0000"&gt;localhost&lt;/span&gt;&amp;quot;;&lt;br&gt;                &lt;span style="color:#008000"&gt;// retrieve the directory entry for the root of the IIS server&lt;/span&gt;&lt;br&gt;                System.DirectoryServices.DirectoryEntry IIS = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; System.DirectoryServices.DirectoryEntry(&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000"&gt;IIS://{0}/w3svc/1/root&lt;/span&gt;&amp;quot;, serverName));&lt;br&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// retrieve the list of currently denied IPs&lt;/span&gt;&lt;br&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;Retrieving the list of currently denied IPs.&lt;/span&gt;&amp;quot;);&lt;br&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// get the IPSecurity property&lt;/span&gt;&lt;br&gt;                Type typ = IIS.Properties[&amp;quot;&lt;span style="color:#8b0000"&gt;IPSecurity&lt;/span&gt;&amp;quot;][0].GetType();&lt;br&gt;                &lt;span style="color:#0000ff"&gt;object&lt;/span&gt; IPSecurity = IIS.Properties[&amp;quot;&lt;span style="color:#8b0000"&gt;IPSecurity&lt;/span&gt;&amp;quot;][0];&lt;br&gt;&lt;br&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// retrieve the IPDeny list from the IPSecurity object&lt;/span&gt;&lt;br&gt;                Array origIPDenyList = (Array)typ.InvokeMember(&amp;quot;&lt;span style="color:#8b0000"&gt;IPDeny&lt;/span&gt;&amp;quot;, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic&lt;br&gt;                    | BindingFlags.Instance | BindingFlags.GetProperty, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, IPSecurity, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;);&lt;br&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// 罗列已经被拒绝的地址&lt;/span&gt;&lt;br&gt;                &lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; s &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; origIPDenyList)&lt;br&gt;                    Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;Before: &lt;/span&gt;&amp;quot; + s);&lt;br&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// check GrantByDefault.  This has to be set to true, &lt;/span&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// or what we are doing will not work.&lt;/span&gt;&lt;br&gt;                &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; bGrantByDefault = (&lt;span style="color:#0000ff"&gt;bool&lt;/span&gt;)typ.InvokeMember(&amp;quot;&lt;span style="color:#8b0000"&gt;GrantByDefault&lt;/span&gt;&amp;quot;, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic&lt;br&gt;                    | BindingFlags.Instance | BindingFlags.GetProperty, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, IPSecurity, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;);&lt;br&gt;&lt;br&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;GrantByDefault = &lt;/span&gt;&amp;quot; + bGrantByDefault);&lt;br&gt;                &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (!bGrantByDefault)&lt;br&gt;                {&lt;br&gt;                    &lt;span style="color:#008000"&gt;// 必须设置  默认允许访问&lt;/span&gt;&lt;br&gt;                    typ.InvokeMember(&amp;quot;&lt;span style="color:#8b0000"&gt;GrantByDefault&lt;/span&gt;&amp;quot;, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance&lt;br&gt;                        | BindingFlags.SetProperty, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, IPSecurity, &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;[] { &lt;span style="color:#0000ff"&gt;true&lt;/span&gt; });&lt;br&gt;                }&lt;br&gt;&lt;br&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// 更新被拒绝的IP列表&lt;/span&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// 注意这里是完全替换&lt;/span&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// 如果你想保留原先的拒绝列表，需要原先的拒绝列表也在这个数组中&lt;/span&gt;&lt;br&gt;&lt;br&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;Updating the list of denied IPs.&lt;/span&gt;&amp;quot;);&lt;br&gt;&lt;br&gt;                &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;[] newIPDenyList = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;[4];&lt;br&gt;                newIPDenyList[0] = &amp;quot;&lt;span style="color:#8b0000"&gt;192.168.1.21, 255.255.255.255&lt;/span&gt;&amp;quot;;&lt;br&gt;                newIPDenyList[1] = &amp;quot;&lt;span style="color:#8b0000"&gt;192.168.1.22, 255.255.255.255&lt;/span&gt;&amp;quot;;&lt;br&gt;                newIPDenyList[2] = &amp;quot;&lt;span style="color:#8b0000"&gt;192.168.1.23, 255.255.255.255&lt;/span&gt;&amp;quot;;&lt;br&gt;                newIPDenyList[3] = &amp;quot;&lt;span style="color:#8b0000"&gt;192.168.1.24, 255.255.255.255&lt;/span&gt;&amp;quot;;&lt;br&gt;&lt;br&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;Calling SetProperty&lt;/span&gt;&amp;quot;);&lt;br&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// add the updated list back to the IPSecurity object&lt;/span&gt;&lt;br&gt;                typ.InvokeMember(&amp;quot;&lt;span style="color:#8b0000"&gt;IPDeny&lt;/span&gt;&amp;quot;, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance&lt;br&gt;                    | BindingFlags.SetProperty, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, IPSecurity, &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;[] { newIPDenyList });&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;                IIS.Properties[&amp;quot;&lt;span style="color:#8b0000"&gt;IPSecurity&lt;/span&gt;&amp;quot;][0] = IPSecurity;&lt;br&gt;&lt;br&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;Commiting the changes.&lt;/span&gt;&amp;quot;);&lt;br&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// commit the changes&lt;/span&gt;&lt;br&gt;                IIS.CommitChanges();&lt;br&gt;                IIS.RefreshCache();&lt;br&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;// 检查更新后的数据&lt;/span&gt;&lt;br&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;Checking to see if the update took.&lt;/span&gt;&amp;quot;);&lt;br&gt;&lt;br&gt;                IPSecurity = IIS.Properties[&amp;quot;&lt;span style="color:#8b0000"&gt;IPSecurity&lt;/span&gt;&amp;quot;][0];&lt;br&gt;                Array y = (Array)typ.InvokeMember(&amp;quot;&lt;span style="color:#8b0000"&gt;IPDeny&lt;/span&gt;&amp;quot;,&lt;br&gt;                          BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty,&lt;br&gt;                          &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, IPSecurity, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;);&lt;br&gt;&lt;br&gt;                &lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; s &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; y)&lt;br&gt;                    Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;After:  &lt;/span&gt;&amp;quot; + s);&lt;br&gt;            }&lt;br&gt;            &lt;span style="color:#0000ff"&gt;catch&lt;/span&gt; (Exception e)&lt;br&gt;            {&lt;br&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;Error: &lt;/span&gt;&amp;quot; + e.ToString());&lt;br&gt;            }&lt;br&gt;&lt;br&gt;        }&lt;br&gt;    }&lt;/pre&gt;
&lt;p&gt; 
&lt;p&gt;&lt;strong&gt;代码二：&lt;/strong&gt;&lt;pre&gt;        &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; System.DirectoryServices;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; System.Reflection;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; SetIPSecurityProperty(&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; metabasePath, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; member, &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; item)&lt;br&gt;        {&lt;br&gt;            &lt;span style="color:#008000"&gt;//  metabasePath is of the form &amp;quot;IIS://&amp;lt;servername&amp;gt;/&amp;lt;path&amp;gt;&amp;quot;&lt;/span&gt;&lt;br&gt;            &lt;span style="color:#008000"&gt;//    for example &amp;quot;IIS://localhost/SMTPSVC/1&amp;quot; &lt;/span&gt;&lt;br&gt;            &lt;span style="color:#008000"&gt;//  member is of the form &amp;quot;IPGrant|IPDeny|DomainGrant|DomainDeny&amp;quot;&lt;/span&gt;&lt;br&gt;            &lt;span style="color:#008000"&gt;//  item is of the form &amp;quot;&amp;lt;ipaddress|domain&amp;gt;&amp;quot;, for example, 157.56.236.15 or domain.microsoft.com&lt;/span&gt;&lt;br&gt;            Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;\nEnumerating the IPSecurity property at {0}:&lt;/span&gt;&amp;quot;, metabasePath);&lt;br&gt;&lt;br&gt;            &lt;span style="color:#0000ff"&gt;try&lt;/span&gt;&lt;br&gt;            {&lt;br&gt;                &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; ((&amp;quot;&lt;span style="color:#8b0000"&gt;IPGrant&lt;/span&gt;&amp;quot; != member) &amp;amp;&amp;amp; (&amp;quot;&lt;span style="color:#8b0000"&gt;IPDeny&lt;/span&gt;&amp;quot; != member) &amp;amp;&amp;amp; (&amp;quot;&lt;span style="color:#8b0000"&gt;DomainGrant&lt;/span&gt;&amp;quot; != member) &amp;amp;&amp;amp; (&amp;quot;&lt;span style="color:#8b0000"&gt;DomainDeny&lt;/span&gt;&amp;quot; != member))&lt;br&gt;                {&lt;br&gt;                    Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt; Failed in SetIPSecurityProperty; second param must be one of IPGrant|IPDeny|DomainGrant|DomainDeny&lt;/span&gt;&amp;quot;);&lt;br&gt;                }&lt;br&gt;                &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;                {&lt;br&gt;                    DirectoryEntry path = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; DirectoryEntry(metabasePath);&lt;br&gt;                    path.RefreshCache();&lt;br&gt;                    &lt;span style="color:#0000ff"&gt;object&lt;/span&gt; ipsecObj = path.Invoke(&amp;quot;&lt;span style="color:#8b0000"&gt;Get&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;[] { &amp;quot;&lt;span style="color:#8b0000"&gt;IPSecurity&lt;/span&gt;&amp;quot; });&lt;br&gt;                    Type t = ipsecObj.GetType();&lt;br&gt;                    Array data = (Array)t.InvokeMember(member, BindingFlags.GetProperty, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, ipsecObj, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;);&lt;br&gt;                    Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt; Old {0} =&lt;/span&gt;&amp;quot;, member);&lt;br&gt;                    &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; exists = &lt;span style="color:#0000ff"&gt;false&lt;/span&gt;;&lt;br&gt;                    &lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; dataItem &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; data)&lt;br&gt;                    {&lt;br&gt;                        Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;  {0}&lt;/span&gt;&amp;quot;, dataItem.ToString());&lt;br&gt;                        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (dataItem.ToString().StartsWith(item))&lt;br&gt;                        {&lt;br&gt;                            exists = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;;&lt;br&gt;                        }&lt;br&gt;                    }&lt;br&gt;&lt;br&gt;                    &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (exists)&lt;br&gt;                    {&lt;br&gt;                        Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt; {0} already exists in {1}&lt;/span&gt;&amp;quot;, item, member);&lt;br&gt;                    }&lt;br&gt;                    &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;                    {&lt;br&gt;                        &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;[] newData = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;[data.Length + 1];&lt;br&gt;                        data.CopyTo(newData, 0);&lt;br&gt;                        newData.SetValue(item, data.Length);&lt;br&gt;&lt;br&gt;                        t.InvokeMember(member, BindingFlags.SetProperty, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, ipsecObj, &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;[] { newData });&lt;br&gt;&lt;br&gt;                        path.Invoke(&amp;quot;&lt;span style="color:#8b0000"&gt;Put&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;[] { &amp;quot;&lt;span style="color:#8b0000"&gt;IPSecurity&lt;/span&gt;&amp;quot;, ipsecObj });&lt;br&gt;&lt;br&gt;                        path.CommitChanges();&lt;br&gt;&lt;br&gt;                        path.RefreshCache();&lt;br&gt;                        ipsecObj = path.Invoke(&amp;quot;&lt;span style="color:#8b0000"&gt;Get&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;[] { &amp;quot;&lt;span style="color:#8b0000"&gt;IPSecurity&lt;/span&gt;&amp;quot; });&lt;br&gt;                        data = (Array)t.InvokeMember(member, BindingFlags.GetProperty, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, ipsecObj, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;);&lt;br&gt;                        Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt; New {0} =&lt;/span&gt;&amp;quot;, member);&lt;br&gt;                        &lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; dataItem &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; data)&lt;br&gt;                            Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;  {0}&lt;/span&gt;&amp;quot;, dataItem.ToString());&lt;br&gt;                        Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt; Done.&lt;/span&gt;&amp;quot;);&lt;br&gt;                    }&lt;br&gt;                }&lt;br&gt;            }&lt;br&gt;            &lt;span style="color:#0000ff"&gt;catch&lt;/span&gt; (Exception ex)&lt;br&gt;            {&lt;br&gt;                &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&amp;quot;&lt;span style="color:#8b0000"&gt;HRESULT 0x80005006&lt;/span&gt;&amp;quot; == ex.Message)&lt;br&gt;                    Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt; Property IPSecurity does not exist at {0}&lt;/span&gt;&amp;quot;, metabasePath);&lt;br&gt;                &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;                    Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000"&gt;Failed in SetIPSecurityProperty with the following exception: \n{0}&lt;/span&gt;&amp;quot;, ex.Message);&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt; &lt;br&gt;&lt;span style="color:#0000ff"&gt;        static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;[] args)&lt;br&gt;        {&lt;br&gt;&lt;br&gt;            &lt;span style="color:#008000"&gt;// 获取目前服务器上有哪些站点&lt;/span&gt;&lt;br&gt;            DirectoryEntry root = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; DirectoryEntry(&amp;quot;&lt;span style="color:#8b0000"&gt;IIS://localhost/W3SVC&lt;/span&gt;&amp;quot;);&lt;br&gt;            &lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt; (DirectoryEntry dir &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; root.Children)&lt;br&gt;            {&lt;br&gt;                &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (dir.SchemaClassName == &amp;quot;&lt;span style="color:#8b0000"&gt;IIsWebServer&lt;/span&gt;&amp;quot;)&lt;br&gt;                {&lt;br&gt;                    &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; ww = dir.Properties[&amp;quot;&lt;span style="color:#8b0000"&gt;ServerComment&lt;/span&gt;&amp;quot;].Value.ToString();&lt;br&gt;&lt;br&gt;                    Console.Write(&amp;quot;&lt;span style="color:#8b0000"&gt;IIS://localhost/W3SVC/{0}/ROOT/  {1}\r\n&lt;/span&gt;&amp;quot;, dir.Name, ww);&lt;br&gt;                }&lt;br&gt;            }&lt;br&gt;&lt;br&gt;&lt;br&gt;            &lt;span style="color:#008000"&gt;// IPDeny();&lt;/span&gt;&lt;br&gt;&lt;br&gt;            SetIPSecurityProperty(&amp;quot;&lt;span style="color:#8b0000"&gt;IIS://localhost/w3svc/1/root&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000"&gt;IPDeny&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000"&gt;192.168.5.79&lt;/span&gt;&amp;quot;);&lt;br&gt;&lt;br&gt;            Console.ReadLine();&lt;br&gt;        }&lt;br&gt;&lt;/pre&gt;
&lt;p&gt; 
&lt;p&gt;&lt;strong&gt;参考资料:&lt;/strong&gt;
&lt;p&gt;Blocking IIS IP Addresses with ASP.NET &lt;br&gt;&lt;a title="http://www.west-wind.com/WebLog/posts/59731.aspx" href="http://www.west-wind.com/WebLog/posts/59731.aspx"&gt;http://www.west-wind.com/WebLog/posts/59731.aspx&lt;/a&gt;
&lt;p&gt;How to Programmatically add IP Addresses to IIS's Deny Access List &lt;br&gt;&lt;a title="http://www.codeproject.com/KB/security/iiswmi.aspx" href="http://www.codeproject.com/KB/security/iiswmi.aspx"&gt;http://www.codeproject.com/KB/security/iiswmi.aspx&lt;/a&gt;
&lt;p&gt;HOWTO： 通过 IP 地址或域名称限制站点访问 &lt;br&gt;&lt;a title="http://support.microsoft.com/default.aspx/kb/324066" href="http://support.microsoft.com/default.aspx/kb/324066"&gt;http://support.microsoft.com/default.aspx/kb/324066&lt;/a&gt;
&lt;p&gt;使用ADSI来操作IIS的路径 &lt;br&gt;&lt;a title="http://blog.joycode.com/ghj/archive/2004/06/08/24047.aspx" href="http://blog.joycode.com/ghj/archive/2004/06/08/24047.aspx"&gt;http://blog.joycode.com/ghj/archive/2004/06/08/24047.aspx&lt;/a&gt;
&lt;p&gt;Setting IP Security Using System.DirectoryServices &lt;br&gt;&lt;a title="http://www.cnblogs.com/drw/articles/17951.html" href="http://www.cnblogs.com/drw/articles/17951.html"&gt;http://www.cnblogs.com/drw/articles/17951.html&lt;/a&gt;
&lt;p&gt;如何通过WEB方式，来控制iis的禁用IP名单。 &lt;br&gt;&lt;a title="http://blog.joycode.com/ghj/archive/2004/06/08/24075.aspx" href="http://blog.joycode.com/ghj/archive/2004/06/08/24075.aspx"&gt;http://blog.joycode.com/ghj/archive/2004/06/08/24075.aspx&lt;/a&gt;
&lt;p&gt;Setting IP Security Using System.DirectoryServices &lt;br&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/ms524322(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/ms524322(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms524322(VS.85).aspx&lt;/a&gt;
&lt;p&gt;how to automate adding denied IPs for IIS
&lt;p&gt;&lt;a title="http://www.nukeforums.com/forums/viewtopic.php?p=54746&amp;amp;highlight=&amp;amp;sid=1176c746e2037ed24acac86dd53ca747" href="http://www.nukeforums.com/forums/viewtopic.php?p=54746&amp;amp;highlight=&amp;amp;sid=1176c746e2037ed24acac86dd53ca747"&gt;http://www.nukeforums.com/forums/viewtopic.php?p=54746&amp;amp;highlight=&amp;amp;sid=1176c746e2037ed24acac86dd53ca747&lt;/a&gt;
&lt;p&gt;IIS 7.0: Configure IPv4 Address and Domain Name Allow Rules &lt;br&gt;&lt;a title="http://technet2.microsoft.com/windowsserver2008/en/library/d0de9475-0439-4ec1-8337-2bcedacd15c71033.mspx?mfr=true" href="http://technet2.microsoft.com/windowsserver2008/en/library/d0de9475-0439-4ec1-8337-2bcedacd15c71033.mspx?mfr=true"&gt;http://technet2.microsoft.com/windowsserver2008/en/library/d0de9475-0439-4ec1-8337-2bcedacd15c71033.mspx?mfr=true&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+%e5%8a%a8%e6%80%81%e5%b0%81%e6%9d%80%e4%b8%8e%e8%a7%a3%e5%b0%81IP&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><category>IIS</category><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!279.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!279.entry</guid><pubDate>Wed, 07 May 2008 02:33:28 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!279/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!279.entry#comment</wfw:comment><dcterms:modified>2008-05-07T02:33:28Z</dcterms:modified></item><item><title>每个分类取最新的几条的SQL实现</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!277.entry</link><description>&lt;p&gt; &lt;p&gt;分类统计时候，我们可能经常会碰到这样的需求，每个分类按照一定顺序，取几条数据，然后在一起显示。 &lt;p&gt;这个问题的解决方法，我们通过搜索引擎，可以找到很多中。但是不是SQL语句过于复杂，就是在数据量比较大时候，性能特别成问题。 &lt;p&gt;今天我就碰到这样一个需求。而我自己的解决方案就是SQL过于复杂，或者性能比较差的。为此我在CSDN论坛发了个帖子，看有没有更好的解决方案。 &lt;p&gt;&lt;a title="http://topic.csdn.net/u/20080504/14/5c5866c3-8b91-45ef-ab17-f994f88f8e42.html?seed=170373" href="http://topic.csdn.net/u/20080504/14/5c5866c3-8b91-45ef-ab17-f994f88f8e42.html"&gt;http://topic.csdn.net/u/20080504/14/5c5866c3-8b91-45ef-ab17-f994f88f8e42.html&lt;/a&gt; &lt;p&gt;&lt;a href="http://forum.csdn.net/BList/MSSQL/" target="_blank"&gt;CSDN的 SQL Server 板块&lt;/a&gt;  不愧是高手云集，问题发出不到半小时，就获得了近10种解决方案。经过测试，我把性能最高，且SQL不复杂的方案整理出来。特别感谢 &lt;a href="http://hi.csdn.net/jinjazz" target="_blank"&gt;jinjazz&lt;/a&gt; 的解答。 &lt;p&gt;  &lt;p&gt;&lt;strong&gt;问题详细描述如下：&lt;/strong&gt; &lt;p&gt;比如，假设我们有下面这样结构的一张表，这张表的数据量非常巨大。&lt;pre&gt;&lt;span style="color:#0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color:#0000ff"&gt;TABLE&lt;/span&gt; &lt;span style="color:#0000ff"&gt;table&lt;/span&gt;1&lt;br&gt;(&lt;br&gt;    [ID] [&lt;span style="color:#0000ff"&gt;bigint&lt;/span&gt;] &lt;span style="color:#0000ff"&gt;IDENTITY&lt;/span&gt;(1,1) &lt;span style="color:#0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color:#0000ff"&gt;NULL&lt;/span&gt;,&lt;br&gt;    [Name] [&lt;span style="color:#0000ff"&gt;nvarchar&lt;/span&gt;](128) &lt;span style="color:#0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color:#0000ff"&gt;NULL&lt;/span&gt;,&lt;br&gt;    [class] &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; &lt;span style="color:#0000ff"&gt;not&lt;/span&gt; &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;,&lt;br&gt;    [&lt;span style="color:#0000ff"&gt;date&lt;/span&gt;] &lt;span style="color:#0000ff"&gt;datetime&lt;/span&gt; &lt;span style="color:#0000ff"&gt;not&lt;/span&gt; &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;&lt;br&gt;)&lt;/pre&gt;
&lt;p&gt;class 表示分类编号。 分类数不固定， 至少有上千种分类 &lt;br&gt;date 表示该条记录被更新的时间 &lt;br&gt;我们现在想获得每个分类最新被更新的5条记录。
&lt;p&gt; 
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;&lt;pre&gt;&lt;span style="color:#0000ff"&gt;select&lt;/span&gt; id,name,class,&lt;span style="color:#0000ff"&gt;date&lt;/span&gt; &lt;span style="color:#0000ff"&gt;from&lt;/span&gt;(&lt;br&gt;&lt;span style="color:#0000ff"&gt;select&lt;/span&gt; id,name,class,&lt;span style="color:#0000ff"&gt;date&lt;/span&gt; ,row_number() &lt;span style="color:#0000ff"&gt;over&lt;/span&gt;(partition &lt;span style="color:#0000ff"&gt;by&lt;/span&gt; class &lt;span style="color:#0000ff"&gt;order&lt;/span&gt; &lt;span style="color:#0000ff"&gt;by&lt;/span&gt; &lt;span style="color:#0000ff"&gt;date&lt;/span&gt; &lt;span style="color:#0000ff"&gt;desc&lt;/span&gt;)&lt;br&gt;&lt;span style="color:#0000ff"&gt;as&lt;/span&gt; rowindex &lt;span style="color:#0000ff"&gt;from&lt;/span&gt; &lt;span style="color:#0000ff"&gt;table&lt;/span&gt;1) a&lt;br&gt;&lt;span style="color:#0000ff"&gt;where&lt;/span&gt; rowindex &amp;lt;= 5&lt;/pre&gt;
&lt;p&gt; 
&lt;p&gt;&lt;strong&gt;解决方案简单说明：&lt;/strong&gt;
&lt;p&gt;这个解决方案的关键就是使用了SQL 2005 的 ROW_NUMBER 这个全新的函数。
&lt;p&gt;ROW_NUMBER ( ) 函数的语法如下：&lt;br&gt;ROW_NUMBER ( )     OVER ( [ &amp;lt;partition_by_clause&amp;gt; ] &amp;lt;order_by_clause&amp;gt; )
&lt;p&gt;OVER 子句中的 PARTITION BY 将结果集分为多个分区。&lt;br&gt;OVER 子句中的 ORDER BY 将对 ROW_NUMBER 进行排序。
&lt;p&gt;下面是MSDN的几个简单例子：
&lt;p&gt; 
&lt;p&gt;以下示例将根据年初至今的销售额，返回 AdventureWorks 中销售人员的 ROW_NUMBER。 &lt;pre&gt;&lt;span style="color:#0000ff"&gt;USE&lt;/span&gt; AdventureWorks; &lt;br&gt;&lt;span style="color:#0000ff"&gt;GO&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;SELECT&lt;/span&gt; c.FirstName, c.LastName ,&lt;br&gt;ROW_NUMBER() &lt;span style="color:#0000ff"&gt;OVER&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff"&gt;BY&lt;/span&gt; SalesYTD &lt;span style="color:#0000ff"&gt;DESC&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;AS&lt;/span&gt; '&lt;span style="color:#8b0000"&gt;Row Number&lt;/span&gt;' ,s.SalesYTD, a.PostalCode &lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;FROM&lt;/span&gt; Sales.SalesPerson s &lt;span style="color:#0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color:#0000ff"&gt;JOIN&lt;/span&gt; Person.Contact c &lt;span style="color:#0000ff"&gt;ON&lt;/span&gt; s.SalesPersonID = c.ContactID &lt;br&gt;&lt;span style="color:#0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color:#0000ff"&gt;JOIN&lt;/span&gt; Person.Address a &lt;span style="color:#0000ff"&gt;ON&lt;/span&gt; a.AddressID = c.ContactID &lt;br&gt;&lt;span style="color:#0000ff"&gt;WHERE&lt;/span&gt; TerritoryID &lt;span style="color:#0000ff"&gt;IS&lt;/span&gt; &lt;span style="color:#0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color:#0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color:#0000ff"&gt;AND&lt;/span&gt; SalesYTD &amp;lt;&amp;gt; 0; &lt;br&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;以下示例将返回行号为 50 到 60 的行（包含这两行），并按 OrderDate 进行排序。 &lt;pre&gt;&lt;span style="color:#0000ff"&gt;USE&lt;/span&gt; AdventureWorks; &lt;br&gt;&lt;span style="color:#0000ff"&gt;GO&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;WITH&lt;/span&gt; OrderedOrders &lt;span style="color:#0000ff"&gt;AS&lt;/span&gt; ( &lt;span style="color:#0000ff"&gt;SELECT&lt;/span&gt; SalesOrderID, OrderDate, &lt;br&gt;ROW_NUMBER() &lt;span style="color:#0000ff"&gt;OVER&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff"&gt;BY&lt;/span&gt; OrderDate) &lt;span style="color:#0000ff"&gt;AS&lt;/span&gt; '&lt;span style="color:#8b0000"&gt;RowNumber&lt;/span&gt;' &lt;br&gt;&lt;span style="color:#0000ff"&gt;FROM&lt;/span&gt; Sales.SalesOrderHeader ) &lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;SELECT&lt;/span&gt; * &lt;span style="color:#0000ff"&gt;FROM&lt;/span&gt; OrderedOrders &lt;span style="color:#0000ff"&gt;WHERE&lt;/span&gt; RowNumber &lt;span style="color:#0000ff"&gt;BETWEEN&lt;/span&gt; 50 &lt;span style="color:#0000ff"&gt;AND&lt;/span&gt; 60; &lt;/pre&gt;
&lt;p&gt;&lt;br&gt;  &lt;p&gt;以下示例说明了如何使用 PARTITION BY 参数。 &lt;pre&gt;&lt;span style="color:#0000ff"&gt;USE&lt;/span&gt; AdventureWorks; &lt;br&gt;&lt;span style="color:#0000ff"&gt;GO&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;SELECT&lt;/span&gt; c.FirstName, c.LastName ,&lt;br&gt;ROW_NUMBER() &lt;span style="color:#0000ff"&gt;OVER&lt;/span&gt; (PARTITION &lt;span style="color:#0000ff"&gt;BY&lt;/span&gt; PostalCode &lt;span style="color:#0000ff"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff"&gt;BY&lt;/span&gt; SalesYTD &lt;span style="color:#0000ff"&gt;DESC&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;AS&lt;/span&gt; '&lt;span style="color:#8b0000"&gt;Row Number&lt;/span&gt;' ,&lt;br&gt;s.SalesYTD, a.PostalCode &lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;FROM&lt;/span&gt; Sales.SalesPerson s &lt;span style="color:#0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color:#0000ff"&gt;JOIN&lt;/span&gt; Person.Contact c &lt;span style="color:#0000ff"&gt;ON&lt;/span&gt; s.SalesPersonID = c.ContactID &lt;br&gt;&lt;span style="color:#0000ff"&gt;INNER&lt;/span&gt; &lt;span style="color:#0000ff"&gt;JOIN&lt;/span&gt; Person.Address a &lt;span style="color:#0000ff"&gt;ON&lt;/span&gt; a.AddressID = c.ContactID &lt;br&gt;&lt;span style="color:#0000ff"&gt;WHERE&lt;/span&gt; TerritoryID &lt;span style="color:#0000ff"&gt;IS&lt;/span&gt; &lt;span style="color:#0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color:#0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color:#0000ff"&gt;AND&lt;/span&gt; SalesYTD &amp;lt;&amp;gt; 0; &lt;/pre&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+%e6%af%8f%e4%b8%aa%e5%88%86%e7%b1%bb%e5%8f%96%e6%9c%80%e6%96%b0%e7%9a%84%e5%87%a0%e6%9d%a1%e7%9a%84SQL%e5%ae%9e%e7%8e%b0&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><category>数据库相关</category><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!277.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!277.entry</guid><pubDate>Sun, 04 May 2008 07:24:38 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!277/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!277.entry#comment</wfw:comment><dcterms:modified>2008-05-04T07:24:38Z</dcterms:modified></item><item><title>【编程游戏】划拳机器人比赛</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!274.entry</link><description>&lt;p&gt;CSDN 网友 zswang 组织了一个编程游戏比赛。划拳机器人比赛。类似“Robocode” 的游戏。  &lt;p&gt;比赛相关帖子如下： &lt;p&gt;【编程游戏】编写一个会划拳的机器人参加擂台赛，规则内详。&lt;br&gt;&lt;a title="http://topic.csdn.net/u/20080421/17/6a4d1c20-e1d1-4e9d-99ae-d648cb422ca6.html" href="http://topic.csdn.net/u/20080421/17/6a4d1c20-e1d1-4e9d-99ae-d648cb422ca6.html"&gt;http://topic.csdn.net/u/20080421/17/6a4d1c20-e1d1-4e9d-99ae-d648cb422ca6.html&lt;/a&gt; &lt;p&gt;【编程游戏】划拳机器人，前面一贴的机器人都集中来了，继续PK。谨慎路过。  &lt;br&gt;&lt;a title="http://topic.csdn.net/u/20080423/21/cda52758-a06d-49e1-9db0-eda2b009da8c.html" href="http://topic.csdn.net/u/20080423/21/cda52758-a06d-49e1-9db0-eda2b009da8c.html"&gt;http://topic.csdn.net/u/20080423/21/cda52758-a06d-49e1-9db0-eda2b009da8c.html&lt;/a&gt; &lt;p&gt;很有意思的，为了让更多人能参与到这个很有趣的 .NET 编程比赛中来，我转了下面的内容： &lt;p&gt;  &lt;p&gt;&lt;br&gt;&lt;strong&gt;划拳介绍&lt;/strong&gt; &lt;p&gt;      划拳又叫豁拳、猜枚、猜拳、拇战，即饮酒时两人同时伸出手指并各说一个数，谁说的数目跟双方所伸手指的总数相符，谁就算赢，输的人喝酒。此乃我国 &lt;br&gt;古传至今仍时尚流行的饮酒游戏，它增添酒兴，烘托喜庆，是一种民间的酒令。 其技巧性颇强，给玩者留有神机斗智的余地，且因玩时须喊叫，易让人兴奋，极富竞争性。 &lt;br&gt;　　两人同时伸出一只手，用攥起的拳头和伸出一到五个手指，表示从零到五这几个数字，与此同时，嘴里喊出从零到10的数字，如果两人伸出的手指表示的数字相加与其中一个人嘴里喊出的数字相同，那么这个人就算赢了这一拳。举例说明：比如一个人伸出了三个手指，另一个人伸出了四个手指，一个人喊了七，另一个喊了六,那么这个人喊七的人就赢了；如一个人伸出攥紧的拳头（表示零），嘴里喊出了三，而另一个恰好伸出了三个手指可嘴里喊的七，那么喊三的就赢了。就这么简单。当然，如果自己喊的是“八仙过海”， 而自己仅伸出了一个手指，那么对方即使伸出五指也不可能凑成八，这种拳就叫臭拳，如果不是事先约定，是要罚酒的。  &lt;p&gt;&lt;br&gt;    划拳规则看完了，那我们就开始写一个会划拳的机器人吧！ &lt;br&gt;    那么一个会划拳的机器会做什么事情呢？其实就是两件：  &lt;p&gt;&lt;br&gt;第一件、出拳，即：自己出几个手指？自己猜合计是多少。 &lt;br&gt;第二件、知道划拳的结果，即：对方出几个手指，对方猜合计是多少，是否获胜还是平局还是其他。 &lt;br&gt;   只要继承Drunkard这个类，重载Come()和Outcome()方法那么你就拥有了一个会划拳的机器人，参与这个游戏了！  &lt;p&gt;&lt;br&gt;&lt;strong&gt;【游戏规则】 &lt;br&gt;&lt;/strong&gt;1、比赛共1000局，即：出现胜负算一局，如出拳100次没有结果也算一局并双方均不得分； &lt;br&gt;2、赢一局得1分、输不扣分； &lt;br&gt;3、机器人执行中每出现一次异常，扣100分、对方加1分、记一局； &lt;br&gt;4、机器人执行中反应超时1000毫秒直接判负，每超时100毫秒，扣1分，超时10次以上直接判负； &lt;br&gt;5、自己得分高于对手并大于600分判胜； &lt;br&gt;6、自己得分为正数对手得分为负数判胜； &lt;br&gt;7、其他情况则判平。 &lt;br&gt;具体执行的过程，算法的过程请参考Drunkery &amp;lt;T1, T2&amp;gt;类的实现  &lt;p&gt;&lt;br&gt;&lt;strong&gt;【入门提示】 &lt;br&gt;&lt;/strong&gt;1、机器人的命名建议是： &amp;lt;自己的id&amp;gt; +  &amp;lt;第几个&amp;gt; + &amp;quot;号&amp;quot;，如：Zswang一号、Zswang二号，当然你也可以用“长江七号” &lt;br&gt;2、不允许修改Drunkard和Drunkery &amp;lt;T1, T2&amp;gt;； &lt;br&gt;3、机器人必须从Drunkard继承； &lt;br&gt;4、分析擂主代码是战胜擂主的关键； &lt;br&gt;5、打擂容易守擂难，大家自由发挥吧！ &lt;p&gt; &lt;br&gt;&lt;strong&gt;【擂台赛规则】 &lt;br&gt;&lt;/strong&gt;1、第一个打败擂主的机器人奖励20分，并成为新的擂主； &lt;br&gt;2、自己不能挑战自己编写的机器人； &lt;br&gt;3、最后一个擂主获得200专家分，发帖另付； &lt;br&gt;4、其余分数酌情散掉。 &lt;br&gt;标准代码和比赛规则有什么不妥或者建议欢迎讨论，谢谢关注 &lt;br&gt;(调试代码参考后面两帖，-_-!!!代码有点多，先别抢沙发。。。。) &lt;p&gt;  &lt;p&gt;由于空间有限， 这里就不贴调试代码了， 调试代码，以及基类代码看上面给的两个帖子的链接。&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+%e3%80%90%e7%bc%96%e7%a8%8b%e6%b8%b8%e6%88%8f%e3%80%91%e5%88%92%e6%8b%b3%e6%9c%ba%e5%99%a8%e4%ba%ba%e6%af%94%e8%b5%9b&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><category>.net 技术</category><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!274.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!274.entry</guid><pubDate>Thu, 24 Apr 2008 02:20:21 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!274/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!274.entry#comment</wfw:comment><dcterms:modified>2008-04-24T02:20:21Z</dcterms:modified></item><item><title>如何用.net Remoting实现一个客户端需要连接多个服务器端？</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!272.entry</link><description>&lt;p&gt; &lt;p&gt;比如我们有下面的需求: &lt;p&gt;三台电脑:A,B,C。&lt;br&gt;我们在 B 和 C 上部署了同样的一个服务，电脑 A 需要根据客户端的选择，自动的切换到底是调用B的服务，还是C的服务。 &lt;p&gt;要实现这个需求，核心就在客户端的调用上。下面我们用一个简单的演示这个功能的代码来说明如何实现。 &lt;p&gt;  &lt;p&gt;首先：&lt;strong&gt;服务器段&lt;/strong&gt; &lt;p&gt;服务器段逻辑，这是非常简单的，我们按照之前的.net编写规范，编写代码即可。熟悉.net Remoting 的完全可以跳过这部分。 &lt;p&gt;下面是一段简单的服务器段逻辑代码&lt;pre&gt;&lt;span style="color:#0000ff"&gt;using&lt;/span&gt; System;&lt;br&gt;&lt;span style="color:#0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br&gt;&lt;span style="color:#0000ff"&gt;using&lt;/span&gt; System.Text;&lt;br&gt;&lt;span style="color:#0000ff"&gt;using&lt;/span&gt; System.Net;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;namespace&lt;/span&gt; MyServiceComponent&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; MyComponent : MarshalByRefObject&lt;br&gt;    {&lt;br&gt;        &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; GetString(&lt;span style="color:#0000ff"&gt;short&lt;/span&gt; s)&lt;br&gt;        {&lt;br&gt;            &lt;span style="color:#008000"&gt;// 返回信息中包含服务器IP，这样我们就知道客户端调用的是哪个服务器&lt;/span&gt;&lt;br&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (s &amp;lt;= 10)&lt;br&gt;                &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000"&gt;&amp;lt;=10  {0}&lt;/span&gt;&amp;quot;, GetIP());&lt;br&gt;            &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;                &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000"&gt;大于10  {0}&lt;/span&gt;&amp;quot;, GetIP());&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; GetIP()   &lt;span style="color:#008000"&gt;//获取本地IP   &lt;/span&gt;&lt;br&gt;        {&lt;br&gt;            IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());&lt;br&gt;            IPAddress ipAddr = ipHost.AddressList[0];&lt;br&gt;            &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; ipAddr.ToString();&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;/pre&gt;
&lt;p&gt;服务器段的配置&lt;pre&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;?&lt;/span&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;span style="color:#0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;system.runtime.remoting&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;application&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;service&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;wellknown&lt;/span&gt; &lt;span style="color:#ff0000"&gt;mode&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;Singleton&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;MyServiceComponent.MyComponent, MyServiceComponent&amp;quot;&lt;/span&gt; &lt;br&gt;                   &lt;span style="color:#ff0000"&gt;objectUri&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;HongjunguoRemotingService&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;service&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;channels&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#008000"&gt;&amp;lt;!-- 这里的配置方法，请参看MSDN中  远程处理安全通道技术示例  --&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;channel&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ref&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;tcp&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;port&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;8088&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;secure&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;  &lt;span style="color:#ff0000"&gt;impersonate&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;br&gt;                 &lt;span style="color:#ff0000"&gt;protectionLevel&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;EncryptAndSign&amp;quot;&lt;/span&gt;  &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;serverProviders&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;          &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;formatter&lt;/span&gt; &lt;span style="color:#ff0000"&gt;href&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;binary&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;typeFilterLevel&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;Full&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;serverProviders&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;channels&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;application&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#008000"&gt;&amp;lt;!-- &lt;br&gt;     只有把 customErrors 配置成 Off ，服务器端的详细错误异常，才能传递到客户端 &lt;br&gt;     默认是不传递完整的错误异常的。&lt;br&gt;     --&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;customErrors&lt;/span&gt; &lt;span style="color:#ff0000"&gt;mode&lt;/span&gt; =&lt;span style="color:#0000ff"&gt;&amp;quot;Off&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;system.runtime.remoting&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;服务器段调用代码&lt;pre&gt;RemotingConfiguration.Configure(&lt;br&gt;     AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, &lt;span style="color:#0000ff"&gt;false&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt; 
&lt;p&gt;&lt;strong&gt;客户端&lt;/strong&gt;
&lt;p&gt;客户端如果我们用以前常用的，把所有客户端的调用信息都写在一个配置文件中，期望简单的用下面代码就不可以了。 &lt;pre&gt; RemotingConfiguration.Configure(configFile, true);&lt;/pre&gt;
&lt;p&gt;如果我们用上面的方法时，则会收到下面的异常：
&lt;p&gt;远程处理配置失败，异常为“System.Runtime.Remoting.RemotingException: &lt;br&gt;试图重定向类型“MyServiceComponent.MyComponent, MyServiceComponent”的激活，而该类型已被重定向。&lt;br&gt;   在 System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.AddWellKnownClientType(WellKnownClientTypeEntry entry)&lt;br&gt;   在 System.Runtime.Remoting.RemotingConfigHandler.RegisterWellKnownClientType(WellKnownClientTypeEntry entry)&lt;br&gt;   在 System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownClientType(WellKnownClientTypeEntry entry)&lt;br&gt;   在 System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.StoreRemoteAppEntries(RemotingXmlConfigFileData configData)&lt;br&gt;   在 System.Runtime.Remoting.RemotingConfigHandler.ConfigureRemoting(RemotingXmlConfigFileData configData, Boolean ensureSecurity)”。
&lt;p&gt;参考我在论坛咨询的帖子远程处理配置失败，异常为“RemotingException: 试图重定向类型“MySC.MyComponent, MyServiceComponent”的激活，而该类型已被重定向   &lt;br&gt;&lt;a title="http://topic.csdn.net/u/20080418/10/a9b02fa0-a230-4fb6-abeb-b7407a6729c1.html" href="http://topic.csdn.net/u/20080418/10/a9b02fa0-a230-4fb6-abeb-b7407a6729c1.html"&gt;http://topic.csdn.net/u/20080418/10/a9b02fa0-a230-4fb6-abeb-b7407a6729c1.html&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;使用.net Remoting 客户端调用服务器段时，需要考虑两个东西：&lt;/strong&gt;&lt;br&gt;1、信道的问题（Channel）
&lt;p&gt;2、如何创建远程对象，也就是注册类型
&lt;p&gt; 
&lt;p&gt;先说信道的问题：
&lt;p&gt;上面例子中， B 和 C 服务器，他们完全可能一个开放的是 TCP 信道，一个开放的是 HTTP 信道。 同时，访问他们服务时，身份验证完全可能是不同的。各自服务器自身的验证。
&lt;p&gt;这就有一个需要解决的问题，如何实现客户端多信道。下面这篇博客对此有比较详细的介绍：&lt;br&gt;Remoting多个信道(Chennel)的注册问题&lt;strong&gt;&lt;br&gt;&lt;a title="http://www.cnblogs.com/kriss/archive/2005/11/30/288177.html" href="http://www.cnblogs.com/kriss/archive/2005/11/30/288177.html"&gt;http://www.cnblogs.com/kriss/archive/2005/11/30/288177.html&lt;/a&gt;&lt;/strong&gt;
&lt;p&gt; 
&lt;p&gt;&lt;strong&gt;创建远程对象的问题：&lt;/strong&gt;
&lt;p&gt;如果我们把需要创建的信息写在配置文件中，用 RemotingConfiguration.Configure(configFile, true); 来创建远程对象，就会出现下面的错误。
&lt;p&gt; 
&lt;p&gt;远程处理配置失败，异常为“System.Runtime.Remoting.RemotingException: &lt;br&gt;试图重定向类型“MyServiceComponent.MyComponent, MyServiceComponent”的激活，而该类型已被重定向。&lt;br&gt;   在 System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.AddWellKnownClientType(WellKnownClientTypeEntry entry)&lt;br&gt;   在 System.Runtime.Remoting.RemotingConfigHandler.RegisterWellKnownClientType(WellKnownClientTypeEntry entry)&lt;br&gt;   在 System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownClientType(WellKnownClientTypeEntry entry)&lt;br&gt;   在  System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.StoreRemoteAppEntries(RemotingXmlConfigFileData configData)&lt;br&gt;   在 System.Runtime.Remoting.RemotingConfigHandler.ConfigureRemoting (RemotingXmlConfigFileData configData, Boolean ensureSecurity)”。
&lt;p&gt; 
&lt;p&gt;解决方法，就是下面的演示代码，不写在配置文件中，改自己手工创建，如下面客户端演示代码。
&lt;p&gt;编码创建对象可以使用 Activator.GetObject 或者 Activator.CreateInstance 。
&lt;p&gt;下面就是我的演示代码
&lt;p&gt;针对B服务器的配置文件（主要是通道的配置，注意这两个配置文件验证信息不一样）
&lt;p&gt;注意，这个配置文件中我们可没有下面这样的信息：
&lt;p&gt;    &amp;lt;client displayName=&amp;quot;client01&amp;quot; &amp;gt;&lt;br&gt;        &amp;lt;wellknown &lt;br&gt;          displayName =&amp;quot;Wellknown1&amp;quot;&lt;br&gt;          type=&amp;quot;MyServiceComponent.MyComponent,MyServiceComponent&amp;quot;&lt;br&gt;                url=&amp;quot;tcp://192.168.5.2:8088/HongjunguoRemotingService&amp;quot; /&amp;gt;&lt;br&gt;      &amp;lt;/client&amp;gt;
&lt;p&gt;&lt;br&gt;s1.config&lt;pre&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;?&lt;/span&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;span style="color:#0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;system.runtime.remoting&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;application&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;channels&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#008000"&gt;&amp;lt;!-- &lt;br&gt;        这里的配置方法，请参看MSDN中  远程处理安全通道技术示例&lt;br&gt;        这个技术请参看：&lt;br&gt;        &lt;br&gt;        http://www.cnblogs.com/zhengyun_ustc/archive/2006/06/09/remoting_InvalidCredentialException.html&lt;br&gt;        http://forums.asp.net/thread/1626741.aspx&lt;br&gt;        --&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;channel&lt;/span&gt;  &lt;span style="color:#ff0000"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;Channel1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ref&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;tcp&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;port&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;8081&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;secure&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;br&gt;                  &lt;span style="color:#ff0000"&gt;tokenImpersonationLevel&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;impersonation&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;protectionLevel&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;EncryptAndSign&amp;quot;&lt;/span&gt;  &lt;br&gt;                  &lt;span style="color:#ff0000"&gt;username&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;ghj1976&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;password&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;*****&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;domain&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;*****&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;clientProviders&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;          &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;formatter&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ref&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;binary&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;typeFilterLevel&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;Full&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;clientProviders&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;channels&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;application&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;customErrors&lt;/span&gt; &lt;span style="color:#ff0000"&gt;mode&lt;/span&gt; =&lt;span style="color:#0000ff"&gt;&amp;quot;Off&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;system.runtime.remoting&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt; 
&lt;p&gt;针对C服务器的配置文件（主要是通道的配置，注意这两个配置文件验证信息不一样）&lt;br&gt;s2.config&lt;pre&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;?&lt;/span&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;span style="color:#0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;system.runtime.remoting&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;application&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;channels&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;channel&lt;/span&gt; &lt;span style="color:#ff0000"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;Channel2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ref&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;tcp&amp;quot;&lt;/span&gt;  &lt;span style="color:#ff0000"&gt;port&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;8082&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;secure&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;br&gt;                 &lt;span style="color:#ff0000"&gt;tokenImpersonationLevel&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;impersonation&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;protectionLevel&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;EncryptAndSign&amp;quot;&lt;/span&gt;&lt;br&gt;                 &lt;span style="color:#ff0000"&gt;username&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;communityserver&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;password&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;****&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;domain&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;***&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;clientProviders&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;          &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;formatter&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ref&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;binary&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;typeFilterLevel&lt;/span&gt;=&lt;span style="color:#0000ff"&gt;&amp;quot;Full&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;clientProviders&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;channels&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;application&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;customErrors&lt;/span&gt; &lt;span style="color:#ff0000"&gt;mode&lt;/span&gt; =&lt;span style="color:#0000ff"&gt;&amp;quot;Off&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;system.runtime.remoting&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt; 
&lt;p&gt;客户端程序的调用代码&lt;pre&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; partial &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; ClientForm : Form&lt;br&gt;    {&lt;br&gt;        &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; ClientForm()&lt;br&gt;        {&lt;br&gt;            InitializeComponent();&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;, MyServiceComponent.MyComponent&amp;gt; dict = &lt;br&gt;            &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;, MyServiceComponent.MyComponent&amp;gt;(2);&lt;br&gt;&lt;br&gt;&lt;br&gt;        &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; button1_Click(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br&gt;        {&lt;br&gt;            &lt;span style="color:#0000ff"&gt;short&lt;/span&gt; ss = 0;&lt;br&gt;&lt;br&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (!&lt;span style="color:#0000ff"&gt;short&lt;/span&gt;.TryParse(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.textBox1.Text, &lt;span style="color:#0000ff"&gt;out&lt;/span&gt; ss))&lt;br&gt;                &lt;span style="color:#0000ff"&gt;return&lt;/span&gt;;&lt;br&gt;&lt;br&gt;            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; key = &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Empty;&lt;br&gt;            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; url = &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Empty;&lt;br&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (radioButton1.Checked)&lt;br&gt;            {&lt;br&gt;                key = &amp;quot;&lt;span style="color:#8b0000"&gt;s1.config&lt;/span&gt;&amp;quot;;&lt;br&gt;                url = &amp;quot;&lt;span style="color:#8b0000"&gt;tcp://192.168.5.2:8088/HongjunguoRemotingService&lt;/span&gt;&amp;quot;;&lt;br&gt;            }&lt;br&gt;            &lt;span style="color:#0000ff"&gt;else&lt;/span&gt; &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (radioButton2.Checked)&lt;br&gt;            {&lt;br&gt;                key = &amp;quot;&lt;span style="color:#8b0000"&gt;s2.config&lt;/span&gt;&amp;quot;;&lt;br&gt;                url = &amp;quot;&lt;span style="color:#8b0000"&gt;tcp://192.168.5.7:8088/HongjunguoRemotingService&lt;/span&gt;&amp;quot;;&lt;br&gt;            }&lt;br&gt;            &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;                &lt;span style="color:#0000ff"&gt;return&lt;/span&gt;;&lt;br&gt;&lt;br&gt;            MyServiceComponent.MyComponent com = &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;;&lt;br&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (!dict.TryGetValue(key, &lt;span style="color:#0000ff"&gt;out&lt;/span&gt; com))&lt;br&gt;            {&lt;br&gt;                &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; configFile = Path.Combine(&lt;br&gt;                    Path.GetDirectoryName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile), key);&lt;br&gt;&lt;br&gt;                RemotingConfiguration.Configure(configFile, &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;);&lt;br&gt;&lt;br&gt;                &lt;span style="color:#008000"&gt;//com = new MyServiceComponent.MyComponent();&lt;/span&gt;&lt;br&gt;                com = (MyServiceComponent.MyComponent)Activator.GetObject(&lt;br&gt;                    &lt;span style="color:#0000ff"&gt;typeof&lt;/span&gt;(MyServiceComponent.MyComponent), url);&lt;br&gt;&lt;br&gt;                dict.Add(key, com);&lt;br&gt;            }&lt;br&gt;            &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;            {&lt;br&gt;                &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (com == &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;return&lt;/span&gt;;&lt;br&gt;            }&lt;br&gt;&lt;br&gt;&lt;br&gt;            &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; www = com.GetString(ss);&lt;br&gt;            MessageBox.Show(www);&lt;br&gt;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;&lt;/pre&gt;
&lt;p&gt; 
&lt;p&gt;&lt;strong&gt;参考资料&lt;/strong&gt;
&lt;p&gt; 
&lt;p&gt;客户端提示 信道 http 已注册&lt;br&gt;&lt;a title="http://topic.csdn.net/t/20051219/15/4468126.html" href="http://topic.csdn.net/t/20051219/15/4468126.html"&gt;http://topic.csdn.net/t/20051219/15/4468126.html&lt;/a&gt;
&lt;p&gt;如何取消RemotingConfiguration.RegisterActivatedClientType的注册类型&lt;br&gt;&lt;a title="http://topic.csdn.net/t/20050116/16/3729762.html" href="http://topic.csdn.net/t/20050116/16/3729762.html"&gt;http://topic.csdn.net/t/20050116/16/3729762.html&lt;/a&gt;
&lt;p&gt; 
&lt;p&gt;RemotingConfiguration.Configure (String, Boolean) 中隐藏的秘密&lt;br&gt;&lt;a title="http://blog.csdn.net/blue_sky_blue_heart/archive/2006/08/28/1130914.aspx" href="http://blog.csdn.net/blue_sky_blue_heart/archive/2006/08/28/1130914.aspx"&gt;http://blog.csdn.net/blue_sky_blue_heart/archive/2006/08/28/1130914.aspx&lt;/a&gt;
&lt;p&gt;Remoting给远程对象属性赋值&lt;br&gt;&lt;a title="http://topic.csdn.net/u/20070614/15/1d5a7738-e676-489e-978a-b194579d560b.html" href="http://topic.csdn.net/u/20070614/15/1d5a7738-e676-489e-978a-b194579d560b.html"&gt;http://topic.csdn.net/u/20070614/15/1d5a7738-e676-489e-978a-b194579d560b.html&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=1107058300674074913&amp;page=RSS%3a+%e5%a6%82%e4%bd%95%e7%94%a8.net+Remoting%e5%ae%9e%e7%8e%b0%e4%b8%80%e4%b8%aa%e5%ae%a2%e6%88%b7%e7%ab%af%e9%9c%80%e8%a6%81%e8%bf%9e%e6%8e%a5%e5%a4%9a%e4%b8%aa%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%af%ef%bc%9f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ghj1976.spaces.live.com&amp;amp;GT1=ghj1976"&gt;</description><category>.net 技术</category><comments>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!272.entry#comment</comments><guid isPermaLink="true">http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!272.entry</guid><pubDate>Fri, 18 Apr 2008 07:53:10 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ghj1976.spaces.live.com/blog/cns!F5D0FA8B5536921!272/comments/feed.rss</wfw:commentRss><wfw:comment>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!272.entry#comment</wfw:comment><dcterms:modified>2008-04-18T07:53:10Z</dcterms:modified></item><item><title>今天碰到了一个我非常佩服的售票员</title><link>http://ghj1976.spaces.live.com/Blog/cns!F5D0FA8B5536921!270.entry</link><description>&lt;p&gt;我坐公交车的历史，已经有10多年了。今天早上坐852上班的路上，碰到了一个我非常佩服的售票员。佩服她的原因是因为这趟车上，我正好看到2件事情。而她对这两件事情的处理，让我非常有感触，非常有心得。 &lt;p&gt;  &lt;p&gt;第一件事情是在望京时，有个乘客下车时，这个售票员走到一个乘客跟前，小声地跟他说了一些话。当时我还觉得很怪异。虽然我就离那个乘客不到2米的地方。但是我只能断断续续的听到几个词。并不明白在说啥。那个乘客下车后，另外一个售票员也觉得很怪异，问她时，她才说那个乘客拿的是学生卡。 &lt;p&gt;那个乘客看起来，老大不小了。估计三、四十了。看起来一点也不可能是学生。按照北京市的规定，发现非学生使用学生卡，卡当时没收，同时罚款不知道多少。违法使用学生卡的事情，我在其他公交车上也看到，但是这个售票员能用这种方式来解决，我是第一次看到。以前最多看到的是：大声地指责，没收卡，或者根本就当这件事情没有发生。 &lt;p&gt;从跟人沟通的角度来看这个问题：争吵，或者视若不见。都不能帮人解决问题。跟他心平气和的沟通。同时一定不要在公众场合批评他，不能让他觉得自己在被公审。这才是督促他解决问题得最好沟通方式。 &lt;p&gt;反面的教材就多了，比如之前的最牛秘书的事情；公司最忌讳的一些事情，就是说某个事情时候，抄送邮件给很多人；公交车上很多时候乘客跟售票员的吵架，就是沟通方式不当导致，我们管理团队时，跟手下沟通方式不当，也会带来很多麻烦等等。 &lt;p&gt;这是我佩服这个售票员的第一个理由。 &lt;p&gt;  &lt;p&gt;第二件事情发生在西八间房（广顺南大街南口）这一站。有个乘客在下车刷卡时发现扣了自己8毛。按照正常，应该是扣6毛。这个乘客就为了这2毛钱。大发雷霆，说了很多难听的话。这个乘客是在后门下车的，当时后门的那个售票员已经有点发懵了。显然后门这个售票员经验不足。不知道如何处理这件事情。我佩服的这个售票员，飞快地从中门售票员位置上跑到后门，追上那个乘客，然后又很快的跑回自己位置。 &lt;p&gt;当时我们都觉得很奇怪，这个售票员就这么飞快的过去一趟，就再没听见那个乘客之前的大声门骂骂咧咧了。超级神奇。 &lt;p&gt;大家能猜到这个售票员追上那个乘客干了啥事情么？ &lt;p&gt;当然这事情后门的售票员也很奇怪，也替我们问了。 &lt;p&gt;这个我最佩服的售票员，追上这个乘客，给了他2毛硬币。 &lt;p&gt;坐公交多扣2毛，我自己都碰到过十多次。原因很简单，司机如果在每站的时候，按站号不及时，乘客刷卡时，刷的就是上一站的站号。系统当然按照上一站来计算费用，这样在一些多一站就要多交钱的情况时，就可能会多扣2毛。 &lt;p&gt;由于时刷卡系统扣掉了，想从刷卡系统讨回这两毛，非常困难，而售票员买票的所得又是以5毛为最小单位的。显然这个售票员自己备了一些零钱。而且这些钱很可能是需要从自己工