﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-hello</title><link>http://www.cnblogs.com/h-hello/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 18 Mar 2010 18:06:58 GMT</lastBuildDate><pubDate>Thu, 18 Mar 2010 18:06:58 GMT</pubDate><ttl>60</ttl><item><title>资料:ISAPI_rewrite中文手册及多站点配置方法</title><link>http://www.cnblogs.com/h-hello/articles/1683285.html</link><dc:creator>h-hello</dc:creator><author>h-hello</author><pubDate>Thu, 11 Mar 2010 03:27:00 GMT</pubDate><guid>http://www.cnblogs.com/h-hello/articles/1683285.html</guid><description><![CDATA[<p>阅读: 0 评论: 0 作者: <a href="http://www.cnblogs.com/h-hello/" target="_blank">h-hello</a> 发表于 2010-03-11 11:27 <a href="http://www.cnblogs.com/h-hello/articles/1683285.html" target="_blank">原文链接</a></p><div id="fp"><b>配置</b>：
<p>&nbsp;</p>
<p>　　在NT&nbsp;2000&nbsp;XP和2003平台上，在系统帐户下应该INETINFO程序应该与IIS5以共存模式过滤器运行。所以系统帐户应该给予对所有的ISAPI-REWIRITE&nbsp;DLLS&nbsp;和所有的HTTPD。INI文件至少可读权限，我们也推荐对给予系统帐户对于所有包括HTTPD。INI文件的文件夹的可写权限，这将允许产生HTTP。PARSE。ERRORS文件，这些文件包含配置文件语法错误。对于PROXY模块也需要额外的权限，因为它将运行于连接池或HIGH-ISPLATED应用模式，IIS帐户共享池和HIGH-ISOLATION池应被给予&nbsp;对RWHELPERE。DLL的可读权限。缺省情况下IWAM-《计算机名》被用于所有的池，在相应的COM+应用设置中应借助COM+ADMINISTRATION&nbsp;MMC&nbsp;SNAP-IN建立池帐户</p>
<p><b>配置文件格式化</b>：</p>
<p>　　有两种形式的配置文件-GLOBAL（SERVER-LEVEL）和INDIVIDUAL（SITE-LEVAL）文件，GLOBAL配置文件应被命名为HTTPD.INI并出现在ISAPI-REWRITE安装目录中，文件的快捷方式通过开始菜单提供，INDIVIDUAL配置文件应名为HTTPD。INI并且能够出现在虚拟站点的物理根目录中，两种类型的格式化是相同的并是标准的WINDOWS。INI文件，所有的指令都应该放在这一部分并且所有指令都应该以分隔线放置，任何这一部分以外的文本都将被忽略</p>
<p><b>HTTPD.INI文件示例</b></p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]
<p>&nbsp;</p>
<p>#&nbsp;This&nbsp;is&nbsp;a&nbsp;comment</p>
<p>#&nbsp;300&nbsp;=&nbsp;5&nbsp;minutes<br />CacheClockRate&nbsp;300<br />RepeatLimit&nbsp;20</p>
<p>#&nbsp;Block&nbsp;external&nbsp;access&nbsp;to&nbsp;the&nbsp;httpd.ini&nbsp;and&nbsp;httpd.parse.errors&nbsp;files<br />RewriteRule&nbsp;/httpd(?:\.ini|\.parse\.errors)&nbsp;/&nbsp;[F,I,O]</p>
<p>#&nbsp;Block&nbsp;external&nbsp;access&nbsp;to&nbsp;the&nbsp;Helper&nbsp;ISAPI&nbsp;Extension<br />RewriteRule&nbsp;.*\.isrwhlp&nbsp;/&nbsp;[F,I,O]</p>
<p>#&nbsp;Some&nbsp;custom&nbsp;rules<br />RewriteCond&nbsp;Host:&nbsp;(.+)</p>
</div>
<p>&nbsp;</p>
<p><b>RewriteCond&nbsp;指令</b></p>
<p>Syntax:（句法）&nbsp;RewriteCond&nbsp;TestVerb&nbsp;CondPattern&nbsp;[Flags]</p>
<p>这一指令定义一个条件规则，在&nbsp;RewriteRule&nbsp;或者&nbsp;RewriteHeader或&nbsp;RewriteProxy指令前预行RewriteCond指令，后面的规则&nbsp;只有它的，模式匹配URI的当前状态并且额外的条件也被应用才会被应用。</p>
<p><br /><b>TestVerb</b>&nbsp;</p>
<p>Specifies&nbsp;verb&nbsp;that&nbsp;will&nbsp;be&nbsp;matched&nbsp;against&nbsp;regular&nbsp;expression.<br />特别定义的动词匹配规定的表达式</p>
<p>TestVerb=(URL&nbsp;|&nbsp;METHOD&nbsp;|&nbsp;VERSION&nbsp;|&nbsp;HTTPHeaderName:&nbsp;|&nbsp;%ServerVariable)&nbsp;where:</p>
<p>URL&nbsp;-&nbsp;returns&nbsp;Request-URI&nbsp;of&nbsp;client&nbsp;request&nbsp;as&nbsp;described&nbsp;in&nbsp;RFC&nbsp;2068&nbsp;(HTTP&nbsp;1.1);&nbsp;<br />返回客户端在RFC2068中描述的需求的Request-URI<br />METHOD&nbsp;-&nbsp;returns&nbsp;HTTP&nbsp;method&nbsp;of&nbsp;client&nbsp;request&nbsp;(OPTIONS,&nbsp;GET,&nbsp;HEAD,&nbsp;POST,&nbsp;PUT,&nbsp;DELETE&nbsp;or&nbsp;TRACE);&nbsp;<br />返回客户端需求(OPTIONS,&nbsp;GET,&nbsp;HEAD,&nbsp;POST,&nbsp;PUT,&nbsp;DELETE&nbsp;or&nbsp;TRACE)的HTTP方法<br />VERSION&nbsp;-&nbsp;returns&nbsp;HTTP&nbsp;version;&nbsp;<br />返回HTTP版本<br />HTTPHeaderName&nbsp;-&nbsp;returns&nbsp;value&nbsp;of&nbsp;the&nbsp;specified&nbsp;HTTP&nbsp;header.&nbsp;HTTPHeaderName&nbsp;can&nbsp;be&nbsp;any&nbsp;valid&nbsp;HTTP&nbsp;header&nbsp;name.&nbsp;Header&nbsp;names&nbsp;should&nbsp;include&nbsp;the&nbsp;trailing&nbsp;colon&nbsp;":".&nbsp;If&nbsp;specified&nbsp;header&nbsp;does&nbsp;not&nbsp;exists&nbsp;in&nbsp;a&nbsp;client's&nbsp;request&nbsp;TestVerb&nbsp;is&nbsp;treated&nbsp;as&nbsp;empty&nbsp;string.&nbsp;<br />返回特定义的HTTP头文件的值</p>
<div class="code_head">Code:</div>
<div class="code_main">HTTPHeaderName&nbsp;=&nbsp;<br />Accept:<br />Accept-Charset:<br />Accept-Encoding:<br />Accept-Language:<br />Authorization:<br />Cookie:<br />From:<br />Host:<br />If-Modified-Since:<br />If-Match:<br />If-None-Match:<br />If-Range:<br />If-Unmodified-Since:<br />Max-Forwards:<br />Proxy-Authorization:<br />Range:<br />Referer:<br />User-Agent:<br />Any-Custom-Header</div>
<br />得到更多的关于HTTP头文件的和他们的值的信息参考RFC2068
<p>&nbsp;</p>
<p><br />ServerVariable&nbsp;返回特定义的服务器变量的值&nbsp;。例如服务器端口，全部服务器变量列表应在IIS文档中建立，变量名应用%符预定；<br />CondPattern&nbsp;<br />The&nbsp;regular&nbsp;expression&nbsp;to&nbsp;match&nbsp;TestVerb<br />规则表达式匹配TestVerb</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[Flags]<br />Flags&nbsp;is&nbsp;a&nbsp;comma-separated&nbsp;list&nbsp;of&nbsp;the&nbsp;following&nbsp;flags:</div>
<p>&nbsp;</p>
<p><br /><b>O&nbsp;(nOrmalize)&nbsp;</b></p>
<p>Normalizes&nbsp;string&nbsp;before&nbsp;processing.&nbsp;Normalization&nbsp;includes&nbsp;removing&nbsp;of&nbsp;an&nbsp;URL-encoding,&nbsp;illegal&nbsp;characters,&nbsp;etc.&nbsp;This&nbsp;flag&nbsp;is&nbsp;useful&nbsp;with&nbsp;URLs&nbsp;and&nbsp;URL-encoded&nbsp;headers</p>
<p><b>RewriteRule&nbsp;指令</b></p>
<p>Syntax:&nbsp;RewriteRule&nbsp;Pattern&nbsp;FormatString&nbsp;[Flags]<br />这个指令可以不止发生一次，每个指令定义一个单独的重写规则，这些规则的定义命令很重要，因为这个命令在应用运行时规则是有用途的</p>
<p>I&nbsp;(ignore&nbsp;case）</p>
<p>不管大小写强行指定字符匹配，这个FLAG影响RewriteRule指令和相应的RewriteCond&nbsp;指令</p>
<p>F&nbsp;(Forbidden)</p>
<p>对客户端做反应，停止REWRITING进程并且发送403错误，注意在这种情况下FORMATSTRING&nbsp;是无用的并可以设置为任何非空字符串。</p>
<p>L&nbsp;(last&nbsp;rule)</p>
<p>不应用任何重写规则在此停止重写进程，使用这个FLAG以阻止当前被重写的URI被后面的规则再次重写</p>
<p>N&nbsp;(Next&nbsp;iteration)</p>
<p>强制REWRITINGENGINE调整规则目标并且从头重启规则检查（所有修改将保存），重启次数由RepeatLimit指定的值限制，如果这个数值超过N&nbsp;FLAG将被忽略</p>
<p>NS&nbsp;(Next&nbsp;iteration&nbsp;of&nbsp;the&nbsp;same&nbsp;rule)</p>
<p>以N标记工作不从相同的规则重启规则规则进程（例如强制重复规则应用），通过RepeatLimit指令指定一个反复实行某一规则的最大数目，</p>
<p>P&nbsp;(force&nbsp;proxy)&nbsp;</p>
<p>强制目的URI在内部强制为代理需求并且立即通过ISAPI扩展应付代理需求，必须确认代理字符串是一个有效的URI包括协议&nbsp;主机等等否则代理将返回错误</p>
<p>R&nbsp;(explicit&nbsp;redirect）</p>
<p>强制服务器对客户端发出重定向指示即时应答，提供目的URI的新地址，重定向规则经常是最后规则</p>
<p>RP&nbsp;(permanent&nbsp;redirect)</p>
<p>几乎和[R]标记相同但是发布301HTTP状态而不是302HTTP状态代码</p>
<p>U&nbsp;(Unmangle&nbsp;Log)</p>
<p>当URI是源需求而不是重写需求时记载URI</p>
<p>O&nbsp;(nOrmalize)</p>
<p>在实行之前标准化字符串。标准化包括URL-ENCODING，不合法的字符的再移动等，这个标记对于URLS和URLS-ENDODED头是有用的&nbsp;</p>
<p>CL&nbsp;(Case&nbsp;Lower)&nbsp;</p>
<p>小写</p>
<p>CU&nbsp;(Case&nbsp;Upper)&nbsp;</p>
<p>大写</p>
<p><br /><b>RewriteHeader&nbsp;directive</b></p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">Syntax:&nbsp;RewriteHeader&nbsp;HeaderName&nbsp;Pattern&nbsp;FormatString&nbsp;[Flags]</div>
&nbsp;
<p>&nbsp;</p>
<p>这个指令是RewriteRule的更概括化变种，它不仅重写URL的客户端需求部分，而且重写HTTP头，这个指令不仅用于重写。生成，删除任何HTTP头，甚至改变客户端请求的方法</p>
<p>HeaderName&nbsp;</p>
<p>指定将被重写的客户头，可取的值与&nbsp;RewriteCond&nbsp;指令中TestVerb参数相同</p>
<p>Pattern<br />限定规则表达式以匹配Request-URI，<br />FormatString&nbsp;<br />限定将生成新的URI的FormatString&nbsp;<br />[Flags]<br />是一个下列FLAGS的命令分隔列表&nbsp;</p>
<p>I&nbsp;(ignore&nbsp;case）<br />不管大小写强行指定字符匹配，这个FLAG影响RewriteRule指令和相应的RewriteCond&nbsp;指令<br />F&nbsp;(Forbidden)<br />对客户端做反应，停止REWRITING进程并且发送403错误，注意在这种情况下FORMATSTRING&nbsp;是无用的并可以设置为任何非空字符串。<br />L&nbsp;(last&nbsp;rule)<br />不应用任何重写规则在此停止重写进程，使用这个FLAG以阻止当前被重写的URI被后面的规则再次重写<br />N&nbsp;(Next&nbsp;iteration)<br />强制REWRITINGENGINE调整规则目标并且从头重启规则检查（所有修改将保存），重启次数由RepeatLimit指定的值限制，如果这个数值超过N&nbsp;FLAG将被忽略</p>
<p>NS&nbsp;(Next&nbsp;iteration&nbsp;of&nbsp;the&nbsp;same&nbsp;rule)<br />以N标记工作不从相同的规则重启规则规则进程（例如强制重复规则应用），通过RepeatLimit指令指定一个反复实行某一规则的最大数目，</p>
<p>R&nbsp;(explicit&nbsp;redirect）<br />强制服务器对客户端发出重定向指示即时应答，提供目的URI的新地址，重定向规则经常是最后规则<br />RP&nbsp;(permanent&nbsp;redirect)<br />几乎和[R]标记相同但是发布301HTTP状态而不是302HTTP状态代码<br />U&nbsp;(Unmangle&nbsp;Log)<br />当URI是源需求而不是重写需求时记载URI<br />O&nbsp;(nOrmalize)<br />在实行之前标准化字符串。标准化包括URL-ENCODING，不合法的字符的再移动等，这个标记对于URLS和URLS-ENDODED头是有用的&nbsp;<br />CL&nbsp;(Case&nbsp;Lower)&nbsp;<br />小写<br />CU&nbsp;(Case&nbsp;Upper)&nbsp;<br />大写</p>
<p><br />要重移动头，FORMAT&nbsp;STRING模式应该生成一个空字符串，例如这一规则将从客户请求中重移代理信息<br />RewriteHeader&nbsp;User-Agent:&nbsp;.*&nbsp;$0<br />并且这一规则将把OLD-URL&nbsp;HEADER&nbsp;加入请求中。<br />RewriteCond&nbsp;URL&nbsp;(.*)RewriteHeader&nbsp;Old-URL:&nbsp;^$&nbsp;$1<br />最后一个例子将通过改变请求方法定向所有的WEBDAV请求到/WEBDAV。ASP</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">RewriteCond&nbsp;METHOD&nbsp;OPTIONS<br />RewriteRule&nbsp;(.*)&nbsp;/webdav.asp?$1<br />RewriteHeader&nbsp;METHOD&nbsp;OPTIONS&nbsp;GET<br />RewriteProxy&nbsp;directive<br />Syntax:&nbsp;RewriteProxy&nbsp;Pattern&nbsp;FormatString&nbsp;[Flags]&nbsp;</div>
<p>&nbsp;</p>
<p>强制目的URI在内部强制为代理需求并且立即通过ISAPI扩展应付代理需求，这将允许IIS作为代理服务器并且重路由到其他站点和服务器<br />Pattern<br />限定规则表达式以匹配Request-URI，<br />FormatString&nbsp;<br />限定将生成新的URI的FormatString&nbsp;<br />[Flags]<br />是一个下列FLAGS的命令分隔列表<br />D&nbsp;(Delegate&nbsp;security)&nbsp;<br />代理模式将试图以当前假冒的用户资格登陆远程服务器，<br />C&nbsp;(use&nbsp;Credentials)&nbsp;<br />代理模式将试图一在URL或基本授权头文件中指定的资格登陆远程服务器，用这个标记你可以使用<a href="http://user:password@host.com/path/%C2%A0syntax%C2%A0" target="_blank" rel="nofollow">http://user:password@host.com/path/&nbsp;syntax&nbsp;</a>作为URL<br />F&nbsp;(Follow&nbsp;redirects)<br />缺省情况下ISAPI_Rewrite&nbsp;将试图将MAP远程服务器返回的重定向指令到本地服务器命名空间，如果远程服务器返回重定向点到那台服务器其他的某个位置，ISAPI_Rewrite&nbsp;将修改这一重定向指令指向本服务器名，这将避免用户看到真实（内部）服务器名称<br />使用F标记强制代理模式内部跟踪远程服务器返回的重定向指令，使用这个标记如果你根本不需要接受远程服务器的重定向指令，在WINHTTP设置中有重定向限制以避免远程重定向循环</p>
<p>I&nbsp;(ignore&nbsp;case)&nbsp;<br />不管大小写强行指定字符匹配&nbsp;<br />U&nbsp;(Unmangle&nbsp;Log)<br />当URI是源需求而不是重写需求时记载URI<br />O&nbsp;(nOrmalize)<br />在实行之前标准化字符串。标准化包括URL-ENCODING，不合法的字符的再移动等，这个标记对于URLS和URLS-ENDODED头是有用的<br />CacheClockRate&nbsp;directive<br />Syntax:&nbsp;CacheClockRate&nbsp;Interval&nbsp;<br />这个指令只在GLOBAL配置内容中出现，如果这个指令在SITE-LEVEL内容中出现将被忽略并把错误信息写入httpd.parse.errors&nbsp;文件<br />ISAPI_Rewrite&nbsp;caches每次在第一次加载时配置，使用这个指令你可以限定当一个特定站点从缓存中清理的不活动周期，把这个参数设置的足够大你可以强制ISAPI_Rewrite&nbsp;永不清理缓存，记住任何配置文件的改变将在下次请求后立即更新而忽略这个周期<br />Interval&nbsp;<br />限定特定配置被清理出缓存的不作为时间（以秒计），缺省值3600（1小时）<br />EnableConfig&nbsp;and&nbsp;DisableConfig&nbsp;directives<br />Syntax:<br />EnableConfig&nbsp;[SiteID|"Site&nbsp;name"]<br />DisableConfig&nbsp;[SiteID|"Site&nbsp;name"]&nbsp;<br />对所选站点激活或不激活SITE-LEVEL配置或者改变缺省配置，缺省SITE-LEVEL配置不激活，这个指令只出现在GLOBAL配置内容中<br />SiteID&nbsp;<br />Numeric&nbsp;metabase&nbsp;identifier&nbsp;of&nbsp;a&nbsp;site</p>
<p>Site&nbsp;name&nbsp;<br />Name&nbsp;of&nbsp;the&nbsp;site&nbsp;as&nbsp;it&nbsp;appears&nbsp;in&nbsp;the&nbsp;IIS&nbsp;console<br />不用参数使用这个命令将改变缺省配置到ENABLE/DISABLE配置进程</p>
<p><br /><b>例子</b></p>
<p>下面例子将使配置仅作用于ID=1（典型是缺省站点）名字是MY&nbsp;SITE的站点</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">DisableConfig<br />EnableConfig&nbsp;1<br />EnableConfig"My&nbsp;site"</div>
<p>&nbsp;</p>
<p>下边例子将激活名称为SOMESITE配置因为它分割设置重载了缺省设置</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">EnableConfig"Some&nbsp;site"<br />DisableConfig<br />EnableRewrite&nbsp;and&nbsp;DisableRewrite&nbsp;directives&nbsp;<br />Syntax:<br />EnableRewrite&nbsp;[SiteID|"Site&nbsp;name"]<br />DisableRewrite&nbsp;[SiteID|"Site&nbsp;name"]&nbsp;</div>
<p>&nbsp;</p>
<p>对所选站点激活或不激活重写或者改变缺省配置，缺省重写配置激活，这个指令只出现在GLOBAL配置内容中</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">SiteID&nbsp;<br />Numeric&nbsp;metabase&nbsp;identifier&nbsp;of&nbsp;a&nbsp;site
<p>&nbsp;</p>
<p>Site&nbsp;name&nbsp;<br />Name&nbsp;of&nbsp;the&nbsp;site&nbsp;as&nbsp;it&nbsp;appears&nbsp;in&nbsp;the&nbsp;IIS&nbsp;console.</p>
</div>
<p>&nbsp;</p>
<p>不使用参数这个命令将全部激活或者不激活</p>
<p><b>RepeatLimit&nbsp;directive</b></p>
<p>Syntax:&nbsp;RepeatLimit&nbsp;Limit&nbsp;<br />这个指令可以出现在GLOBAL和SITE-LEVEL配置文件中，如果出现在GLOBAL配置文件中竟改变GLOBAL对于所有站点的限制，出现在SITE-LEVEL配置中竟只改变对于这个站点的限制并且这个限制不能超过GLOBAL限制<br />ISAPI_Rewrite在实行规则时允许循环，这个指令允许限制最大可能循环的数量，可以设置为0或1而不支持循环，<br />LIMIT<br />限制最大循环数量，缺省32</p>
<p><b>RFStyle&nbsp;directive</b></p>
<p>Syntax:&nbsp;RFStyle&nbsp;Old&nbsp;|&nbsp;New</p>
<p>&nbsp;<br /><b>Configuration&nbsp;Utility</b><br />ISAPI_Rewrite&nbsp;Full包括配置功用（可以在&nbsp;ISAPI_Rewrite&nbsp;程序组中启动），它允许你浏览测试状态并输入注册码（如果在安装过程中没有注册），并且调整部分与代理模式操作相关的产品功能，UTILITY是由三个页面组成的属性表</p>
<p>Trial&nbsp;page允许你浏览TIRAL状态并输入注册码（如果在安装过程中没有注册）</p>
<p><b>Settings&nbsp;page</b></p>
<p>这页包含对下列参数的编辑框</p>
<p><b>Helper&nbsp;URL</b>&nbsp;</p>
<p>这个参数影响过滤器和代理模块之间的联系方式，它即可以是以点做前缀的文件扩展名（如&nbsp;.isrwhlp）也可以是绝对路径，</p>
<p>第一种情况下扩展名将追加在初始请求URI上并且代理模块竟通过SCRIPT&nbsp;MAP激活，缺省扩展名isrwhlp在安装进程中加在global&nbsp;script&nbsp;map&nbsp;中，如果你改变这个扩展名或者你的应用不继承global&nbsp;script&nbsp;map&nbsp;设置你应该手动添加向script&nbsp;map&nbsp;所需求的入口。这个应该有如下参数</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">Executable:&nbsp;An&nbsp;absolute&nbsp;path&nbsp;to&nbsp;the&nbsp;rwhelper.dll&nbsp;in&nbsp;the&nbsp;short&nbsp;form&nbsp;<br />Extension:&nbsp;Desired&nbsp;extension&nbsp;(.isrwhlp&nbsp;is&nbsp;default)&nbsp;<br />Verbs&nbsp;radio&nbsp;button:&nbsp;All&nbsp;Verbs&nbsp;<br />Script&nbsp;engine&nbsp;checkbox:&nbsp;Checked&nbsp;<br />Check&nbsp;that&nbsp;file&nbsp;exists&nbsp;checkbox:&nbsp;Unchecked</div>
&nbsp;
<p>&nbsp;</p>
<p>我们已经创建了一个WSH&nbsp;script&nbsp;proxycfg.vbs&nbsp;，可以简单在一个a&nbsp;script&nbsp;maps中注册，她位于安装文件夹并且可以在命令行一如下方式运行</p>
<p>cscript&nbsp;proxycfg.vbs&nbsp;[-r]&nbsp;[MetabasePath]&nbsp;<br />Optional&nbsp;-r&nbsp;强制注册扩展名<br />Optional&nbsp;MetabasePath&nbsp;parameter&nbsp;allows&nbsp;specification&nbsp;of&nbsp;the&nbsp;first&nbsp;metabase&nbsp;key&nbsp;to&nbsp;process.&nbsp;By&nbsp;default&nbsp;it&nbsp;is&nbsp;"/localhost/W3SVC".<br />要在所有现存的&nbsp;script&nbsp;maps&nbsp;中注册你可以以如下命令行激活&nbsp;script&nbsp;<br />cscript&nbsp;proxycfg.vbs&nbsp;-r&nbsp;<br />第二种情况下你应该提供一个URI作为'Helper&nbsp;URL'的值，你也应该map&nbsp;一个&nbsp;ISAPI_Rewrite的安装文件夹作为美意个站点的虚拟文件家<br />注意：根据顾客反应，IIS5（也许包括IIS4）对长目录名有问题。所以我们强烈推荐使用短目录名<br />Worker&nbsp;threads&nbsp;limit&nbsp;<br />这个参数限制在代理扩展线程池中工作线程数，缺省为0意味着这个限制等于处理器数量乘以2<br />Active&nbsp;threads&nbsp;limit<br />这个参数限制当前运行线程数，这个数量不可大于"Worker&nbsp;threads&nbsp;limit".&nbsp;缺省0意思是等于处理器数量<br />Queue&nbsp;size&nbsp;这个参数定义最大请求数量，如果你曾经看到Queue&nbsp;timeout&nbsp;expired"&nbsp;信息在&nbsp;the&nbsp;Application&nbsp;event&nbsp;log中你可以增加这个参数<br />Queue&nbsp;timeout&nbsp;<br />这个参数定义你在内部请求队列中防止新请求的最大等待时间，如果你曾经看到Queue&nbsp;timeout&nbsp;expired"&nbsp;信息在&nbsp;the&nbsp;Application&nbsp;event&nbsp;log中你可以增加这个参数<br />Connect&nbsp;timeout&nbsp;<br />以毫秒设定代理模块连接超时<br />Send&nbsp;timeout&nbsp;<br />以毫秒设定代理模块发送超时<br />Receive&nbsp;timeout&nbsp;<br />以毫秒设定代理模块发送超时<br />About&nbsp;page.&nbsp;<br />It&nbsp;contains&nbsp;copyright&nbsp;information&nbsp;and&nbsp;a&nbsp;link&nbsp;to&nbsp;the&nbsp;ISAPI_Rewrite's&nbsp;web&nbsp;site.</p>
<p><b>Regular&nbsp;expression&nbsp;syntax</b></p>
<p>这一部分覆盖了&nbsp;ISAPI_Rewrite规定的表达句法</p>
<p>Literals</p>
<p>所有字符都是原意除了&nbsp;".",&nbsp;"*",&nbsp;"?",&nbsp;"+",&nbsp;"(",&nbsp;")",&nbsp;"{",&nbsp;"}",&nbsp;"[",&nbsp;"]",&nbsp;"^"&nbsp;and&nbsp;"$".，这些字符在用&ldquo;\&rdquo;处理时是原意，原意指一个字符匹配自身</p>
<p>Wildcard<br />The&nbsp;dot&nbsp;character&nbsp;"."&nbsp;matches&nbsp;any&nbsp;single&nbsp;character&nbsp;except&nbsp;null&nbsp;character&nbsp;and&nbsp;newline&nbsp;character<br />以下为句法</p>
<p>Repeats</p>
<p>A&nbsp;repeat&nbsp;is&nbsp;an&nbsp;expression&nbsp;that&nbsp;is&nbsp;repeated&nbsp;an&nbsp;arbitrary&nbsp;number&nbsp;of&nbsp;times.&nbsp;An&nbsp;expression&nbsp;followed&nbsp;by&nbsp;"*"&nbsp;can&nbsp;be&nbsp;repeated&nbsp;any&nbsp;number&nbsp;of&nbsp;times&nbsp;including&nbsp;zero.&nbsp;An&nbsp;expression&nbsp;followed&nbsp;by&nbsp;"+"&nbsp;can&nbsp;be&nbsp;repeated&nbsp;any&nbsp;number&nbsp;of&nbsp;times,&nbsp;but&nbsp;at&nbsp;least&nbsp;once.&nbsp;An&nbsp;expression&nbsp;followed&nbsp;by&nbsp;"?"&nbsp;may&nbsp;be&nbsp;repeated&nbsp;zero&nbsp;or&nbsp;one&nbsp;times&nbsp;only.&nbsp;When&nbsp;it&nbsp;is&nbsp;necessary&nbsp;to&nbsp;specify&nbsp;the&nbsp;minimum&nbsp;and&nbsp;maximum&nbsp;number&nbsp;of&nbsp;repeats&nbsp;explicitly,&nbsp;the&nbsp;bounds&nbsp;operator&nbsp;"{}"&nbsp;may&nbsp;be&nbsp;used,&nbsp;thus&nbsp;"a{2}"&nbsp;is&nbsp;the&nbsp;letter&nbsp;"a"&nbsp;repeated&nbsp;exactly&nbsp;twice,&nbsp;"a{2,4}"&nbsp;represents&nbsp;the&nbsp;letter&nbsp;"a"&nbsp;repeated&nbsp;between&nbsp;2&nbsp;and&nbsp;4&nbsp;times,&nbsp;and&nbsp;"a{2,}"&nbsp;represents&nbsp;the&nbsp;letter&nbsp;"a"&nbsp;repeated&nbsp;at&nbsp;least&nbsp;twice&nbsp;with&nbsp;no&nbsp;upper&nbsp;limit.&nbsp;Note&nbsp;that&nbsp;there&nbsp;must&nbsp;be&nbsp;no&nbsp;white-space&nbsp;inside&nbsp;the&nbsp;{},&nbsp;and&nbsp;there&nbsp;is&nbsp;no&nbsp;upper&nbsp;limit&nbsp;on&nbsp;the&nbsp;values&nbsp;of&nbsp;the&nbsp;lower&nbsp;and&nbsp;upper&nbsp;bounds.&nbsp;All&nbsp;repeat&nbsp;expressions&nbsp;refer&nbsp;to&nbsp;the&nbsp;shortest&nbsp;possible&nbsp;previous&nbsp;sub-expression:&nbsp;a&nbsp;single&nbsp;character;&nbsp;a&nbsp;character&nbsp;set,&nbsp;or&nbsp;a&nbsp;sub-expression&nbsp;grouped&nbsp;with&nbsp;"()"&nbsp;for&nbsp;example.</p>
<p>Examples:</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">"ba*"&nbsp;will&nbsp;match&nbsp;all&nbsp;of&nbsp;"b",&nbsp;"ba",&nbsp;"baaa"&nbsp;etc.&nbsp;<br />"ba+"&nbsp;will&nbsp;match&nbsp;"ba"&nbsp;or&nbsp;"baaaa"&nbsp;for&nbsp;example&nbsp;but&nbsp;not&nbsp;"b".&nbsp;<br />"ba?"&nbsp;will&nbsp;match&nbsp;"b"&nbsp;or&nbsp;"ba".&nbsp;<br />"ba{2,4}"&nbsp;will&nbsp;match&nbsp;"baa",&nbsp;"baaa"&nbsp;and&nbsp;"baaaa".&nbsp;<br />Non-greedy&nbsp;repeats<br />Non-greedy&nbsp;repeats&nbsp;are&nbsp;possible&nbsp;by&nbsp;appending&nbsp;a&nbsp;'?'&nbsp;after&nbsp;the&nbsp;repeat;&nbsp;a&nbsp;non-greedy&nbsp;repeat&nbsp;is&nbsp;one&nbsp;which&nbsp;will&nbsp;match&nbsp;the&nbsp;shortest&nbsp;possible&nbsp;string.</div>
<br />For&nbsp;example&nbsp;to&nbsp;match&nbsp;html&nbsp;tag&nbsp;pairs&nbsp;one&nbsp;could&nbsp;use&nbsp;something&nbsp;like:
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">"&lt;\s*tagname[^&gt;]*&gt;(.*?)&lt;\s*/tagname\s*&gt;"</div>
<p>&nbsp;</p>
<p>In&nbsp;this&nbsp;case&nbsp;$1&nbsp;will&nbsp;contain&nbsp;the&nbsp;text&nbsp;between&nbsp;the&nbsp;tag&nbsp;pairs,&nbsp;and&nbsp;will&nbsp;be&nbsp;the&nbsp;shortest&nbsp;possible&nbsp;matching&nbsp;string.&nbsp;</p>
<p>Parenthesis<br />Parentheses&nbsp;serve&nbsp;two&nbsp;purposes,&nbsp;to&nbsp;group&nbsp;items&nbsp;together&nbsp;into&nbsp;a&nbsp;sub-expression,&nbsp;and&nbsp;to&nbsp;mark&nbsp;what&nbsp;generated&nbsp;the&nbsp;match.&nbsp;For&nbsp;example&nbsp;the&nbsp;expression&nbsp;"(ab)*"&nbsp;would&nbsp;match&nbsp;all&nbsp;of&nbsp;the&nbsp;string&nbsp;"ababab".&nbsp;All&nbsp;sub&nbsp;matches&nbsp;marked&nbsp;by&nbsp;parenthesis&nbsp;can&nbsp;be&nbsp;back&nbsp;referenced&nbsp;using&nbsp;\N&nbsp;or&nbsp;$N&nbsp;syntax.&nbsp;It&nbsp;is&nbsp;permissible&nbsp;for&nbsp;sub-expressions&nbsp;to&nbsp;match&nbsp;null&nbsp;strings.&nbsp;Sub-expressions&nbsp;are&nbsp;indexed&nbsp;from&nbsp;left&nbsp;to&nbsp;right&nbsp;starting&nbsp;from&nbsp;1,&nbsp;sub-expression&nbsp;0&nbsp;is&nbsp;the&nbsp;whole&nbsp;expression.</p>
<p>Non-Marking&nbsp;Parenthesis<br />Sometimes&nbsp;you&nbsp;need&nbsp;to&nbsp;group&nbsp;sub-expressions&nbsp;with&nbsp;parenthesis,&nbsp;but&nbsp;don't&nbsp;want&nbsp;the&nbsp;parenthesis&nbsp;to&nbsp;spit&nbsp;out&nbsp;another&nbsp;marked&nbsp;sub-expression,&nbsp;in&nbsp;this&nbsp;case&nbsp;a&nbsp;non-marking&nbsp;parenthesis&nbsp;(?:expression)&nbsp;can&nbsp;be&nbsp;used.&nbsp;For&nbsp;example&nbsp;the&nbsp;following&nbsp;expression&nbsp;creates&nbsp;no&nbsp;sub-expressions:</p>
<p>"(?:abc)*"&nbsp;</p>
<p>Alternatives<br />Alternatives&nbsp;occur&nbsp;when&nbsp;the&nbsp;expression&nbsp;can&nbsp;match&nbsp;either&nbsp;one&nbsp;sub-expression&nbsp;or&nbsp;another,&nbsp;each&nbsp;alternative&nbsp;is&nbsp;separated&nbsp;by&nbsp;a&nbsp;"|".&nbsp;Each&nbsp;alternative&nbsp;is&nbsp;the&nbsp;largest&nbsp;possible&nbsp;previous&nbsp;sub-expression;&nbsp;this&nbsp;is&nbsp;the&nbsp;opposite&nbsp;behaviour&nbsp;from&nbsp;repetition&nbsp;operators.</p>
<p>Examples:</p>
<p>"a(b|c)"&nbsp;could&nbsp;match&nbsp;"ab"&nbsp;or&nbsp;"ac".&nbsp;<br />"abc|def"&nbsp;could&nbsp;match&nbsp;"abc"&nbsp;or&nbsp;"def".&nbsp;<br />Sets<br />A&nbsp;set&nbsp;is&nbsp;a&nbsp;set&nbsp;of&nbsp;characters&nbsp;that&nbsp;can&nbsp;match&nbsp;any&nbsp;single&nbsp;character&nbsp;that&nbsp;is&nbsp;a&nbsp;member&nbsp;of&nbsp;the&nbsp;set.&nbsp;Sets&nbsp;are&nbsp;delimited&nbsp;by&nbsp;"["&nbsp;and&nbsp;"]"&nbsp;and&nbsp;can&nbsp;contain&nbsp;literals,&nbsp;character&nbsp;ranges,&nbsp;character&nbsp;classes,&nbsp;collating&nbsp;elements&nbsp;and&nbsp;equivalence&nbsp;classes.&nbsp;Set&nbsp;declarations&nbsp;that&nbsp;start&nbsp;with&nbsp;"^"&nbsp;contain&nbsp;the&nbsp;compliment&nbsp;of&nbsp;the&nbsp;elements&nbsp;that&nbsp;follow.</p>
<p>Examples:</p>
<p>Character&nbsp;literals:</p>
<p>"[abc]"&nbsp;will&nbsp;match&nbsp;either&nbsp;of&nbsp;"a",&nbsp;"b",&nbsp;or&nbsp;"c".&nbsp;<br />"[^abc]&nbsp;will&nbsp;match&nbsp;any&nbsp;character&nbsp;other&nbsp;than&nbsp;"a",&nbsp;"b",&nbsp;or&nbsp;"c".&nbsp;<br />Character&nbsp;ranges:</p>
<p>"[a-z]"&nbsp;will&nbsp;match&nbsp;any&nbsp;character&nbsp;in&nbsp;the&nbsp;range&nbsp;"a"&nbsp;to&nbsp;"z".&nbsp;<br />"[^A-Z]"&nbsp;will&nbsp;match&nbsp;any&nbsp;character&nbsp;other&nbsp;than&nbsp;those&nbsp;in&nbsp;the&nbsp;range&nbsp;"A"&nbsp;to&nbsp;"Z".&nbsp;<br />Character&nbsp;classes<br />Character&nbsp;classes&nbsp;are&nbsp;denoted&nbsp;using&nbsp;the&nbsp;syntax&nbsp;"[:classname:]"&nbsp;within&nbsp;a&nbsp;set&nbsp;declaration,&nbsp;for&nbsp;example&nbsp;"[[:space:]]"&nbsp;is&nbsp;the&nbsp;set&nbsp;of&nbsp;all&nbsp;whitespace&nbsp;characters.&nbsp;The&nbsp;available&nbsp;character&nbsp;classes&nbsp;are:&nbsp;</p>
<p>alnum&nbsp;Any&nbsp;alpha&nbsp;numeric&nbsp;character.&nbsp;<br />alpha&nbsp;Any&nbsp;alphabetical&nbsp;character&nbsp;a-z&nbsp;and&nbsp;A-Z.&nbsp;Other&nbsp;characters&nbsp;may&nbsp;also&nbsp;be&nbsp;included&nbsp;depending&nbsp;upon&nbsp;the&nbsp;locale.&nbsp;<br />blank&nbsp;Any&nbsp;blank&nbsp;character,&nbsp;either&nbsp;a&nbsp;space&nbsp;or&nbsp;a&nbsp;tab.&nbsp;<br />cntrl&nbsp;Any&nbsp;control&nbsp;character.&nbsp;<br />digit&nbsp;Any&nbsp;digit&nbsp;0-9.&nbsp;<br />graph&nbsp;Any&nbsp;graphical&nbsp;character.&nbsp;<br />lower&nbsp;Any&nbsp;lower&nbsp;case&nbsp;character&nbsp;a-z.&nbsp;Other&nbsp;characters&nbsp;may&nbsp;also&nbsp;be&nbsp;included&nbsp;depending&nbsp;upon&nbsp;the&nbsp;locale.&nbsp;<br />print&nbsp;Any&nbsp;printable&nbsp;character.&nbsp;<br />punct&nbsp;Any&nbsp;punctuation&nbsp;character.&nbsp;<br />space&nbsp;Any&nbsp;whitespace&nbsp;character.&nbsp;<br />upper&nbsp;Any&nbsp;upper&nbsp;case&nbsp;character&nbsp;A-Z.&nbsp;Other&nbsp;characters&nbsp;may&nbsp;also&nbsp;be&nbsp;included&nbsp;depending&nbsp;upon&nbsp;the&nbsp;locale.&nbsp;<br />xdigit&nbsp;Any&nbsp;hexadecimal&nbsp;digit&nbsp;character,&nbsp;0-9,&nbsp;a-f&nbsp;and&nbsp;A-F.&nbsp;<br />word&nbsp;Any&nbsp;word&nbsp;character&nbsp;-&nbsp;all&nbsp;alphanumeric&nbsp;characters&nbsp;plus&nbsp;the&nbsp;underscore.&nbsp;<br />unicode&nbsp;Any&nbsp;character&nbsp;whose&nbsp;code&nbsp;is&nbsp;greater&nbsp;than&nbsp;255,&nbsp;this&nbsp;applies&nbsp;to&nbsp;the&nbsp;wide&nbsp;character&nbsp;traits&nbsp;classes&nbsp;only.&nbsp;</p>
<p>There&nbsp;are&nbsp;some&nbsp;shortcuts&nbsp;that&nbsp;can&nbsp;be&nbsp;used&nbsp;in&nbsp;place&nbsp;of&nbsp;the&nbsp;character&nbsp;classes:</p>
<p>\w&nbsp;in&nbsp;place&nbsp;of&nbsp;[:word:]&nbsp;<br />\s&nbsp;in&nbsp;place&nbsp;of&nbsp;[:space:]&nbsp;<br />\d&nbsp;in&nbsp;place&nbsp;of&nbsp;[:digit:]&nbsp;<br />\l&nbsp;in&nbsp;place&nbsp;of&nbsp;[:lower:]&nbsp;<br />\u&nbsp;in&nbsp;place&nbsp;of&nbsp;[:upper:]&nbsp;<br />Collating&nbsp;elements<br />Collating&nbsp;elements&nbsp;take&nbsp;the&nbsp;general&nbsp;form&nbsp;[.tagname.]&nbsp;inside&nbsp;a&nbsp;set&nbsp;declaration,&nbsp;where&nbsp;tagname&nbsp;is&nbsp;either&nbsp;a&nbsp;single&nbsp;character,&nbsp;or&nbsp;a&nbsp;name&nbsp;of&nbsp;a&nbsp;collating&nbsp;element,&nbsp;for&nbsp;example&nbsp;[[.a.]]&nbsp;is&nbsp;equivalent&nbsp;to&nbsp;[a],&nbsp;and&nbsp;[[.comma.]]&nbsp;is&nbsp;equivalent&nbsp;to&nbsp;[,].&nbsp;ISAPI_Rewrite&nbsp;supports&nbsp;all&nbsp;the&nbsp;standard&nbsp;POSIX&nbsp;collating&nbsp;element&nbsp;names,&nbsp;and&nbsp;in&nbsp;addition&nbsp;the&nbsp;following&nbsp;digraphs:&nbsp;"ae",&nbsp;"ch",&nbsp;"ll",&nbsp;"ss",&nbsp;"nj",&nbsp;"dz",&nbsp;"lj",&nbsp;each&nbsp;in&nbsp;lower,&nbsp;upper&nbsp;and&nbsp;title&nbsp;case&nbsp;variations.&nbsp;Multi-character&nbsp;collating&nbsp;elements&nbsp;can&nbsp;result&nbsp;in&nbsp;the&nbsp;set&nbsp;matching&nbsp;more&nbsp;than&nbsp;one&nbsp;character,&nbsp;for&nbsp;example&nbsp;[[.ae.]]&nbsp;would&nbsp;match&nbsp;two&nbsp;characters,&nbsp;but&nbsp;note&nbsp;that&nbsp;[^[.ae.]]&nbsp;would&nbsp;only&nbsp;match&nbsp;one&nbsp;character.&nbsp;</p>
<p>Equivalence&nbsp;classes<br />Equivalenceclassestakethegeneralform[=tagname=]&nbsp;inside&nbsp;a&nbsp;set&nbsp;declaration,&nbsp;where&nbsp;tagname&nbsp;is&nbsp;either&nbsp;a&nbsp;single&nbsp;character,&nbsp;or&nbsp;a&nbsp;name&nbsp;of&nbsp;a&nbsp;collating&nbsp;element,&nbsp;and&nbsp;matches&nbsp;any&nbsp;character&nbsp;that&nbsp;is&nbsp;a&nbsp;member&nbsp;of&nbsp;the&nbsp;same&nbsp;primary&nbsp;equivalence&nbsp;class&nbsp;as&nbsp;the&nbsp;collating&nbsp;element&nbsp;[.tagname.].&nbsp;An&nbsp;equivalence&nbsp;class&nbsp;is&nbsp;a&nbsp;set&nbsp;of&nbsp;characters&nbsp;that&nbsp;collate&nbsp;the&nbsp;same,&nbsp;a&nbsp;primary&nbsp;equivalence&nbsp;class&nbsp;is&nbsp;a&nbsp;set&nbsp;of&nbsp;characters&nbsp;whose&nbsp;primary&nbsp;sort&nbsp;key&nbsp;are&nbsp;all&nbsp;the&nbsp;same&nbsp;(for&nbsp;example&nbsp;strings&nbsp;are&nbsp;typically&nbsp;collated&nbsp;by&nbsp;character,&nbsp;then&nbsp;by&nbsp;accent,&nbsp;and&nbsp;then&nbsp;by&nbsp;case;&nbsp;the&nbsp;primary&nbsp;sort&nbsp;key&nbsp;then&nbsp;relates&nbsp;to&nbsp;the&nbsp;character,&nbsp;the&nbsp;secondary&nbsp;to&nbsp;the&nbsp;accentation,&nbsp;and&nbsp;the&nbsp;tertiary&nbsp;to&nbsp;the&nbsp;case).&nbsp;If&nbsp;there&nbsp;is&nbsp;no&nbsp;equivalence&nbsp;class&nbsp;corresponding&nbsp;to&nbsp;tagname,&nbsp;then&nbsp;[=tagname=]&nbsp;is&nbsp;exactly&nbsp;the&nbsp;same&nbsp;as&nbsp;[.tagname.].</p>
<p>To&nbsp;include&nbsp;a&nbsp;literal&nbsp;"-"&nbsp;in&nbsp;a&nbsp;set&nbsp;declaration&nbsp;then:&nbsp;make&nbsp;it&nbsp;the&nbsp;first&nbsp;character&nbsp;after&nbsp;the&nbsp;opening&nbsp;"["&nbsp;or&nbsp;"[^",&nbsp;the&nbsp;endpoint&nbsp;of&nbsp;a&nbsp;range,&nbsp;a&nbsp;collating&nbsp;element,&nbsp;or&nbsp;precede&nbsp;it&nbsp;with&nbsp;an&nbsp;escape&nbsp;character&nbsp;as&nbsp;in&nbsp;"[\-]".&nbsp;To&nbsp;include&nbsp;a&nbsp;literal&nbsp;"["&nbsp;or&nbsp;"]"&nbsp;or&nbsp;"^"&nbsp;in&nbsp;a&nbsp;set&nbsp;then&nbsp;make&nbsp;them&nbsp;the&nbsp;endpoint&nbsp;of&nbsp;a&nbsp;range,&nbsp;a&nbsp;collating&nbsp;element,&nbsp;or&nbsp;precede&nbsp;with&nbsp;an&nbsp;escape&nbsp;character.&nbsp;</p>
<p>Line&nbsp;anchors<br />An&nbsp;anchor&nbsp;is&nbsp;something&nbsp;that&nbsp;matches&nbsp;the&nbsp;null&nbsp;string&nbsp;at&nbsp;the&nbsp;start&nbsp;or&nbsp;end&nbsp;of&nbsp;a&nbsp;line:&nbsp;"^"&nbsp;matches&nbsp;the&nbsp;null&nbsp;string&nbsp;at&nbsp;the&nbsp;start&nbsp;of&nbsp;a&nbsp;line,&nbsp;"$"&nbsp;matches&nbsp;the&nbsp;null&nbsp;string&nbsp;at&nbsp;the&nbsp;end&nbsp;of&nbsp;a&nbsp;line.&nbsp;</p>
<p>Back&nbsp;references<br />A&nbsp;back&nbsp;reference&nbsp;is&nbsp;a&nbsp;reference&nbsp;to&nbsp;a&nbsp;previous&nbsp;sub-expression&nbsp;that&nbsp;has&nbsp;already&nbsp;been&nbsp;matched,&nbsp;the&nbsp;reference&nbsp;is&nbsp;to&nbsp;what&nbsp;the&nbsp;sub-expression&nbsp;matched,&nbsp;not&nbsp;to&nbsp;the&nbsp;expression&nbsp;itself.&nbsp;A&nbsp;back&nbsp;reference&nbsp;consists&nbsp;of&nbsp;the&nbsp;escape&nbsp;character&nbsp;"\"&nbsp;followed&nbsp;by&nbsp;a&nbsp;digit&nbsp;"1"&nbsp;to&nbsp;"9",&nbsp;"\1"&nbsp;refers&nbsp;to&nbsp;the&nbsp;first&nbsp;sub-expression,&nbsp;"\2"&nbsp;to&nbsp;the&nbsp;second&nbsp;etc.&nbsp;For&nbsp;example&nbsp;the&nbsp;expression&nbsp;"(.*)\1"&nbsp;matches&nbsp;any&nbsp;string&nbsp;that&nbsp;is&nbsp;repeated&nbsp;about&nbsp;its&nbsp;mid-point&nbsp;for&nbsp;example&nbsp;"abcabc"&nbsp;or&nbsp;"xyzxyz".&nbsp;A&nbsp;back&nbsp;reference&nbsp;to&nbsp;a&nbsp;sub-expression&nbsp;that&nbsp;did&nbsp;not&nbsp;participate&nbsp;in&nbsp;any&nbsp;match,&nbsp;matches&nbsp;the&nbsp;null&nbsp;string.&nbsp;In&nbsp;ISAPI_Rewrite&nbsp;all&nbsp;back&nbsp;references&nbsp;are&nbsp;global&nbsp;for&nbsp;entire&nbsp;RewriteRule&nbsp;and&nbsp;corresponding&nbsp;RewriteCond&nbsp;directives.&nbsp;Sub&nbsp;matches&nbsp;are&nbsp;numbered&nbsp;up&nbsp;to&nbsp;down&nbsp;and&nbsp;left&nbsp;to&nbsp;right&nbsp;beginning&nbsp;from&nbsp;the&nbsp;first&nbsp;RewriteCond&nbsp;directive&nbsp;of&nbsp;the&nbsp;corresponding&nbsp;RewriteRule&nbsp;directive,&nbsp;if&nbsp;there&nbsp;is&nbsp;one.</p>
<p>Forward&nbsp;Lookahead&nbsp;Asserts<br />There&nbsp;are&nbsp;two&nbsp;forms&nbsp;of&nbsp;these;&nbsp;one&nbsp;for&nbsp;positive&nbsp;forward&nbsp;lookahead&nbsp;asserts,&nbsp;and&nbsp;one&nbsp;for&nbsp;negative&nbsp;lookahead&nbsp;asserts:&nbsp;</p>
<p>"(?=abc)"&nbsp;matches&nbsp;zero&nbsp;characters&nbsp;only&nbsp;if&nbsp;they&nbsp;are&nbsp;followed&nbsp;by&nbsp;the&nbsp;expression&nbsp;"abc".&nbsp;<br />"(?!abc)"&nbsp;matches&nbsp;zero&nbsp;characters&nbsp;only&nbsp;if&nbsp;they&nbsp;are&nbsp;not&nbsp;followed&nbsp;by&nbsp;the&nbsp;expression&nbsp;"abc".&nbsp;</p>
<p>Word&nbsp;operators<br />The&nbsp;following&nbsp;operators&nbsp;are&nbsp;provided&nbsp;for&nbsp;compatibility&nbsp;with&nbsp;the&nbsp;GNU&nbsp;regular&nbsp;expression&nbsp;library.</p>
<p>"\w"&nbsp;matches&nbsp;any&nbsp;single&nbsp;character&nbsp;that&nbsp;is&nbsp;a&nbsp;member&nbsp;of&nbsp;the&nbsp;"word"&nbsp;character&nbsp;class,&nbsp;this&nbsp;is&nbsp;identical&nbsp;to&nbsp;the&nbsp;expression&nbsp;"[[:word:]]".&nbsp;<br />"\W"&nbsp;matches&nbsp;any&nbsp;single&nbsp;character&nbsp;that&nbsp;is&nbsp;not&nbsp;a&nbsp;member&nbsp;of&nbsp;the&nbsp;"word"&nbsp;character&nbsp;class,&nbsp;this&nbsp;is&nbsp;identical&nbsp;to&nbsp;the&nbsp;expression&nbsp;"[^[:word:]]".&nbsp;<br />"\&lt;"&nbsp;matches&nbsp;the&nbsp;null&nbsp;string&nbsp;at&nbsp;the&nbsp;start&nbsp;of&nbsp;a&nbsp;word.&nbsp;<br />"\&gt;"&nbsp;matches&nbsp;the&nbsp;null&nbsp;string&nbsp;at&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;word.&nbsp;<br />"\b"&nbsp;matches&nbsp;the&nbsp;null&nbsp;string&nbsp;at&nbsp;either&nbsp;the&nbsp;start&nbsp;or&nbsp;the&nbsp;end&nbsp;of&nbsp;a&nbsp;word.&nbsp;<br />"\B"&nbsp;matches&nbsp;a&nbsp;null&nbsp;string&nbsp;within&nbsp;a&nbsp;word.&nbsp;<br />Escape&nbsp;operator<br />The&nbsp;escape&nbsp;character&nbsp;"\"&nbsp;has&nbsp;several&nbsp;meanings.</p>
<p>The&nbsp;escape&nbsp;operator&nbsp;may&nbsp;introduce&nbsp;an&nbsp;operator&nbsp;for&nbsp;example:&nbsp;back&nbsp;references,&nbsp;or&nbsp;a&nbsp;word&nbsp;operator.&nbsp;<br />The&nbsp;escape&nbsp;operator&nbsp;may&nbsp;make&nbsp;the&nbsp;following&nbsp;character&nbsp;normal,&nbsp;for&nbsp;example&nbsp;"\*"&nbsp;represents&nbsp;a&nbsp;literal&nbsp;"*"&nbsp;rather&nbsp;than&nbsp;the&nbsp;repeat&nbsp;operator.&nbsp;<br />Single&nbsp;character&nbsp;escape&nbsp;sequences:<br />The&nbsp;following&nbsp;escape&nbsp;sequences&nbsp;are&nbsp;aliases&nbsp;for&nbsp;single&nbsp;characters:</p>
<p><br />Escape&nbsp;sequence&nbsp;Character&nbsp;code&nbsp;Meaning&nbsp;<br />\a&nbsp;0x07&nbsp;Bell&nbsp;character.&nbsp;<br />\t&nbsp;0x09&nbsp;Tab&nbsp;character.&nbsp;<br />\v&nbsp;0x0B&nbsp;Vertical&nbsp;tab.&nbsp;<br />\e&nbsp;0x1B&nbsp;ASCII&nbsp;Escape&nbsp;character.&nbsp;<br />\0dd&nbsp;0dd&nbsp;An&nbsp;octal&nbsp;character&nbsp;code,&nbsp;where&nbsp;dd&nbsp;is&nbsp;one&nbsp;or&nbsp;more&nbsp;octal&nbsp;digits.&nbsp;<br />\xXX&nbsp;0xXX&nbsp;A&nbsp;hexadecimal&nbsp;character&nbsp;code,&nbsp;where&nbsp;XX&nbsp;is&nbsp;one&nbsp;or&nbsp;more&nbsp;hexadecimal&nbsp;digits.&nbsp;<br />\x{XX}&nbsp;0xXX&nbsp;A&nbsp;hexadecimal&nbsp;character&nbsp;code,&nbsp;where&nbsp;XX&nbsp;is&nbsp;one&nbsp;or&nbsp;more&nbsp;hexadecimal&nbsp;digits,&nbsp;optionally&nbsp;a&nbsp;unicode&nbsp;character.&nbsp;<br />\cZ&nbsp;z-@&nbsp;An&nbsp;ASCII&nbsp;escape&nbsp;sequence&nbsp;control-Z,&nbsp;where&nbsp;Z&nbsp;is&nbsp;any&nbsp;ASCII&nbsp;character&nbsp;greater&nbsp;than&nbsp;or&nbsp;equal&nbsp;to&nbsp;the&nbsp;character&nbsp;code&nbsp;for&nbsp;'@'.&nbsp;</p>
<p>Miscellaneous&nbsp;escape&nbsp;sequences:<br />The&nbsp;following&nbsp;are&nbsp;provided&nbsp;mostly&nbsp;for&nbsp;perl&nbsp;compatibility,&nbsp;but&nbsp;note&nbsp;that&nbsp;there&nbsp;are&nbsp;some&nbsp;differences&nbsp;in&nbsp;the&nbsp;meanings&nbsp;of&nbsp;\l&nbsp;\L&nbsp;\u&nbsp;and&nbsp;\U:&nbsp;</p>
<p>Escape&nbsp;sequence&nbsp;Meaning&nbsp;<br />\w&nbsp;Equivalent&nbsp;to&nbsp;[[:word:]].&nbsp;<br />\W&nbsp;Equivalent&nbsp;to&nbsp;[^[:word:]].&nbsp;<br />\s&nbsp;Equivalent&nbsp;to&nbsp;[[:space:]].&nbsp;<br />\S&nbsp;Equivalent&nbsp;to&nbsp;[^[:space:]].&nbsp;<br />\d&nbsp;Equivalent&nbsp;to&nbsp;[[:digit:]].&nbsp;<br />\D&nbsp;Equivalent&nbsp;to&nbsp;[^[:digit:]].&nbsp;<br />\l&nbsp;Equivalent&nbsp;to&nbsp;[[:lower:]].&nbsp;<br />\L&nbsp;Equivalent&nbsp;to&nbsp;[^[:lower:]].&nbsp;<br />\u&nbsp;Equivalent&nbsp;to&nbsp;[[:upper:]].&nbsp;<br />\U&nbsp;Equivalent&nbsp;to&nbsp;[^[:upper:]].&nbsp;<br />\C&nbsp;Any&nbsp;single&nbsp;character,&nbsp;equivalent&nbsp;to&nbsp;'.'.&nbsp;<br />\X&nbsp;Match&nbsp;any&nbsp;Unicode&nbsp;combining&nbsp;character&nbsp;sequence,&nbsp;for&nbsp;example&nbsp;"a\x&nbsp;0301"&nbsp;(a&nbsp;letter&nbsp;a&nbsp;with&nbsp;an&nbsp;acute).&nbsp;<br />\Q&nbsp;The&nbsp;begin&nbsp;quote&nbsp;operator,&nbsp;everything&nbsp;that&nbsp;follows&nbsp;is&nbsp;treated&nbsp;as&nbsp;a&nbsp;literal&nbsp;character&nbsp;until&nbsp;a&nbsp;\E&nbsp;end&nbsp;quote&nbsp;operator&nbsp;is&nbsp;found.&nbsp;<br />\E&nbsp;The&nbsp;end&nbsp;quote&nbsp;operator,&nbsp;terminates&nbsp;a&nbsp;sequence&nbsp;begun&nbsp;with&nbsp;\Q.&nbsp;<br />What&nbsp;gets&nbsp;matched?<br />The&nbsp;regular&nbsp;expression&nbsp;will&nbsp;match&nbsp;the&nbsp;first&nbsp;possible&nbsp;matching&nbsp;string,&nbsp;if&nbsp;more&nbsp;than&nbsp;one&nbsp;string&nbsp;starting&nbsp;at&nbsp;a&nbsp;given&nbsp;location&nbsp;can&nbsp;match&nbsp;then&nbsp;it&nbsp;matches&nbsp;the&nbsp;longest&nbsp;possible&nbsp;string.&nbsp;In&nbsp;cases&nbsp;where&nbsp;their&nbsp;are&nbsp;multiple&nbsp;possible&nbsp;matches&nbsp;all&nbsp;starting&nbsp;at&nbsp;the&nbsp;same&nbsp;location,&nbsp;and&nbsp;all&nbsp;of&nbsp;the&nbsp;same&nbsp;length,&nbsp;then&nbsp;the&nbsp;match&nbsp;chosen&nbsp;is&nbsp;the&nbsp;one&nbsp;with&nbsp;the&nbsp;longest&nbsp;first&nbsp;sub-expression,&nbsp;if&nbsp;that&nbsp;is&nbsp;the&nbsp;same&nbsp;for&nbsp;two&nbsp;or&nbsp;more&nbsp;matches,&nbsp;then&nbsp;the&nbsp;second&nbsp;sub-expression&nbsp;will&nbsp;be&nbsp;examined&nbsp;and&nbsp;so&nbsp;on.&nbsp;Note&nbsp;that&nbsp;ISAPI_Rewrite&nbsp;uses&nbsp;MATCH&nbsp;algorithm.&nbsp;The&nbsp;result&nbsp;is&nbsp;matched&nbsp;only&nbsp;if&nbsp;the&nbsp;expression&nbsp;matches&nbsp;the&nbsp;whole&nbsp;input&nbsp;sequence.&nbsp;For&nbsp;example:&nbsp;</p>
<p>RewriteCond&nbsp;URL&nbsp;^/somedir/.*&nbsp;#will&nbsp;match&nbsp;any&nbsp;request&nbsp;to&nbsp;somedir&nbsp;directory&nbsp;and&nbsp;subdirectories,&nbsp;while&nbsp;<br />RewriteCond&nbsp;URL&nbsp;^/somedir/&nbsp;#will&nbsp;match&nbsp;only&nbsp;request&nbsp;to&nbsp;the&nbsp;root&nbsp;of&nbsp;the&nbsp;somedir.&nbsp;<br />Special&nbsp;note&nbsp;about&nbsp;"pathological"&nbsp;regular&nbsp;expressions<br />ISAPI_Rewrite&nbsp;uses&nbsp;a&nbsp;very&nbsp;powerful&nbsp;regular&nbsp;expressions&nbsp;engine&nbsp;Regex++&nbsp;written&nbsp;by&nbsp;Dr.&nbsp;John&nbsp;Maddock.&nbsp;But&nbsp;as&nbsp;any&nbsp;real&nbsp;thing&nbsp;it's&nbsp;not&nbsp;ideal:&nbsp;There&nbsp;exists&nbsp;some&nbsp;"pathological"&nbsp;expressions&nbsp;which&nbsp;may&nbsp;require&nbsp;exponential&nbsp;time&nbsp;for&nbsp;matching;&nbsp;these&nbsp;all&nbsp;involve&nbsp;nested&nbsp;repetition&nbsp;operators,&nbsp;for&nbsp;example&nbsp;attempting&nbsp;to&nbsp;match&nbsp;the&nbsp;expression&nbsp;"(a*a)*b"&nbsp;against&nbsp;N&nbsp;letter&nbsp;a's&nbsp;requires&nbsp;time&nbsp;proportional&nbsp;to&nbsp;2N.&nbsp;These&nbsp;expressions&nbsp;can&nbsp;(almost)&nbsp;always&nbsp;be&nbsp;rewritten&nbsp;in&nbsp;such&nbsp;a&nbsp;way&nbsp;as&nbsp;to&nbsp;avoid&nbsp;the&nbsp;problem,&nbsp;for&nbsp;example&nbsp;"(a*a)*b"&nbsp;could&nbsp;be&nbsp;rewritten&nbsp;as&nbsp;"a*b"&nbsp;which&nbsp;requires&nbsp;only&nbsp;time&nbsp;linearly&nbsp;proportional&nbsp;to&nbsp;N&nbsp;to&nbsp;solve.&nbsp;In&nbsp;the&nbsp;general&nbsp;case,&nbsp;non-nested&nbsp;repeat&nbsp;expressions&nbsp;require&nbsp;time&nbsp;proportional&nbsp;to&nbsp;N2,&nbsp;however&nbsp;if&nbsp;the&nbsp;clauses&nbsp;are&nbsp;mutually&nbsp;exclusive&nbsp;then&nbsp;they&nbsp;can&nbsp;be&nbsp;matched&nbsp;in&nbsp;linear&nbsp;time&nbsp;-&nbsp;this&nbsp;is&nbsp;the&nbsp;case&nbsp;with&nbsp;"a*b",&nbsp;for&nbsp;each&nbsp;character&nbsp;the&nbsp;matcher&nbsp;will&nbsp;either&nbsp;match&nbsp;an&nbsp;"a"&nbsp;or&nbsp;a&nbsp;"b"&nbsp;or&nbsp;fail,&nbsp;where&nbsp;as&nbsp;with&nbsp;"a*a"&nbsp;the&nbsp;matcher&nbsp;can't&nbsp;tell&nbsp;which&nbsp;branch&nbsp;to&nbsp;take&nbsp;(the&nbsp;first&nbsp;"a"&nbsp;or&nbsp;the&nbsp;second)&nbsp;and&nbsp;so&nbsp;has&nbsp;to&nbsp;try&nbsp;both.</p>
<p>Boost&nbsp;1.29.0&nbsp;Regex++&nbsp;could&nbsp;detect&nbsp;"pathological"&nbsp;regular&nbsp;expressions&nbsp;and&nbsp;terminate&nbsp;theirs&nbsp;matching.&nbsp;When&nbsp;a&nbsp;rule&nbsp;fails&nbsp;ISAPI_Rewrite&nbsp;sends&nbsp;"500&nbsp;Internal&nbsp;Server&nbsp;error&nbsp;-&nbsp;Rule&nbsp;Failed"&nbsp;status&nbsp;to&nbsp;a&nbsp;client&nbsp;to&nbsp;indicate&nbsp;configuration&nbsp;error.&nbsp;Also&nbsp;the&nbsp;failed&nbsp;rule&nbsp;is&nbsp;disabled&nbsp;to&nbsp;prevent&nbsp;performance&nbsp;losses<br />Format&nbsp;string&nbsp;syntax<br />In&nbsp;format&nbsp;strings,&nbsp;all&nbsp;characters&nbsp;are&nbsp;treated&nbsp;as&nbsp;literals&nbsp;except:&nbsp;"(",&nbsp;")",&nbsp;"$",&nbsp;"\",&nbsp;"?",&nbsp;":".</p>
<p>To&nbsp;use&nbsp;any&nbsp;of&nbsp;these&nbsp;as&nbsp;literals&nbsp;you&nbsp;must&nbsp;prefix&nbsp;them&nbsp;with&nbsp;the&nbsp;escape&nbsp;character&nbsp;<br />The&nbsp;following&nbsp;special&nbsp;sequences&nbsp;are&nbsp;recognized:&nbsp;</p>
<p>Grouping:<br />Use&nbsp;the&nbsp;parenthesis&nbsp;characters&nbsp;(&nbsp;and&nbsp;)&nbsp;to&nbsp;group&nbsp;sub-expressions&nbsp;within&nbsp;the&nbsp;format&nbsp;string,&nbsp;use&nbsp;\(&nbsp;and&nbsp;\)&nbsp;to&nbsp;represent&nbsp;literal&nbsp;'('&nbsp;and&nbsp;')'.&nbsp;</p>
<p>Sub-expression&nbsp;expansions:<br />The&nbsp;following&nbsp;perl&nbsp;like&nbsp;expressions&nbsp;expand&nbsp;to&nbsp;a&nbsp;particular&nbsp;matched&nbsp;sub-expression:</p>
<p>$`&nbsp;Expands&nbsp;to&nbsp;all&nbsp;the&nbsp;text&nbsp;from&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;previous&nbsp;match&nbsp;to&nbsp;the&nbsp;start&nbsp;of&nbsp;the&nbsp;current&nbsp;match,&nbsp;if&nbsp;there&nbsp;was&nbsp;no&nbsp;previous&nbsp;match&nbsp;in&nbsp;the&nbsp;current&nbsp;operation,&nbsp;then&nbsp;everything&nbsp;from&nbsp;the&nbsp;start&nbsp;of&nbsp;the&nbsp;input&nbsp;string&nbsp;to&nbsp;the&nbsp;start&nbsp;of&nbsp;the&nbsp;match.&nbsp;<br />$'&nbsp;Expands&nbsp;to&nbsp;all&nbsp;the&nbsp;text&nbsp;from&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;match&nbsp;to&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;input&nbsp;string.&nbsp;<br />$&amp;&nbsp;Expands&nbsp;to&nbsp;all&nbsp;of&nbsp;the&nbsp;current&nbsp;match.&nbsp;<br />$0&nbsp;Expands&nbsp;to&nbsp;all&nbsp;of&nbsp;the&nbsp;current&nbsp;match.&nbsp;<br />$N&nbsp;Expands&nbsp;to&nbsp;the&nbsp;text&nbsp;that&nbsp;matched&nbsp;sub-expression&nbsp;N.&nbsp;</p>
<p>Conditional&nbsp;expressions:<br />Conditional&nbsp;expressions&nbsp;allow&nbsp;two&nbsp;different&nbsp;format&nbsp;strings&nbsp;to&nbsp;be&nbsp;selected&nbsp;dependent&nbsp;upon&nbsp;whether&nbsp;a&nbsp;sub-expression&nbsp;participated&nbsp;in&nbsp;the&nbsp;match&nbsp;or&nbsp;not:</p>
<p>?Ntrue_expression:false_expression</p>
<p>Executes&nbsp;true_expression&nbsp;if&nbsp;sub-expression&nbsp;N&nbsp;participated&nbsp;in&nbsp;the&nbsp;match,&nbsp;otherwise&nbsp;executes&nbsp;false_expression.</p>
<p>Example:&nbsp;suppose&nbsp;we&nbsp;search&nbsp;for&nbsp;"(while)|(for)"&nbsp;then&nbsp;the&nbsp;format&nbsp;string&nbsp;"?1WHILE:FOR"&nbsp;would&nbsp;output&nbsp;what&nbsp;matched,&nbsp;but&nbsp;in&nbsp;upper&nbsp;case.</p>
<p>Escape&nbsp;sequences:<br />The&nbsp;following&nbsp;escape&nbsp;sequences&nbsp;are&nbsp;also&nbsp;allowed:</p>
<p><br />\a&nbsp;The&nbsp;bell&nbsp;character.&nbsp;<br />\f&nbsp;The&nbsp;form&nbsp;feed&nbsp;character.&nbsp;<br />\n&nbsp;The&nbsp;newline&nbsp;character.&nbsp;<br />\r&nbsp;The&nbsp;carriage&nbsp;return&nbsp;character.&nbsp;<br />\t&nbsp;The&nbsp;tab&nbsp;character.&nbsp;<br />\v&nbsp;A&nbsp;vertical&nbsp;tab&nbsp;character.&nbsp;<br />\x&nbsp;A&nbsp;hexadecimal&nbsp;character&nbsp;-&nbsp;for&nbsp;example&nbsp;\x0D.&nbsp;<br />\x{}&nbsp;A&nbsp;possible&nbsp;unicode&nbsp;hexadecimal&nbsp;character&nbsp;-&nbsp;for&nbsp;example&nbsp;\x{1A0}&nbsp;<br />\cx&nbsp;The&nbsp;ASCII&nbsp;escape&nbsp;character&nbsp;x,&nbsp;for&nbsp;example&nbsp;\c@&nbsp;is&nbsp;equivalent&nbsp;to&nbsp;escape-@.&nbsp;<br />\e&nbsp;The&nbsp;ASCII&nbsp;escape&nbsp;character.&nbsp;<br />\dd&nbsp;An&nbsp;octal&nbsp;character&nbsp;constant,&nbsp;for&nbsp;example&nbsp;\10&nbsp;</p>
<p><b>Examples例子</b></p>
<p>Emulating&nbsp;host-header-based&nbsp;virtual&nbsp;sites&nbsp;on&nbsp;a&nbsp;single&nbsp;site<br />例如你在两个域名注册www.site1.com&nbsp;和&nbsp;www.site2.com，现在你可以创建两个不同的站点而使用单一的物理站点。把以下规则加入到你的httpd.ini&nbsp;文件</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]
<p>&nbsp;</p>
<p>#Fix&nbsp;missing&nbsp;slash&nbsp;char&nbsp;on&nbsp;folders<br />RewriteCond&nbsp;Host:&nbsp;(.*)<br />RewriteRule&nbsp;([^.?]+[^.?/])&nbsp;http\://$1$2/&nbsp;[I,R]</p>
<p>#Emulate&nbsp;site1<br />RewriteCond&nbsp;Host:&nbsp;(?:www\.)?site1\.com<br />RewriteRule&nbsp;(.*)&nbsp;/site1$1&nbsp;[I,L]</p>
<p>#Emulate&nbsp;site2<br />RewriteCond&nbsp;Host:&nbsp;(?:www\.)?site2\.com<br />RewriteRule&nbsp;(.*)&nbsp;/site2$1&nbsp;[I,L]</p>
</div>
<p>&nbsp;</p>
<p><br />现在你可以把你的站点放在/site1&nbsp;和&nbsp;/site2&nbsp;目录中.</p>
<p>或者你可以应用更多的类规则：</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]
<p>&nbsp;</p>
<p>#Fix&nbsp;missing&nbsp;slash&nbsp;char&nbsp;on&nbsp;folders<br />RewriteCond&nbsp;Host:&nbsp;(.*)<br />RewriteRule&nbsp;([^.?]+[^.?/])&nbsp;http\://$1$2/&nbsp;[I,R]</p>
<p>RewriteCond&nbsp;Host:&nbsp;(www\.)?(.+)<br />RewriteRule&nbsp;(.*)&nbsp;/$2$3</p>
</div>
<p>&nbsp;</p>
<p>为站点应该命名目录为&nbsp;/somesite1.com,&nbsp;/somesite2.info,&nbsp;etc.<br />Using&nbsp;loops&nbsp;(Next&nbsp;flag)&nbsp;to&nbsp;convert&nbsp;request&nbsp;parameters<br />假如你希望有物理URL如&nbsp;<a href="http://www.myhost.com/foo.asp?a=A&amp;b=B&amp;c=C%C2%A0" target="_blank" rel="nofollow">http://www.myhost.com/foo.asp?a=A&amp;b=B&amp;c=C&nbsp;</a>使用请求如&nbsp;<a href="http://www.myhost.com/foo.asp/a/A/b/B/c/C%C2%A0" target="_blank" rel="nofollow">http://www.myhost.com/foo.asp/a/A/b/B/c/C&nbsp;</a>参数数量可以从两个请求之间变化</p>
<p>至少有两个解决办法。你可以简单的为每一可能的参数数量添加一个分隔规则或者你可以使用一个技术说明如下面的例子</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">ISAPI_Rewrite]<br />RewriteRule&nbsp;(.*?\.asp)(\?[^/]*)?/([^/]*)/([^/]*)(.*)&nbsp;$1(?2$2&amp;:\?)$3=$4$5&nbsp;[NS,I]</div>
<p>&nbsp;</p>
<p>这个规则将从请求的URL中抽取一个参数追加在请求字符的末尾并且从头重启规则进程。所以它将循环直到所有参数被移动到适当的位置，或者直到超过RepeatLimit<br />也存在许多这个规则的变种。但使用不同的分隔字符，例如。使用URLS如<a href="http://www.myhost.com/foo.asp%7Ea%7EA%7Eb%7EB%7Ec%7EC%C2%A0" target="_blank" rel="nofollow">http://www.myhost.com/foo.asp~a~A~b~B~c~C&nbsp;</a>可以应中下面的规则：</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]<br />RewriteRule&nbsp;(.*?\.asp)(\?[^~]*)?~([^~]*)~([^~]*)(.*)&nbsp;$1(?2$2&amp;:\?)$3=$4$5&nbsp;[NS,I]<br />Running&nbsp;servers&nbsp;behind&nbsp;IIS</div>
<p>&nbsp;</p>
<p>假如我们有一个内网服务器运行IIS而几个公司服务器运行其他平台，这些服务器不能从INTERNET直接进入，而只能从我们公司的网络进入，有一个简单的例子可以使用代理标记映射其他服务器到IIS命名空间：</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]<br />RewriteProxy&nbsp;/mappoint(.+)&nbsp;http\://sitedomain$1&nbsp;[I,U]<br />Moving&nbsp;sites&nbsp;from&nbsp;UNIX&nbsp;to&nbsp;IIS</div>
<p>&nbsp;</p>
<p>这个规则可以帮助你把URL从&nbsp;/~username&nbsp;改变到&nbsp;/username&nbsp;和从&nbsp;/file.html&nbsp;改变到&nbsp;/file.htm.&nbsp;这个在你仅仅把你的站从UNIX移动到IIS并且保持搜索引擎和其他外部页面对老页面的连接时是有用的</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]
<p>&nbsp;</p>
<p>#redirecting&nbsp;to&nbsp;update&nbsp;old&nbsp;links<br />RewriteRule&nbsp;(.*)\.html&nbsp;$1.htm<br />RewriteRule&nbsp;/~(.*)&nbsp;http\://myserver/$1&nbsp;[R]</p>
</div>
<p>&nbsp;</p>
<p><b>Moving&nbsp;site&nbsp;location</b></p>
<p>许多网管问这样的问题：他们要重定向所有的请求到一个新的网络服务器，当你需要建立一个更新的站点取代老的的时候经常出现这样的问题，解决方案是用ISAPI_Rewrite&nbsp;于老服务器中</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]
<p>&nbsp;</p>
<p>#redirecting&nbsp;to&nbsp;update&nbsp;old&nbsp;links<br />RewriteRule&nbsp;(.+)&nbsp;http\://newwebserver$1&nbsp;[R]</p>
<p>Browser-dependent&nbsp;content<br />Dynamically&nbsp;generated&nbsp;robots.txt</p>
</div>
<p>&nbsp;</p>
<p>robots.txt是一个搜索引擎用来发现能不能被索引的文件，但是为一个大站创建一个有许多动态内容的这个文件是很复杂的工作，我们可以写一个robots.asp&nbsp;script</p>
<p>现在使用单一规则生成&nbsp;robots.txt&nbsp;</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]
<p>&nbsp;</p>
<p>RewriteRule&nbsp;/robots\.txt&nbsp;/robots.asp<br />Making&nbsp;search&nbsp;engines&nbsp;to&nbsp;index&nbsp;dynamic&nbsp;pages</p>
</div>
<p>&nbsp;</p>
<p>站点的内容存储在XML文件中，在服务器上有一个/XMLProcess.asp&nbsp;文件处理XML文件并返回HTML到最终用户，URLS到文档有如下形式<br /><a href="http://www.mysite.com/XMLProcess.asp?xml=/somdir/somedoc.xml" target="_blank" rel="nofollow">http://www.mysite.com/XMLProcess.asp?xml=/somdir/somedoc.xml</a><br />但是许多公共引擎不能索引此类文档，因为URLS包含问号（文档动态生成），<br />ISAPI_Rewrite可以完全消除这个问题</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]
<p>&nbsp;</p>
<p>RewriteRule&nbsp;/doc(.*)\.htm&nbsp;/XMLProcess.asp\?xml=$1.xml</p>
</div>
<p>&nbsp;</p>
<p>现在使用如同<a href="http://www.mysite.com/doc/somedir/somedoc.htm" target="_blank" rel="nofollow">http://www.mysite.com/doc/somedir/somedoc.htm</a>的URL进入文档，搜索引擎将不知道不是somedoc.htm&nbsp;文件并且内容是动态生成的</p>
<p>Negative&nbsp;expressions&nbsp;(NOT</p>
<p>有时当模式不匹配你需要应用规则，这种情况下你可以使用在规则表达式中称为Forward&nbsp;Lookahead&nbsp;Asserts&nbsp;</p>
<p>例如你需要不使用IE把所有用户移动到别的地点</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]<br />#&nbsp;Redirect&nbsp;all&nbsp;non&nbsp;Internet&nbsp;Explorer&nbsp;users<br />#&nbsp;to&nbsp;another&nbsp;location<br />RewriteCond&nbsp;User-Agent:&nbsp;(?!.*MSIE).*<br />RewriteRule&nbsp;(.*)&nbsp;/nonie$1<br />Dynamic&nbsp;authentification</div>
<p>&nbsp;</p>
<p>例如我们在站点上有一些成员域，我们在这个域上需要密码保护文件而我们不喜欢用BUILT-IN服务器安全，这个情况下可以建立一个ASP脚本（称为proxy.asp），这个脚本将代理所有请求到成员域并且检查请求允许，这里有一个简单的模板你可以放进你自己的授权代码</p>
<p><br />现在我们要通过配置&nbsp;ISAPI_Rewrite&nbsp;通过这个页面代理请求:</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]<br />#&nbsp;Proxy&nbsp;all&nbsp;requests&nbsp;through&nbsp;proxy.asp<br />RewriteRule&nbsp;/members(.+)&nbsp;/proxy.asp\?http\://mysite.com/members$1<br />Blocking&nbsp;inline-images&nbsp;(stop&nbsp;hot&nbsp;linking</div>
<p>&nbsp;</p>
<p>假设我们在<a href="http://www.mysite.com/" target="_blank" rel="nofollow">http://www.mysite.com/</a>下有些页面有一些内联&nbsp;GIF图片很好，他人可以不直接协商通过盗链到他们的页面上，我们不喜欢这样因为加大了服务器流量<br />当我们不能100%保护图片，我们至少可以在浏览器发送一个HTTP&nbsp;Referer&nbsp;header的地方限制这种情况</p>
<p>&nbsp;</p>
<div class="code_head">Code:</div>
<div class="code_main">[ISAPI_Rewrite]<br />RewriteCond&nbsp;Host:&nbsp;(.+)<br />RewriteCond&nbsp;Referer:&nbsp;(?!<a href="http://%5c1./" target="_blank" rel="nofollow">http://\1.</a>*).*<br />RewriteRule&nbsp;.*\.(?:gif|jpg|png)&nbsp;/block.gif&nbsp;[I,O]</div>
<p>&nbsp;</p>
<p><br /><span style="color: red;">多站点配置</span>：</p>
<p>只需要将httpd.ini文件放置到相应站点的根目录下即可．</p>
<p>&nbsp;</p>
</div><img src="http://www.cnblogs.com/h-hello/aggbug/1683285.html?type=2" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/h-hello/articles/1683285.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/h-hello/articles/1683285.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59098/" target="_blank">美博客列20家值得关注纽约创业企业</a><span style="color:gray">(2010-03-18 23:49)</span><br/>· <a href="http://news.cnblogs.com/n/59097/" target="_blank">王建宙：希望在国内销售苹果iPad和iPhone</a><span style="color:gray">(2010-03-18 22:53)</span><br/>· <a href="http://news.cnblogs.com/n/59095/" target="_blank">传网易微博20号正式上线 门户网站角力微博</a><span style="color:gray">(2010-03-18 22:48)</span><br/>· <a href="http://news.cnblogs.com/n/59094/" target="_blank">蓝港CEO王峰谈3年开发感悟：有点唠叨像唐僧</a><span style="color:gray">(2010-03-18 22:07)</span><br/>· <a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><span style="color:gray">(2010-03-18 22:03)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59068/" target="_blank">VS2010全球首发，京沪穗三地即将盛大发布</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>利用Tokyo Tyrant构建兼容Memcached协议、支持故障转移、高并发的分布式key-value持久存储系统</title><link>http://www.cnblogs.com/h-hello/articles/1676655.html</link><dc:creator>h-hello</dc:creator><author>h-hello</author><pubDate>Tue, 02 Mar 2010 08:56:00 GMT</pubDate><guid>http://www.cnblogs.com/h-hello/articles/1676655.html</guid><description><![CDATA[<p>阅读: 0 评论: 0 作者: <a href="http://www.cnblogs.com/h-hello/" target="_blank">h-hello</a> 发表于 2010-03-02 16:56 <a href="http://www.cnblogs.com/h-hello/articles/1676655.html" target="_blank">原文链接</a></p><p><a href="http://tokyocabinet.sourceforge.net/" target="_blank">Tokyo Cabinet</a> 是日本人 平林幹雄 开发的一款 DBM 数据库，该数据库读写非常快，哈希模式写入100万条数据只需0.643秒，读取100万条数据只需0.773秒，是 Berkeley DB 等 DBM 的几倍。
</p>
<p>&nbsp;</p>
<p>　　<a href="http://blog.s135.com/attachment/200808/tokyocabinet.gif" target="_blank"><img src="http://blog.s135.com/attachment/200808/tokyocabinet.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" /></a></p>
<p>&nbsp;</p>
<hr />
<p>
<br />　　<a href="http://tokyocabinet.sourceforge.net/tyrantdoc/" target="_blank">Tokyo Tyrant</a> 是由同一作者开发的 Tokyo Cabinet 数据库网络接口。它拥有Memcached兼容协议，也可以通过HTTP协议进行数据交换。
</p>
<p>&nbsp;</p>
<p>　　Tokyo Tyrant 加上 Tokyo Cabinet，构成了一款支持高并发的分布式持久存储系统，对任何原有Memcached客户端来讲，可以将Tokyo Tyrant看成是一个Memcached，但是，它的数据是可以持久存储的。这一点，跟新浪的<a href="http://memcachedb.org/" target="_blank">Memcachedb</a>性质一样。</p>
<p>　　<b>相比Memcachedb而言，Tokyo Tyrant具有以下优势：</b></p>
<p>　　1、故障转移：Tokyo Tyrant支持双机互为主辅模式，主辅库均可读写，而Memcachedb目前支持类似MySQL主辅库同步的方式实现读写分离，支持&ldquo;主服务器可读写、辅助服务器只读&rdquo;模式。</p>
<p>　　<a href="http://blog.s135.com/attachment/200808/addserver.gif" target="_blank"><img src="http://blog.s135.com/attachment/200808/addserver.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" /></a></p>
<p>　　这里使用 $memcache-&gt;addServer 而不是 $memcache-&gt;connect 去连接 Tokyo Tyrant 服务器，是因为当 Memcache 客户端使用 addServer 服务器池时，是根据&ldquo;crc32(key) % current_server_num&rdquo;哈希算法将 key 哈希到不同的服务器的，PHP、C 和 python 的客户端都是如此的算法。Memcache 客户端的 addserver 具有故障转移机制，当 addserver 了2台 Memcached 服务器，而其中1台宕机了，那么 current_server_num 会由原先的2变成1。</p>
<p>　　引用 memcached 官方网站和 PHP 手册中的两段话： </p>
<div class="quote">
<div class="quote-title">引用</div>
<div class="quote-content">http://www.danga.com/memcached/ <br />If a host goes down, the API re-maps that dead host's requests onto the servers that are available.
<p>&nbsp;</p>
<p><a href="http://cn.php.net/manual/zh/function.Memcache-addServer.php" target="_blank">http://cn.php.net/manual/zh/function.Memcache-addServer.php</a> <br />Failover may occur at any stage in any of the methods, as long as other servers are available the request the user won't notice. Any kind of socket or Memcached server level errors (except out-of-memory) may trigger the failover. Normal client errors such as adding an existing key will not trigger a failover. </p>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<hr />
<p>
<br />　　2、日志文件体积小：Tokyo Tyrant用于主辅同步的日志文件比较小，大约是数据库文件的1.3倍，而Memcachedb的同步日志文件非常大，如果不定期清理，很容易将磁盘写满。
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<hr />
<p>
<br />　　3、超大数据量下表现出色：<br /><a name="entrymore"></a><br />　　<a href="http://blog.s135.com/attachment/200808/tokyotyrant.gif" target="_blank"><img src="http://blog.s135.com/attachment/200808/tokyotyrant.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" /></a></p>
<p>&nbsp;</p>
<p>　　但是，Tokyo Tyrant 也有缺点：<span style="color: #ff0000;">在32位操作系统下，作为 Tokyo Tyrant 后端存储的 Tokyo Cabinet 数据库单个文件不能超过2G，而64位操作系统则不受这一限制。</span>所以，如果使用 Tokyo Tyrant，推荐在64位CPU、操作系统上安装运行。</p>
<p>&nbsp;</p>
<hr />
<p>
<br />　　<b>一、安装</b><br />　　1、首先编译安装tokyocabinet数据库</p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">wget <a href="http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.28.tar.gz" target="_blank">http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.28.tar.gz</a><br />tar zxvf tokyocabinet-1.4.28.tar.gz<br />cd tokyocabinet-1.4.28/<br />./configure<br />make<br />make install<br />cd ../</div>
<p>&nbsp;</p>
<p>　　2、然后编译安装tokyotyrant</p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">wget <a href="http://tokyocabinet.sourceforge.net/tyrantpkg/tokyotyrant-1.1.29.tar.gz" target="_blank">http://tokyocabinet.sourceforge.net/tyrantpkg/tokyotyrant-1.1.29.tar.gz</a><br />tar zxvf tokyotyrant-1.1.29.tar.gz<br />cd tokyotyrant-1.1.29/<br />./configure<br />make<br />make install<br />cd ../</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<hr />
<p>
<br />　　<b>二、配置</b><br />　　<b>1、创建tokyotyrant数据文件存放目录</b></p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">mkdir -p /ttserver/</div>
<p>&nbsp;</p>
<p>　　<b>2、启动tokyotyrant的主进程（ttserver）</b><br />　　<b>(1)、单机模式</b></p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">ulimit -SHn 51200<br />ttserver -host 127.0.0.1 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 1 -rts /ttserver/ttserver.rts /ttserver/database.tch</div>
<p>&nbsp;</p>
<p>　　<b>(2)、双机互为主辅模式</b><br />　　服务器192.168.1.91：</p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">ulimit -SHn 51200<br />ttserver -host 192.168.1.91 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 91 -mhost 192.168.1.92 -mport 11211 -rts /ttserver/ttserver.rts /ttserver/database.tch</div>
<p>&nbsp;</p>
<p>　　服务器192.168.1.92：</p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">ulimit -SHn 51200<br />ttserver -host 192.168.1.92 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 92 -mhost 192.168.1.91 -mport 11211 -rts /ttserver/ttserver.rts /ttserver/database.tch</div>
<p>&nbsp;</p>
<p>　　<b>(3)、参数说明</b><br />　　ttserver [-host name] [-port num] [-thnum num] [-tout num] [-dmn] [-pid path] [-log path] [-ld|-le] [-ulog path] [-ulim num] [-uas] [-sid num] [-mhost name] [-mport num] [-rts path] [dbname] </p>
<p>　　-host name : 指定需要绑定的服务器域名或IP地址。默认绑定这台服务器上的所有IP地址。<br />　　-port num : 指定需要绑定的端口号。默认端口号为1978 <br />　　-thnum num : 指定线程数。默认为8个线程。 <br />　　-tout num : 指定每个会话的超时时间（单位为秒）。默认永不超时。 <br />　　-dmn : 以守护进程方式运行。<br />　　-pid path : 输出进程ID到指定文件（这里指定文件名）。<br />　　-log path : 输出日志信息到指定文件（这里指定文件名）。<br />　　-ld : 在日志文件中还记录DEBUG调试信息。<br />　　-le : 在日志文件中仅记录错误信息。<br />　　-ulog path : 指定同步日志文件存放路径（这里指定目录名）。<br />　　-ulim num : 指定每个同步日志文件的大小（例如128m）。<br />　　-uas : 使用异步IO记录更新日志（使用此项会减少磁盘IO消耗，但是数据会先放在内存中，不会立即写入磁盘，如果重启服务器或ttserver进程被kill掉，将导致部分数据丢失。一般情况下不建议使用）。<br />　　-sid num : 指定服务器ID号（当使用主辅模式时，每台ttserver需要不同的ID号） <br />　　-mhost name : 指定主辅同步模式下，主服务器的域名或IP地址。<br />　　-mport num : 指定主辅同步模式下，主服务器的端口号。<br />　　-rts path : 指定用来存放同步时间戳的文件名。</p>
<p>　　如果使用的是哈希数据库，可以指定参数&ldquo;#bnum=xxx&rdquo;来提高性能。它可以指定bucket存储桶的数量。例如指定&ldquo;#bnum=1000000&rdquo;，就可以将最新最热的100万条记录缓存在内存中：</p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">ttserver -host 127.0.0.1 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 1 -rts /ttserver/ttserver.rts /ttserver/database.tch#bnum=1000000</div>
<p>&nbsp;</p>
<p>　　如果大量的客户端访问ttserver，请确保文件描述符够用。许多服务器的默认文件描述符为1024，可以在启动ttserver前使用ulimit命令提高这项值。例如：</p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">ulimit -SHn 51200</div>
<p>&nbsp;</p>
<p>　　<b>3、停止tokyotyrant（ttserver）</b></p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">ps -ef | grep ttserver</div>
<p>
<br />　　找到ttserver的进程号并kill，例如：</p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">kill -TERM 2159</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<hr />
<p>
<br />　　<b>三、调用</b><br />　　<b>1、任何Memcached客户端均可直接调用tokyotyrant。</b></p>
<p>&nbsp;</p>
<p>　　<b>2、还可以通过HTTP方式调用，下面以Linux的curl命令为例，介绍如何操作tokyotyrant：</b><br />　　(1)、写数据，将数据&ldquo;value&rdquo;写入到&ldquo;key&rdquo;中：</p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">curl -X PUT <a href="http://127.0.0.1:11211/key" target="_blank">http://127.0.0.1:11211/key</a> -d "value"</div>
<p>&nbsp;</p>
<p>　　(2)、读数据，读取&ldquo;key&rdquo;中数据：</p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">curl <a href="http://127.0.0.1:11211/key" target="_blank">http://127.0.0.1:11211/key</a></div>
<p>&nbsp;</p>
<p>　　(3)、删数据，删除&ldquo;key&rdquo;：</p>
<div style="margin: 5px 5px 0px; padding: 3px; border: 1px dashed #00a0c6; background-color: #ffffff;">curl -X DELETE <a href="http://127.0.0.1:11211/key" target="_blank">http://127.0.0.1:11211/key</a></div><img src="http://www.cnblogs.com/h-hello/aggbug/1676655.html?type=2" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/h-hello/articles/1676655.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/h-hello/articles/1676655.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59098/" target="_blank">美博客列20家值得关注纽约创业企业</a><span style="color:gray">(2010-03-18 23:49)</span><br/>· <a href="http://news.cnblogs.com/n/59097/" target="_blank">王建宙：希望在国内销售苹果iPad和iPhone</a><span style="color:gray">(2010-03-18 22:53)</span><br/>· <a href="http://news.cnblogs.com/n/59095/" target="_blank">传网易微博20号正式上线 门户网站角力微博</a><span style="color:gray">(2010-03-18 22:48)</span><br/>· <a href="http://news.cnblogs.com/n/59094/" target="_blank">蓝港CEO王峰谈3年开发感悟：有点唠叨像唐僧</a><span style="color:gray">(2010-03-18 22:07)</span><br/>· <a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><span style="color:gray">(2010-03-18 22:03)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59068/" target="_blank">VS2010全球首发，京沪穗三地即将盛大发布</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>五个免费UML建模工具推荐</title><link>http://www.cnblogs.com/h-hello/articles/1670776.html</link><dc:creator>h-hello</dc:creator><author>h-hello</author><pubDate>Sun, 21 Feb 2010 14:53:00 GMT</pubDate><guid>http://www.cnblogs.com/h-hello/articles/1670776.html</guid><description><![CDATA[<p>阅读: 9 评论: 0 作者: <a href="http://www.cnblogs.com/h-hello/" target="_blank">h-hello</a> 发表于 2010-02-21 22:53 <a href="http://www.cnblogs.com/h-hello/articles/1670776.html" target="_blank">原文链接</a></p><p>UML工具很多是商用的，价格不菲；而免费的UML建模工具，功能完善的很少。以下推荐的是五个免费的UML建模工具，相对而言还算功能比较不错。</p>
<p>免费UML建模工具推荐：<a href="http://jude.change-vision.com/jude-web/product/community.html">JUDE &ndash; community</a></p>
<p><img onload="if(this.width&gt;498)this.style.width=498;" src="http://images.51cto.com/files/uploadimg/20090824/1129150.jpg" alt="免费UML建模工具" style="zoom: 50%;" title="免费UML建模工具" onmousewheel="return big(this)" class="fit" /> </p>
<p>如果您的开发环境中只能使用正版软件，而又因种种原因无法获得专业级的建模工具，正苦苦寻找一个好用的，免费的工具时，那么JUDE绝对值得您一试。JUDE是一个中日合作的软件项目，有商业化的Professional版本和免费的Community版本，最大的区别是免费版的不支持UML 2.0，对于一般应用足够了。</p>
<p>免费UML建模工具推荐：<a href="http://www.umlet.com/">UMLet</a></p>
<p><img onload="if(this.width&gt;498)this.style.width=498;" src="http://images.51cto.com/files/uploadimg/20090824/1129151.jpg" alt="免费UML建模工具" style="zoom: 50%;" title="免费UML建模工具" onmousewheel="return big(this)" class="fit" /> </p>
<p>UMLet是一个开放源代码轻量级UML建模工具。UMLet能够让你快速建模，并且能够导出各种格式SVG, JPG, PDF and LaTeX-friendly EPS。</p>
<p>免费UML建模工具推荐：<a href="http://argouml.tigris.org/">Argo UML</a></p>
<p><img onload="if(this.width&gt;498)this.style.width=498;" src="http://images.51cto.com/files/uploadimg/20090824/1129152.jpg" alt="免费UML建模工具" style="zoom: 50%;" title="免费UML建模工具" onmousewheel="return big(this)" class="fit" /></p>
<p>ArgoUML 是一款开源的UML 建模工具，支持所有UML 1.4 的标准图形。它可以运行在任何Java 平台上，并且支持10 种语言(地区语言而不是编程语言)。它用Java构造，并遵守开源的BSD协议。</p>
<p>免费UML建模工具推荐：<a href="http://bouml.free.fr/download.html">BOUml</a></p>
<p><img onload="if(this.width&gt;498)this.style.width=498;" src="http://images.51cto.com/files/uploadimg/20090824/1129153.jpg" alt="免费UML建模工具" style="zoom: 60%;" title="免费UML建模工具" onmousewheel="return big(this)" class="fit" /> </p>
<p>一个免费的UML 2工具箱，支持C++，Java以及Idl。</p>
<p>免费UML建模工具推荐：<a href="http://www.visual-paradigm.com/product/vpuml/editions/community.jsp">Visual paradigm &ndash; community</a></p>
<p><img onload="if(this.width&gt;498)this.style.width=498;" src="http://images.51cto.com/files/uploadimg/20090824/1129154.jpg" alt="免费UML建模工具" title="免费UML建模工具" onmousewheel="return big(this)" class="fit" /></p>
<p>为软件工程师、系统分析员、商业分析员、系统建筑师而设计的一个UML CASE工具</p>
<p>&nbsp;</p>
<p>附 :&nbsp; oracle 下载地址</p>
<p><a href="http://www.xdowns.com/article/241/Article_2607.html">http://www.xdowns.com/article/241/Article_2607.html</a></p><img src="http://www.cnblogs.com/h-hello/aggbug/1670776.html?type=2" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/h-hello/articles/1670776.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/h-hello/articles/1670776.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59098/" target="_blank">美博客列20家值得关注纽约创业企业</a><span style="color:gray">(2010-03-18 23:49)</span><br/>· <a href="http://news.cnblogs.com/n/59097/" target="_blank">王建宙：希望在国内销售苹果iPad和iPhone</a><span style="color:gray">(2010-03-18 22:53)</span><br/>· <a href="http://news.cnblogs.com/n/59095/" target="_blank">传网易微博20号正式上线 门户网站角力微博</a><span style="color:gray">(2010-03-18 22:48)</span><br/>· <a href="http://news.cnblogs.com/n/59094/" target="_blank">蓝港CEO王峰谈3年开发感悟：有点唠叨像唐僧</a><span style="color:gray">(2010-03-18 22:07)</span><br/>· <a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><span style="color:gray">(2010-03-18 22:03)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59068/" target="_blank">VS2010全球首发，京沪穗三地即将盛大发布</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>睡前听故事：.NET委托</title><link>http://www.cnblogs.com/h-hello/articles/1586206.html</link><dc:creator>h-hello</dc:creator><author>h-hello</author><pubDate>Mon, 19 Oct 2009 13:59:00 GMT</pubDate><guid>http://www.cnblogs.com/h-hello/articles/1586206.html</guid><description><![CDATA[<p>阅读: 5 评论: 0 作者: <a href="http://www.cnblogs.com/h-hello/" target="_blank">h-hello</a> 发表于 2009-10-19 21:59 <a href="http://www.cnblogs.com/h-hello/articles/1586206.html" target="_blank">原文链接</a></p><p><strong>紧耦合</strong> </p>
<p>从前，在南方一块奇异的土地上，有个工人名叫彼得，他非常勤奋，对他的老板总是百依百顺。但是他的老板是个吝啬的人，从不信任别人，坚决要求随时知
道彼得的工作进度，以防止他偷懒。但是彼得又不想让老板呆在他的办公室里站在背后盯着他，于是就对老板做出承诺：无论何时，只要我的工作取得了一点进展我
都会及时让你知道。彼得通过周期性地使用&ldquo;带类型的引用&rdquo;(原文为：&ldquo;typed reference&rdquo;
也就是delegate？？)&ldquo;回调&rdquo;他的老板来实现他的承诺，如下： </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">class</span><span>&nbsp;Worker&nbsp;{ &nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Advise(Boss&nbsp;boss)&nbsp;{&nbsp;_boss&nbsp;=&nbsp;boss;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;DoWork()&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工作:&nbsp;工作开始&rdquo;); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;_boss&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;_boss.WorkStarted();&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工作:&nbsp;工作进行中&rdquo;); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;_boss&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;_boss.WorkProgressing();&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"&ldquo;工作:&nbsp;工作完成&rdquo;"</span><span>); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;_boss&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;grade&nbsp;=&nbsp;_boss.WorkCompleted(); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工人的工作得分＝&rdquo;&nbsp;+&nbsp;grade); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span></span><span class="keyword">private</span><span>&nbsp;Boss&nbsp;_boss; &nbsp;</span></li><li class="alt"><span>}&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span></span><span class="keyword">class</span><span>&nbsp;Boss&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;WorkStarted()&nbsp;{&nbsp;</span><span class="comment">/*&nbsp;老板不关心。&nbsp;*/</span><span>&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;WorkProgressing()&nbsp;{&nbsp;</span><span class="comment">/*老板不关心。&nbsp;*/</span><span>&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;WorkCompleted()&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;时间差不多！&rdquo;); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;2;&nbsp;</span><span class="comment">/*&nbsp;总分为10&nbsp;*/</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>}&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span></span><span class="keyword">class</span><span>&nbsp;Universe&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main()&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Worker&nbsp;peter&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Worker(); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boss&nbsp;boss&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Boss(); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peter.Advise(boss); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peter.DoWork();&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;Main:&nbsp;工人工作完成&rdquo;); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine(); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p><strong>接口</strong></p>
<p>现在，彼得成了一个特殊的人，他不但能容忍吝啬的老板，而且和他周围的宇宙也有了密切的联系，以至于他认为宇宙对他的工作进度也感兴趣。不幸的是，
他必须也给宇宙添加一个特殊的回调函数Advise来实现同时向他老板和宇宙报告工作进度。彼得想要把潜在的通知的列表和这些通知的实现方法分离开来，于
是他决定把方法分离为一个接口： </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">interface</span><span>&nbsp;IWorkerEvents&nbsp;{ &nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;WorkStarted(); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;WorkProgressing(); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;WorkCompleted(); &nbsp;</span></li><li class="alt"><span>}&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span></span><span class="keyword">class</span><span>&nbsp;Worker&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Advise(IWorkerEvents&nbsp;events)&nbsp;{&nbsp;_events&nbsp;=&nbsp;events;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;DoWork()&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工作:&nbsp;工作开始&rdquo;); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;_events&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;_events.WorkStarted();&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工作:&nbsp;工作进行中&rdquo;); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(_events&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;_events.WorkProgressing();&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"&ldquo;工作:&nbsp;工作完成&rdquo;"</span><span>); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(_events&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;grade&nbsp;=&nbsp;_events.WorkCompleted();&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工人的工作得分＝&rdquo;&nbsp;+&nbsp;grade); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;IWorkerEvents&nbsp;_events; &nbsp;</span></li><li><span>}&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span></span><span class="keyword">class</span><span>&nbsp;Boss&nbsp;:&nbsp;IWorkerEvents&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;WorkStarted()&nbsp;{&nbsp;</span><span class="comment">/*&nbsp;老板不关心。&nbsp;*/</span><span>&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;WorkProgressing()&nbsp;{&nbsp;</span><span class="comment">/*&nbsp;老板不关心。&nbsp;*/</span><span>&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;WorkCompleted()&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;时间差不多！&rdquo;); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;3;&nbsp;</span><span class="comment">/*&nbsp;总分为10&nbsp;*/</span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p><strong>委托</strong> </p>
<p>不幸的是，每当彼得忙于通过接口的实现和老板交流时，就没有机会及时通知宇宙了。至少他应该忽略身在远方的老板的引用，好让其他实现了 IWorkerEvents的对象得到他的工作报告。 </p>
<p>他的老板还是抱怨得很厉害。&ldquo;彼得！&rdquo;他老板吼道，&ldquo;你为什么在工作一开始和工作进行中都来烦我？！我不关心这些事件。你不但强迫我实现了这些方法，而且还在浪费我宝贵的工作时间来处理你的事件，特别是当我外出的时候更是如此！你能不能不再来烦我？&rdquo; </p>
<p>于是，彼得意识到接口虽然在很多情况都很有用，但是当用作事件时，&ldquo;粒度&rdquo;不够好。他希望能够仅在别人想要时才通知他们，于是他决定把接口的方法分离为单独的委托，每个委托都像一个小的接口方法： </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">delegate</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;WorkStarted(); &nbsp;</span></span></li><li><span></span><span class="keyword">delegate</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;WorkProgressing(); &nbsp;</span></li><li class="alt"><span></span><span class="keyword">delegate</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;WorkCompleted();&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span></span><span class="keyword">class</span><span>&nbsp;Worker&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;DoWork()&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工作:&nbsp;工作开始&rdquo;); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;started&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;started();&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工作:&nbsp;工作进行中&rdquo;); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;progressing&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;progressing();&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"&ldquo;工作:&nbsp;工作完成&rdquo;"</span><span>); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;completed&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;grade&nbsp;=&nbsp;completed(); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工人的工作得分＝&rdquo;&nbsp;+&nbsp;grade); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;WorkStarted&nbsp;started; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;WorkProgressing&nbsp;progressing; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;WorkCompleted&nbsp;completed; &nbsp;</span></li><li><span>}&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span></span><span class="keyword">class</span><span>&nbsp;Boss&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;WorkCompleted()&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"Better..."</span><span>); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;4;&nbsp;</span><span class="comment">/*&nbsp;总分为10&nbsp;*/</span><span>&nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>}&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span></span><span class="keyword">class</span><span>&nbsp;Universe&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main()&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Worker&nbsp;peter&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Worker(); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boss&nbsp;boss&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Boss(); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peter.completed&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkCompleted(boss.WorkCompleted); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peter.DoWork();&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;Main:&nbsp;工人工作完成&rdquo;); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine(); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p><strong>静态监听者</strong></p>
<p>这样，彼得不会再拿他老板不想要的事件来烦他老板了，但是他还没有把宇宙放到他的监听者列表中。因为宇宙是个包涵一切的实体，看来不适合使用实例方
法的委托（想像一下，实例化一个&ldquo;宇宙&rdquo;要花费多少资源&hellip;..），于是彼得就需要能够对静态委托进行挂钩，委托对这一点支持得很好： </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">class</span><span>&nbsp;Universe&nbsp;{ &nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;WorkerStartedWork()&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"Universe&nbsp;notices&nbsp;worker&nbsp;starting&nbsp;work"</span><span>); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;WorkerCompletedWork()&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"Universe&nbsp;pleased&nbsp;with&nbsp;worker's&nbsp;work"</span><span>); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;7; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main()&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Worker&nbsp;peter&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Worker(); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boss&nbsp;boss&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Boss(); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peter.completed&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkCompleted(boss.WorkCompleted); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peter.started&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkStarted(Universe.WorkerStartedWork); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peter.completed&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkCompleted(Universe.WorkerCompletedWork); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peter.DoWork();&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;Main:&nbsp;工人工作完成&rdquo;); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine(); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p><strong>事件</strong></p>
<p>不幸的是，宇宙太忙了，也不习惯时刻关注它里面的个体，它可以用自己的委托替换了彼得老板的委托。这是把彼得的Worker类的的委托字段做成public的一个无意识的副作用。同样，如果彼得的老板不耐烦了，也可以决定自己来激发彼得的委托（真是一个粗鲁的老板）： </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="comment">//&nbsp;Peter's&nbsp;boss&nbsp;taking&nbsp;matters&nbsp;into&nbsp;his&nbsp;own&nbsp;hands </span><span>&nbsp;</span></span></li><li><span></span><span class="keyword">if</span><span>(&nbsp;peter.completed&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;peter.completed();&nbsp;&nbsp;</span></li></ol></pre>
<p>彼得不想让这些事发生，他意识到需要给每个委托提供&ldquo;注册&rdquo;和&ldquo;反注册&rdquo;功能，这样监听者就可以自己添加和移除委托，但同时又不能清空整个列表也不能随意激发彼得的事件了。彼得并没有来自己实现这些功能，相反，他使用了event关键字让C#编译器为他构建这些方法： </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">class</span><span>&nbsp;Worker&nbsp;{ &nbsp;</span></span></li><li><span>... &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">event</span><span>&nbsp;WorkStarted&nbsp;started; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">event</span><span>&nbsp;WorkProgressing&nbsp;progressing; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">event</span><span>&nbsp;WorkCompleted&nbsp;completed; &nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p>彼得知道event关键字在委托的外边包装了一个property，仅让C#客户通过+= 和 -=操作符来添加和移除，强迫他的老板和宇宙正确地使用事件。 </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;Main()&nbsp;{ &nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;Worker&nbsp;peter&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Worker(); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Boss&nbsp;boss&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Boss(); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;peter.completed&nbsp;+=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkCompleted(boss.WorkCompleted); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;peter.started&nbsp;+=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkStarted(Universe.WorkerStartedWork); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;peter.completed&nbsp;+=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkCompleted(Universe.WorkerCompletedWork); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;peter.DoWork();&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;Main:&nbsp;工人工作完成&rdquo;); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine(); &nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p><strong>&ldquo;收获&rdquo;所有结果</strong></p>
<p>到这时，彼得终于可以送一口气了，他成功地满足了所有监听者的需求，同时避免了与特定实现的紧耦合。但是他注意到他的老板和宇宙都为它的工作打了
分，但是他仅仅接收了一个分数。面对多个监听者，他想要&ldquo;收获&rdquo;所有的结果，于是他深入到代理里面，轮询监听者列表，手工一个个调用： </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;DoWork()&nbsp;{ &nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"&ldquo;工作:&nbsp;工作完成&rdquo;"</span><span>); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;completed&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span>(&nbsp;WorkCompleted&nbsp;wc&nbsp;</span><span class="keyword">in</span><span>&nbsp;completed.GetInvocationList()&nbsp;)&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;grade&nbsp;=&nbsp;wc(); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工人的工作得分＝&rdquo;&nbsp;+&nbsp;grade); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p><strong>异步通知：激发 &amp; 忘掉</strong></p>
<p><strong></strong>同时，他的老板和宇宙还要忙于处理其他事情，也就是说他们给彼得打分所花费的事件变得非常长： </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">class</span><span>&nbsp;Boss&nbsp;{ &nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;WorkCompleted()&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Threading.Thread.Sleep(3000); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"Better..."</span><span>);&nbsp;</span><span class="keyword">return</span><span>&nbsp;6;&nbsp;</span><span class="comment">/*&nbsp;总分为10&nbsp;*/</span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>}&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span></span><span class="keyword">class</span><span>&nbsp;Universe&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;WorkerCompletedWork()&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Threading.Thread.Sleep(4000); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"Universe&nbsp;is&nbsp;pleased&nbsp;with&nbsp;worker's&nbsp;work"</span><span>); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;7; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p>很不幸，彼得每次通知一个监听者后必须等待它给自己打分，现在这些通知花费了他太多的工作事件。于是他决定忘掉分数，仅仅异步激发事件： </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;DoWork()&nbsp;{ &nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"&ldquo;工作:&nbsp;工作完成&rdquo;"</span><span>); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;completed&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span>(&nbsp;WorkCompleted&nbsp;wc&nbsp;</span><span class="keyword">in</span><span>&nbsp;completed.GetInvocationList()&nbsp;) &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wc.BeginInvoke(</span><span class="keyword">null</span><span>,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p><strong>异步通知：轮询</strong></p>
<p>这使得彼得可以通知他的监听者，然后立即返回工作，让进程的线程池来调用这些代理。随着时间的过去，彼得发现他丢失了他工作的反馈，他知道听取别人的赞扬和努力工作一样重要，于是他异步激发事件，但是周期性地轮询，取得可用的分数。 </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;DoWork()&nbsp;{ &nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"&ldquo;工作:&nbsp;工作完成&rdquo;"</span><span>); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;completed&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span>(&nbsp;WorkCompleted&nbsp;wc&nbsp;</span><span class="keyword">in</span><span>&nbsp;completed.GetInvocationList()&nbsp;)&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAsyncResult&nbsp;res&nbsp;=&nbsp;wc.BeginInvoke(</span><span class="keyword">null</span><span>,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(&nbsp;!res.IsCompleted&nbsp;)&nbsp;System.Threading.Thread.Sleep(1); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;grade&nbsp;=&nbsp;wc.EndInvoke(res); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工人的工作得分＝&rdquo;&nbsp;+&nbsp;grade); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p><strong>异步通知：委托</strong></p>
<p>不幸地，彼得有回到了一开始就想避免的情况中来，比如，老板站在背后盯着他工作。于是，他决定使用自己的委托作为他调用的异步委托完成的通知，让他自己立即回到工作，但是仍可以在别人给他的工作打分后得到通知： </p>
<pre><ol class="dp-c"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;DoWork()&nbsp;{ &nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span class="string">"&ldquo;工作:&nbsp;工作完成&rdquo;"</span><span>); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;completed&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span>(&nbsp;WorkCompleted&nbsp;wc&nbsp;</span><span class="keyword">in</span><span>&nbsp;completed.GetInvocationList()&nbsp;)&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wc.BeginInvoke(</span><span class="keyword">new</span><span>&nbsp;AsyncCallback(WorkGraded),&nbsp;wc); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>}&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span></span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;WorkGraded(IAsyncResult&nbsp;res)&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;WorkCompleted&nbsp;wc&nbsp;=&nbsp;(WorkCompleted)res.AsyncState; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;grade&nbsp;=&nbsp;wc.EndInvoke(res); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&ldquo;工人的工作得分＝&rdquo;&nbsp;+&nbsp;grade); &nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></pre>
<p><strong>宇宙中的幸福</strong></p>
<p>彼得、他的老板和宇宙最终都满足了。彼得的老板和宇宙可以收到他们感兴趣的事件通知，减少了实现的负担和非必需的往返&ldquo;差旅费&rdquo;。彼得可以通知他
们，而不管他们要花多长时间来从目的方法中返回，同时又可以异步地得到他的结果。彼得知道，这并不*十分*简单，因为当他异步激发事件时，方法要在另外一
个线程中执行，彼得的目的方法完成的通知也是一样的道理。但是，迈克和彼得是好朋友，他很熟悉线程的事情，可以在这个领域提供指导。 </p>
<p>他们永远幸福地生活下去&hellip;&hellip;&lt; 完&gt; </p><img src="http://www.cnblogs.com/h-hello/aggbug/1586206.html?type=2" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/h-hello/articles/1586206.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/h-hello/articles/1586206.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59098/" target="_blank">美博客列20家值得关注纽约创业企业</a><span style="color:gray">(2010-03-18 23:49)</span><br/>· <a href="http://news.cnblogs.com/n/59097/" target="_blank">王建宙：希望在国内销售苹果iPad和iPhone</a><span style="color:gray">(2010-03-18 22:53)</span><br/>· <a href="http://news.cnblogs.com/n/59095/" target="_blank">传网易微博20号正式上线 门户网站角力微博</a><span style="color:gray">(2010-03-18 22:48)</span><br/>· <a href="http://news.cnblogs.com/n/59094/" target="_blank">蓝港CEO王峰谈3年开发感悟：有点唠叨像唐僧</a><span style="color:gray">(2010-03-18 22:07)</span><br/>· <a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><span style="color:gray">(2010-03-18 22:03)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59068/" target="_blank">VS2010全球首发，京沪穗三地即将盛大发布</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>UML在系统分析、设计方面的应用理解</title><link>http://www.cnblogs.com/h-hello/articles/1583060.html</link><dc:creator>h-hello</dc:creator><author>h-hello</author><pubDate>Wed, 14 Oct 2009 03:26:00 GMT</pubDate><guid>http://www.cnblogs.com/h-hello/articles/1583060.html</guid><description><![CDATA[<p>阅读: 5 评论: 0 作者: <a href="http://www.cnblogs.com/h-hello/" target="_blank">h-hello</a> 发表于 2009-10-14 11:26 <a href="http://www.cnblogs.com/h-hello/articles/1583060.html" target="_blank">原文链接</a></p><p>《UML三大硬伤》，一个弟兄攻击了一下UML，也来说说个人的一点理解吧。原文见下面的链接。</p>
<p>至少UML里的用例图、活动图、状态图、类图、时序图还是很好用的（目前我也只用到这个程度了）。用例图主要可以提供一个软件功能的大视图，并且也
初步的把使用者的权限范围表达出来了；活动图好理解，相当于流程图，表达业务流程乃至程序算法时都是常用的；状态图和活动图互补，有时用状态机转换来表达
一些业务流转等很清楚；类图用来表达实体关系图、表达类的设计时很好用；时序图可以用来表达业务流程和接口交互，尤其用来表达类之间的接口（方法）是怎么
调用交互时，非常清楚。</p>
<p>UML可以用在系统分析阶段（用例图/活动图/状态图（业务建模）、类图(领域建模））、也可用在软件设计阶段（类图(类/对象设计）、活动图（算
法描述）、用例实现(时序图，接口交互)）。并且，通过用例实现，就把分析阶段和设计阶段连接起来了，前者就是OOA,后者就是OOD,然后接下来的弟兄
能看懂理解上述产出，基本照着实现程序就可以了，也就是OOP.这样一套下来，也就是说UML是帮助应用面向对象技术的一种表达方式，或许还有其他的表达
方式（比如敏捷方法里的&ldquo;代码就是设计&rdquo;，通过不断重构来实现？），但至少这种方式算是不错的。当然最终的效果，还是要看设计者的内功。</p>
<p>人是最关键的，UML只是种表达方式，只是个工具而已。很多弟兄感觉UML没用，或许只是他们不习惯用而已，也就是他们不习惯UML这种软件分析、
设计的表达方式而已。用惯UML的弟兄会觉得UML好用、能清楚表达自己的意思，看得懂UML的弟兄会觉得好理解，知道设计者要表达的意思--这也就是
UML的价值所在；而不习惯用UML的弟兄就会觉得UML没用，不如用其他的表达方式。如此而已。</p>
<p>因为我习惯用Rose的原因，或许不免有些偏向UML还是好用的观点。不过也不觉得它有多精妙。或许是要看用的程度吧，而国内的软件环境，就中小企业来说，可能是不允许你用得那么深的，不能承受这个成本。</p>
<p>上述夸夸其谈，未经最终检验。之前本来很想试试能做成什么效果的，可惜一直没这个机会。这么一套搞下来，时间精力都不允许。</p>
<p>
UML三大硬伤 <a href="http://www.vchome.net/swengineer/umlrosecmm/uml01.htm">http://www.vchome.net/swengineer/umlrosecmm/uml01.htm</a>，回复比原文更精彩感觉，值得一看。</p><img src="http://www.cnblogs.com/h-hello/aggbug/1583060.html?type=2" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/h-hello/articles/1583060.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/h-hello/articles/1583060.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59098/" target="_blank">美博客列20家值得关注纽约创业企业</a><span style="color:gray">(2010-03-18 23:49)</span><br/>· <a href="http://news.cnblogs.com/n/59097/" target="_blank">王建宙：希望在国内销售苹果iPad和iPhone</a><span style="color:gray">(2010-03-18 22:53)</span><br/>· <a href="http://news.cnblogs.com/n/59095/" target="_blank">传网易微博20号正式上线 门户网站角力微博</a><span style="color:gray">(2010-03-18 22:48)</span><br/>· <a href="http://news.cnblogs.com/n/59094/" target="_blank">蓝港CEO王峰谈3年开发感悟：有点唠叨像唐僧</a><span style="color:gray">(2010-03-18 22:07)</span><br/>· <a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><span style="color:gray">(2010-03-18 22:03)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59068/" target="_blank">VS2010全球首发，京沪穗三地即将盛大发布</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>超强的IE DOM查看工具：IE Web Developer V2</title><link>http://www.cnblogs.com/h-hello/articles/1572802.html</link><dc:creator>h-hello</dc:creator><author>h-hello</author><pubDate>Wed, 23 Sep 2009 09:31:00 GMT</pubDate><guid>http://www.cnblogs.com/h-hello/articles/1572802.html</guid><description><![CDATA[<p>阅读: 40 评论: 0 作者: <a href="http://www.cnblogs.com/h-hello/" target="_blank">h-hello</a> 发表于 2009-09-23 17:31 <a href="http://www.cnblogs.com/h-hello/articles/1572802.html" target="_blank">原文链接</a></p><p>使用firefox的时候，总是喜欢用它的DOM查看器来排查错误，或者是查看其他网站的页面设计。<br />幸运的是，IE也有这么一个工具，而且，还要来得强大一些，这就是<a title="IeInspector公司" href="http://www.ieinspector.com/" target="_blank">IeInspector公司</a>的<a title="IE WebDeveloper V2" href="http://www.ieinspector.com/dominspector/index.html">IE WebDeveloper V2</a>。<br /><br />程序安装后是IE的一个内嵌插件，在IE工具条上默认会有一个打开按钮：<img alt="工具条按钮" src="http://images.cnblogs.com/cnblogs_com/dypher/1.gif" border="0" height="30" width="33" /><br /><br />打开后主界面如下：<br /><img src="http://images.cnblogs.com/cnblogs_com/dypher/main.gif" longdesc="主界面" border="0" height="727" width="787" /><br /><br />使用也很简单。在主界面下方，有五个功能的Tab切换。<br /><br />在Webpage Inspector功能中，左边的列表是页面DOM节点的导航，选中某个元素后，可以在右边的信息区域中查看Attributes、HTML和Style。对于显示元素，选中后，在页面中还会进行区域标识，如图：<br /><img src="http://images.cnblogs.com/cnblogs_com/dypher/2.gif" longdesc="元素标识" border="0" height="627" width="793" /></p>
<p>Script Console功能中可以进行页面的script调试，如下图中测试获取页面中某个元素的值：<br /><img src="http://images.cnblogs.com/cnblogs_com/dypher/3.gif" border="0" height="416" width="835" /></p>
<p>Source Explore功能中可以查看页面代码中的变量和函数定义<br /><img src="http://images.cnblogs.com/cnblogs_com/dypher/4.gif" border="0" height="416" width="835" /><br /><br />Event Log中可以查看页面事件触发的列表<br /><img src="http://images.cnblogs.com/cnblogs_com/dypher/5.gif" border="0" height="416" width="835" /><br /><br />另外一个HTTP Monitor，是<a title="IeInspector公司" href="http://www.ieinspector.com/" target="_blank">IeInspector公司</a>另一个工具<a title="HTTP Analyzer" href="http://www.ieinspector.com/httpanalyzer/index.html">HTTP Analyzer</a>的简化版，这里不做具体的介绍，大家可以自己看看。<br /><br />总之，这个工具值得一试，如果大家还有更好的工具，欢迎进行讨论^_^</p><img src="http://www.cnblogs.com/h-hello/aggbug/1572802.html?type=2" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/h-hello/articles/1572802.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/h-hello/articles/1572802.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59098/" target="_blank">美博客列20家值得关注纽约创业企业</a><span style="color:gray">(2010-03-18 23:49)</span><br/>· <a href="http://news.cnblogs.com/n/59097/" target="_blank">王建宙：希望在国内销售苹果iPad和iPhone</a><span style="color:gray">(2010-03-18 22:53)</span><br/>· <a href="http://news.cnblogs.com/n/59095/" target="_blank">传网易微博20号正式上线 门户网站角力微博</a><span style="color:gray">(2010-03-18 22:48)</span><br/>· <a href="http://news.cnblogs.com/n/59094/" target="_blank">蓝港CEO王峰谈3年开发感悟：有点唠叨像唐僧</a><span style="color:gray">(2010-03-18 22:07)</span><br/>· <a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><span style="color:gray">(2010-03-18 22:03)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59068/" target="_blank">VS2010全球首发，京沪穗三地即将盛大发布</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>推荐一个叫Full Source的IE功能扩展</title><link>http://www.cnblogs.com/h-hello/articles/1572798.html</link><dc:creator>h-hello</dc:creator><author>h-hello</author><pubDate>Wed, 23 Sep 2009 09:29:00 GMT</pubDate><guid>http://www.cnblogs.com/h-hello/articles/1572798.html</guid><description><![CDATA[<p>阅读: 5 评论: 0 作者: <a href="http://www.cnblogs.com/h-hello/" target="_blank">h-hello</a> 发表于 2009-09-23 17:29 <a href="http://www.cnblogs.com/h-hello/articles/1572798.html" target="_blank">原文链接</a></p><p> 一直以为国人比较喜欢比来比去，什么Windows&nbsp;vs linux、.NET vs java、IE vs firefox等等。原来老外也有无聊到一定水平的，这不发现原来"<a href="http://news.csdn.net/news/newstopic/21/21668.shtml">101件Mozilla 浏览器能而IE 不能做的事</a>"一文的始作俑者是老外<img src="http://www.cnblogs.com/Emoticons/emsmileo.gif" border="0" height="19" width="19" />。原文叫：101 things that the Mozilla browser can do that IE cannot。<br /><br />&nbsp;&nbsp;&nbsp; 其实101条是个镢头了，但老外似乎对101这个数字比较感冒。这100多条罪状中有很多都十分的牵强，当然也有些确实是能戳到IE软肋的。不过第23条确实让我对IE也有些冒火了<img src="http://www.cnblogs.com/Emoticons/angry_smile.gif" border="0" height="19" width="19" />，就是关于IE提供的View Source功能，从我第一次看到IE(因该是IE3.0)到现在的IE 6.0 sp1，察看网页源代码只能使用一个简陋的不能在简陋的Notepad<img src="http://www.cnblogs.com/Emoticons/emdgust.gif" border="0" height="19" width="19" />! 并且没有办法方便的查看整个页面DOM中的HTML代码。特别是后者对于DHTML开发调试非常有帮助，而Mozilla在这点上确实强的让人口服心服。<br /><br />&nbsp;&nbsp;&nbsp; 幸好有一天无意中在网上发现一个叫"Full Source"的IE功能扩展，其实这个小工具非常的简单，他就是在IE的右键菜单中添加一个叫"Full Source"的条目，使用这个功能，我们就可以查看当前页面的DOM中的HTML代码。其介绍和下载为：</p>
<div class="content" fixed_bound="true">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; Full Source
<p fixed_bound="true">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.thundermain.com/MenuExt.png" fixed_bound="true" /> </p>
<p fixed_bound="true">&nbsp;&nbsp;&nbsp; Full Source is an Internet Explorer menu
extension which displays the source Internet Explorer is displaying,
directly from the Internet Explorer object model. This is useful
wherever javascript is dynamically writing HTML into the DOM, or where
XSLT has been used to generate HTML. </p>
<p fixed_bound="true">&nbsp;&nbsp;&nbsp; To install, simply unzip the two files, then
right click on the .inf file and choose "Install". This will copy the
.html file into the Windows directory and register the extension in the
Registry. You will need to restart Internet Explorer to see the menu
extension. </p>
<p fixed_bound="true" align="right"><a href="http://www.thundermain.com/fullsource.zip" fixed_bound="true">Download (2K)</a>::</p>
</div><img src="http://www.cnblogs.com/h-hello/aggbug/1572798.html?type=2" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/h-hello/articles/1572798.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/h-hello/articles/1572798.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59098/" target="_blank">美博客列20家值得关注纽约创业企业</a><span style="color:gray">(2010-03-18 23:49)</span><br/>· <a href="http://news.cnblogs.com/n/59097/" target="_blank">王建宙：希望在国内销售苹果iPad和iPhone</a><span style="color:gray">(2010-03-18 22:53)</span><br/>· <a href="http://news.cnblogs.com/n/59095/" target="_blank">传网易微博20号正式上线 门户网站角力微博</a><span style="color:gray">(2010-03-18 22:48)</span><br/>· <a href="http://news.cnblogs.com/n/59094/" target="_blank">蓝港CEO王峰谈3年开发感悟：有点唠叨像唐僧</a><span style="color:gray">(2010-03-18 22:07)</span><br/>· <a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><span style="color:gray">(2010-03-18 22:03)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59068/" target="_blank">VS2010全球首发，京沪穗三地即将盛大发布</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>.NET项目是否有必要升级到.NET 3.5 + VS 2008</title><link>http://www.cnblogs.com/h-hello/articles/1568034.html</link><dc:creator>h-hello</dc:creator><author>h-hello</author><pubDate>Wed, 16 Sep 2009 10:54:00 GMT</pubDate><guid>http://www.cnblogs.com/h-hello/articles/1568034.html</guid><description><![CDATA[<p>阅读: 6 评论: 0 作者: <a href="http://www.cnblogs.com/h-hello/" target="_blank">h-hello</a> 发表于 2009-09-16 18:54 <a href="http://www.cnblogs.com/h-hello/articles/1568034.html" target="_blank">原文链接</a></p><p>前言：.NET 3.5 + VS 2008已经发布一年多了，可是还有一半以上的企业和开发团队在用VS2005+.Net
2.0(包括我们公司)，甚至还有用.Net
1.1+VS2003的。生产工具是提高生产力的最重要途径，但是还有许多人没意识到08系列的强大。本来写此文来说服公司领导，顺便也发出来，想表达这
种观点：不与时俱进就要时不我待啦！网上好像还没有这么一篇较短篇幅的文章能系统说明一下08+3.5的改进和创新，偶把所知道都整理出来，希望大家指正
这些观点的理解。<br /><strong><span style="font-size: 12pt; font-family: 宋体;"></span></strong></p>
<p><strong><span style="font-size: 12pt; font-family: 宋体;"><br /></span></strong></p>
<p><strong><span style="font-size: 12pt; font-family: 宋体;">一、Visual Studio 2008环境新特性</span></strong></p>
<p><strong>&nbsp;</strong></p>
<p style="margin-left: 27pt; text-indent: -9pt;" align="left"><strong><span style="font-size: 10pt; font-family: Symbol;">&middot;<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp; </span></span><span>&nbsp;&nbsp;NET Framework </span><span style="font-family: 宋体;">兼容支持</span></strong><span> <br /> <br /> </span><span style="font-family: 宋体;">使用</span><span>Visual Studio 2008</span><span style="font-family: 宋体;">可以进行基于多个</span><span>.net framework </span><span style="font-family: 宋体;">版本的开发，</span><span>Visual Studio 2008</span><span style="font-family: 宋体;">同时支持</span><span>framework 2.0/3.0</span><span style="font-family: 宋体;">和</span>3.5<span style="font-family: 宋体;">几个版本。在不同的版本下它可以自动的框架特性工具箱，项目类型，引用，智能提示</span>&hellip;&hellip;<span style="font-family: 宋体;">过滤功能。我们升级到</span><span>Visual Studio 2008</span><span style="font-family: 宋体;">也非常简单。</span><span> <br /> <br /> </span></p>
<div align="left">  </div>
<p style="margin-left: 27pt; text-indent: -9pt;" align="left"><strong><span style="font-size: 10pt; font-family: Symbol;"><span>&middot;<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>ASP.NET AJAX<span style="font-family: 宋体;">和</span>JavaScript<span style="font-family: 宋体;">智能客户端支持</span></strong><span> <br /> <br /> ASP.NET AJAX</span><span style="font-family: 宋体;">成为</span>.NET 3.5<span style="font-family: 宋体;">的一部分，除了包括</span>ASP.NET AJAX 1.0<span style="font-family: 宋体;">的所有功能外，还集成了</span>WebParts<span style="font-family: 宋体;">的</span>UpdatePanel<span style="font-family: 宋体;">，与</span><span>&lt;asp:menu&gt; and &lt;asp:treeview&gt;</span><span style="font-family: 宋体;">这样的控件的</span> ASP.NET <span style="font-family: 宋体;">实现</span>AJAX <span style="font-family: 宋体;">集成。编写</span>JavaScript<span style="font-family: 宋体;">提供了智能提示和调试的功能，还增加了</span>JSON<span style="font-family: 宋体;">的全面支持，无论在</span>WCF<span style="font-family: 宋体;">还是AJAX上都有广泛的应用。</span><span> <br /> <br /> </span></p>
<div align="left">  </div>
<p style="margin-left: 27pt; text-indent: -9pt;" align="left"><strong><span style="font-size: 10pt; font-family: Symbol;"><span>&middot;<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">全新的</span>Web<span style="font-family: 宋体;">开发体验</span></strong><span> <br /> <br /> Web</span><span style="font-family: 宋体;">设计器提供了分割视图编辑、嵌套母板页、以及强大的</span>CSS<span style="font-family: 宋体;">编辑器集成。</span><span><br /> ASP.NET</span><span style="font-family: 宋体;">提供了三个新的控件：</span><span>&lt;asp: ListView&gt;</span><span style="font-family: 宋体;">、</span><span>&lt;asp: DataPager&gt;</span><span style="font-family: 宋体;">、</span><span>&lt;asp: LinqDataSource&gt;</span><span style="font-family: 宋体;">，这些控件对数据场景提供了非常好的支持，允许对输出的标识做完全的控制。</span></p>
<div align="left">  </div>
<p style="margin-left: 18pt;" align="left">&nbsp;</p>
<div align="left">  </div>
<p style="margin-left: 27pt; text-indent: -9pt;" align="left"><strong><span style="font-size: 10pt; font-family: Symbol;"><span>&middot;<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">其他</span></strong></p>
<div align="left">    </div>
<p style="margin-left: 27pt;" align="left">Visual Studio 2008<span style="font-family: 宋体;">加入拼写检查器，可以在编译前对不正确的定义或返回类型进行检查。也优化了特别是自动提示和重构功能</span></p>
<div align="left">    </div>
<p style="margin-left: 27pt;" align="left"><span style="font-family: 宋体;">支持智能部署</span>ClickOnce<span style="font-family: 宋体;">；</span>.<span style="font-family: 宋体;">集成对</span><span>Office (VSTO)</span><span style="font-family: 宋体;">和</span><span>Sharepoint 2007</span><span style="font-family: 宋体;">开发的支持。</span></p>
<div align="left">    </div>
<p style="margin-left: 27pt;" align="left"><span style="font-family: 宋体;">性能上，运行一个后台编译器的速度比原来提高了一倍以上，而使用的内存不到原来的一半。</span>VS2008<span style="font-family: 宋体;">精简了</span>CLR<span style="font-family: 宋体;">的线程池，使各种类型的多线程应用程序也得到性能改进。</span></p>
<p><strong>&nbsp;</strong></p>
<p><strong><span style="font-size: 12pt; font-family: 宋体;">二、.Net FrameWork 3.5的新语法特性：</span></strong></p>
<ul style="margin-top: 0cm;" type="disc">
<li><span style="font-family: 宋体;">自动属性</span><span>(Auto-Implemented      Properties) </span></li>
</ul>
<ul style="margin-top: 0cm;" type="disc">
<li><span style="font-family: 宋体;">隐含类型局部变量</span><span>(Local Variable Type      Inference) </span></li>
</ul>
<ul style="margin-top: 0cm;" type="disc">
<li><span style="font-family: 宋体;">匿名类型</span>(Anonymous Types) </li>
</ul>
<ul style="margin-top: 0cm;" type="disc">
<li><span style="font-family: 宋体;">对象与集合初始化器</span><span>(Object and Collection      Initializers) </span></li>
</ul>
<ul style="margin-top: 0cm;" type="disc">
<li><span style="font-family: 宋体;">扩展方法</span>(Extension Methods) </li>
</ul>
<ul style="margin-top: 0cm;" type="disc">
<li>Lambda<span style="font-family: 宋体;">表达式和</span>Lambda<span style="font-family: 宋体;">表达式树</span> (Lambda Expression and Lambda Expression Trees) </li>
</ul>
<ul style="margin-top: 0cm;" type="disc">
<li><span style="font-family: 宋体;">语言级集成查询</span>Linq<span style="font-family: 宋体;">系列支持</span>(<span style="font-size: 10pt; font-family: Arial;">Language INtegrated Query</span>)</li>
</ul>
<p style="margin-left: 18pt;">&nbsp;</p>
<p><strong><span style="font-family: 宋体;">自动属性</span></strong><span style="font-family: 宋体;">举例：</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: #2b91af;">String</span> name;</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: #2b91af;">String</span> Name</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">get</span> { <span style="color: blue;">return</span> name; }</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">set</span> { name = <span style="color: blue;">value</span>; }</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-indent: 21pt;"><span style="font-size: 10pt; font-family: Verdana;">}</span></p>
<p style="text-indent: 21pt;">.NET 3.5<span style="font-family: 宋体;">下的新写法：</span><span style="background: #e0e0e0 none repeat scroll 0% 0%; font-size: 10pt; font-family: Verdana; color: blue;">public</span><span style="background: #e0e0e0 none repeat scroll 0% 0%; font-size: 10pt; font-family: Verdana;"> <span style="color: #2b91af;">String</span> Name { <span style="color: blue;">set</span>; <span style="color: blue;">get</span>; }</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体;">隐含类型局部变量</span></strong><span style="font-family: 宋体;">举例：</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var</span> url = <span style="color: #a31515;">"http://www.168.com"</span>;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">//url</span></span><span style="font-size: 10pt; font-family: 宋体; color: green;">被识别</span><span style="font-size: 10pt; font-family: Verdana; color: green;">String</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var</span> dt = <span style="color: blue;">new</span> <span style="color: #2b91af;">DataTable</span>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">//dt</span></span><span style="font-size: 10pt; font-family: 宋体; color: green;">被识别为</span><span style="font-size: 10pt; font-family: Verdana; color: green;">DataTable</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%;"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var</span> status = <span style="color: blue;">false</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">//status</span></span><span style="font-size: 10pt; font-family: 宋体; color: green;">被识别为</span><span style="font-size: 10pt; font-family: Verdana; color: green;">Boolen</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体;">匿名类型</span></strong><span style="font-family: 宋体;">举例：</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var </span>site1 = <span style="color: blue;">new</span> { url = " http://1.2.3.4 ", title = "</span><span style="font-family: 宋体;">BBS</span><span>", author = "Alex", qq = "4111852" };<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var</span> site2 = <span style="color: blue;">new</span> { url = " http://www.168.com ", title = "Title", author = "Alex", qq = "4111852" };<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; site1.url = site2.url;</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体;">对象与集合初始化器</span></strong><span style="font-family: 宋体;">举例：</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; font-family: Verdana; color: #2b91af;">User </span>user = new <span style="font-size: 10pt; font-family: Verdana; color: #2b91af;">User</span><span>();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.Id = 1;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.Name = "Alex";<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.Age = 22;</span></p>
<p>.NET 3.5<span style="font-family: 宋体;">下新的写法：</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var</span> user = new </span><span style="font-size: 10pt; font-family: Verdana; color: #2b91af;">User </span><span>{ Id = 1, Name = "Alex", Age = 22 };</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体;">扩展方法</span></strong><span style="font-family: 宋体;">举例：</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> Int(<span style="color: blue;">this</span> <span style="color: #2b91af;">HttpRequest</span> request, <span style="color: blue;">string</span> key)</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> <span style="color: blue;">int</span>.Parse(request[key]);</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-indent: 21pt;"><span style="font-size: 10pt; font-family: Verdana;">}</span></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;">调用方法：</span><span style="background: #e0e0e0 none repeat scroll 0% 0%; color: blue;">int </span><span style="background: #e0e0e0 none repeat scroll 0% 0%;">id = Request.Int("id");</span></p>
<p>&nbsp;</p>
<p><strong>Lambda</strong><strong><span style="font-family: 宋体;">表达式和</span>Lambda</strong><strong><span style="font-family: 宋体;">表达式树</span></strong><span style="font-family: 宋体;">举例：</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left; text-indent: 20.25pt;" align="left"><span style="font-size: 10pt; font-family: 新宋体; color: blue;">string</span><span style="font-size: 10pt; font-family: 新宋体;">[] nums = { <span style="color: #a31515;">"8"</span>, <span style="color: #a31515;">"966"</span>, <span style="color: #a31515;">"55"</span>, <span style="color: #a31515;">"-14"</span>, <span style="color: #a31515;">"33"</span>, <span style="color: #a31515;">"2"</span> };</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left; text-indent: 20.25pt;" align="left"><span style="font-size: 10pt; font-family: Verdana; color: green;">//</span><span style="font-size: 10pt; font-family: 宋体; color: green;">选择数组中第偶数个元素的数值平方并输出排序后的结果</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 新宋体;"><span>&nbsp;&nbsp;&nbsp; </span>nums.Select(n =&gt; <span style="color: #2b91af;">Int32</span>.Parse(n))</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 新宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>.Where(n =&gt; n % 2 == 0)</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 新宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>.Select(n =&gt; n * n)</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 新宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>.OrderBy(n =&gt; n)</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 新宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>.ToList()</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%;"><span style="font-size: 10pt; font-family: 新宋体;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>.ForEach(n =&gt; <span style="color: #2b91af;">Console</span>.WriteLine(n));</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体;">n =&gt; n % 2 == 0</span><span style="font-family: 宋体;">，</span><span style="font-size: 10pt; font-family: 新宋体;">n =&gt; <span style="color: #2b91af;">Console</span>.WriteLine(n)</span><span style="font-size: 10pt; font-family: 新宋体;">等</span><span style="font-family: 宋体;">都是</span>Lambda<span style="font-family: 宋体;">表达式。</span></p>
<p>&nbsp;</p>
<p><strong><span>Linq(Linq To Entity)</span></strong><span style="font-family: 宋体;">举例：</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: #2b91af;">IList</span> getUserLogin()</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">using</span> (<span style="color: blue;">var</span> TE = <span style="color: blue;">new</span> <span style="color: #2b91af;">TestEntities</span>())</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var</span> lstLogin = (<span style="color: blue;">from</span> user <span style="color: blue;">in</span> TE.Users <span style="color: blue;">where</span> user.Enabled = 1</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">select</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">Login</span></span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PW = user.Pass,</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID = user.Id</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}).ToList();</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> lstLogin;</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-align: left;" align="left"><span style="font-size: 10pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="background: #e0e0e0 none repeat scroll 0% 0%; text-indent: 21pt;"><span style="font-size: 10pt; font-family: Verdana;">}</span></p>
<p><strong>&nbsp;</strong>关于.Net 3.5的语言特性，老赵在博客里有<a title="极为精妙的论述" href="http://www.cnblogs.com/JeffreyZhao/archive/2009/06/27/1512390.html">极为精妙的论述</a>，强烈建议没有看过的朋友同学去读一下。</p>
<p>&nbsp;</p>
<p><strong></strong></p>
<p><strong><span style="font-size: 12pt; font-family: 宋体;">三、历史性的三大集成框架：</span></strong></p>
<p>    　　（太重要了，未来两到三年一定会成为招聘.Net开发的基本要求）　　<br /></p>
<ul style="margin-top: 0cm;" type="disc">
<li><strong><span>WPF (Windows      Presentation Foundation) </span></strong></li>
</ul>
<p style="margin-left: 9pt;">WPF<span style="font-family: 宋体;">是微软新一代图形系统，为用户界面、</span>2D/3D <span style="font-family: 宋体;">图形、文档、视频、动画、三维等媒体提供了统一的描述和操作方法。基于</span><span>DirectX 9/10</span><span style="font-family: 宋体;">技术的</span>WPF<span style="font-family: 宋体;">不仅带来了前所未有的</span>3D<span style="font-family: 宋体;">界面，而且其图形向量渲染引擎也大大改进了传统的</span>2D<span style="font-family: 宋体;">界面，比如</span>Vista<span style="font-family: 宋体;">中的半透明效果的窗体等都得益于</span>WPF<span style="font-family: 宋体;">。</span> <span style="font-family: 宋体;">程序员在</span>WPF<span style="font-family: 宋体;">的帮助下，要开发出媲美</span>Mac<span style="font-family: 宋体;">程序的酷炫界面已不再是遥不可及的奢望。</span> WPF<span style="font-family: 宋体;">相对于</span>Windows<span style="font-family: 宋体;">客户端的开发来说，向前跨出了巨大的一步，它提供了超丰富的</span>.NET UI <span style="font-family: 宋体;">框架，集成了矢量图形，丰富的流动文字支持</span><span>flow text support</span><span style="font-family: 宋体;">，</span>3D<span style="font-family: 宋体;">视觉效果和强大无比的控件模型框架。</span></p>
<p style="margin-left: 9pt;"><span style="font-family: 宋体;">对于开发人员和设计人员，</span>WPF<span style="font-family: 宋体;">引擎统一了开发人员和设计人员体验文档、媒体和</span> UI <span style="font-family: 宋体;">的方式他们从此只需学习一个模式。对于</span> .NET <span style="font-family: 宋体;">开发人员，其框架是熟悉的，并且它最终将减少提供最佳用户体验和通信逻辑所需的代码行数。对于设计人员，</span>WPF <span style="font-family: 宋体;">提供的平台可消除内容、媒体和应用程序之间的边界。更重要的是，</span>WPF<span style="font-family: 宋体;">可以使开发人员和设计人员像</span>Web<span style="font-family: 宋体;">开发一样同步紧密地合作，也将大大提高</span>C/S<span style="font-family: 宋体;">项目开发效率。</span></p>
<p style="margin-left: 18pt;">&nbsp;</p>
<ul style="margin-top: 0cm;" type="disc">
<li><strong><span>WCF (Windows      Communication Foundation) </span></strong></li>
</ul>
<p style="margin-left: 9pt;"><span style="font-family: 宋体;">是</span>Microsoft<span style="font-family: 宋体;">为构建面向服务的应用提供的分布式通信编程框架，</span>.NET Framework 3.5<span style="font-family: 宋体;">的重要组成部分。使用该框架，开发人员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。</span></p>
<p style="margin-left: 9pt;"><span style="font-family: 宋体;">从功能的角度来看，</span>WCF<span style="font-family: 宋体;">完全可以看作是</span>ASMX<span style="font-family: 宋体;">，</span>.Net Remoting<span style="font-family: 宋体;">，</span>Enterprise Service<span style="font-family: 宋体;">，</span>WSE<span style="font-family: 宋体;">，</span>MSMQ<span style="font-family: 宋体;">等技术的并集。利用</span>WCF<span style="font-family: 宋体;">，就可以解决包括安全、可信赖、互操作、跨平台通信等等需求。开发者再不用去分别了解</span>.Net Remoting<span style="font-family: 宋体;">，</span>ASMX<span style="font-family: 宋体;">等等各种技术了，同时，</span>WCF<span style="font-family: 宋体;">充分地考虑了与旧有系统的兼容性。安装</span>WCF<span style="font-family: 宋体;">并不会影响原有的</span>.Net Remoting<span style="font-family: 宋体;">等技术方案。</span></p>
<p style="margin-left: 18pt;">&nbsp;</p>
<ul style="margin-top: 0cm;" type="disc">
<li><strong><span>ADO.NET Entity      Framework</span></strong></li>
</ul>
<p style="margin-left: 8.8pt;"><span style="font-family: 宋体;">微软以</span> ADO.NET <span style="font-family: 宋体;">为基础所发展出来的对象关系对应</span> (O/R Mapping) <span style="font-family: 宋体;">解决方案。</span></p>
<p style="margin-left: 8.8pt;">ADO.NET Entity Framework <span style="font-family: 宋体;">以</span> Entity Data Model (EDM) <span style="font-family: 宋体;">为主，将数据逻辑层切分为三块，分别为</span> Conceptual Schema, Mapping Schema <span style="font-family: 宋体;">与</span> Storage Schema <span style="font-family: 宋体;">三层，其上还有</span> Entity Client<span style="font-family: 宋体;">，</span>Object Context <span style="font-family: 宋体;">以及</span> LINQ <span style="font-family: 宋体;">可以使用。</span><span>Entity Framework</span><span style="font-family: 宋体;">在</span><span> Visual Studio 2008 </span><span style="font-family: 宋体;">和</span>.Net 3.5 CLR<span style="font-family: 宋体;">中都有充分的支持，也非常容易上手。使用</span>Entity Framework<span style="font-family: 宋体;">，可以减少</span>70<span style="font-family: 宋体;">％</span>-90%<span style="font-family: 宋体;">的数据访问层代码，极大地提高</span>.Net<span style="font-family: 宋体;">程序的开发效率、维护效率及程序健壮性。</span></p><img src="http://www.cnblogs.com/h-hello/aggbug/1568034.html?type=2" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/h-hello/articles/1568034.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/h-hello/articles/1568034.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59098/" target="_blank">美博客列20家值得关注纽约创业企业</a><span style="color:gray">(2010-03-18 23:49)</span><br/>· <a href="http://news.cnblogs.com/n/59097/" target="_blank">王建宙：希望在国内销售苹果iPad和iPhone</a><span style="color:gray">(2010-03-18 22:53)</span><br/>· <a href="http://news.cnblogs.com/n/59095/" target="_blank">传网易微博20号正式上线 门户网站角力微博</a><span style="color:gray">(2010-03-18 22:48)</span><br/>· <a href="http://news.cnblogs.com/n/59094/" target="_blank">蓝港CEO王峰谈3年开发感悟：有点唠叨像唐僧</a><span style="color:gray">(2010-03-18 22:07)</span><br/>· <a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><span style="color:gray">(2010-03-18 22:03)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59068/" target="_blank">VS2010全球首发，京沪穗三地即将盛大发布</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>使用YUI Compressor压缩CSS/JS</title><link>http://www.cnblogs.com/h-hello/articles/1562589.html</link><dc:creator>h-hello</dc:creator><author>h-hello</author><pubDate>Tue, 08 Sep 2009 07:32:00 GMT</pubDate><guid>http://www.cnblogs.com/h-hello/articles/1562589.html</guid><description><![CDATA[<p>阅读: 70 评论: 1 作者: <a href="http://www.cnblogs.com/h-hello/" target="_blank">h-hello</a> 发表于 2009-09-08 15:32 <a href="http://www.cnblogs.com/h-hello/articles/1562589.html" target="_blank">原文链接</a></p><p>S/CSS文件大，用户访问站点的时候需要下载JS/CSS的时间长就会感觉慢，有的甚至由于CSS的文件而造成页面初始打开很凌乱。
</p>
<p>我们怎么提高用户下载JS/CSS的速度呢？</p>
<p>1、我们无法改变用户的网络状况，只有自己网站使用更快的带宽或者使用更强的服务器，使用户访问我们的时候感觉很快。</p>
<p>2、对JS/CSS文件进行压缩，由于文件较小，用户下载的时间就很短。</p>
<p>解决方案1，需要花费比较多的money,方案2实现比较简单，而且效果也明显。</p>
<p>下面我们介绍使用YUI Compressor进行JS/CSS压缩</p>
<p>1、下载yuicompressor <a href="http://www.julienlecomte.net/yuicompressor/">http://www.julienlecomte.net/yuicompressor/</a></p>
<p>2、使用ant编译得到yuicompressor-x.y.z.jar的包，进入yuicompressor-x.y.z目录运行ant -f build.xml</p>
<p>3、在build目录下得到yuicompressor-x.y.z.jar的包，使用java -jar yuicompressor-2.4.2.jar in.js -o out.js</p>
<p>看下out.js的源文件就会发现去掉了注释空格等信息。</p>
<p>更多yui compressor的帮助请查看 <a href="http://www.julienlecomte.net/yuicompressor/README">http://www.julienlecomte.net/yuicompressor/README</a></p>
<p>&nbsp;</p>
<p>项目中需要对javascript进行打包和压缩，我选用了yuicompressor <br /><br />yuicompressor可以压缩JS和CSS文件，去除文件中的无用空格、换行和注释。大大的减小JS和CSS文件的体积。 <br /><br />简单的命令如下 <br /></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
<li><span>java&nbsp;-jar&nbsp;yuicompressor-</span><span class="number"><span style="color: #c00000;">2.4</span></span><span>.</span><span class="number"><span style="color: #c00000;">2</span></span><span>.jar&nbsp;--type&nbsp;js&nbsp;--charset&nbsp;utf-</span><span class="number"><span style="color: #c00000;">8</span></span><span>&nbsp;-o&nbsp;uiiang.js&nbsp;table.js&nbsp;&nbsp;</span> </li>
</ol></div>
<p>&nbsp;</p>
<pre name="code" class="java">java -jar yuicompressor-2.4.2.jar --type js --charset utf-8 -o uiiang.js table.js</pre>
<p><br />--type指定要打包的文件类型，可选的有 js和css <br />--charset 指定字符集 <br />-o 指定输出的文件名，如果不指定这个参数将会把压缩后的内容输出到命令行上 <br />最后的table.js是要打包的源文件 <br /><br />不过这样压缩有一个缺点，只能一个一个文件的进行压缩，所以使用bat进行批处理压缩 <br /><br />建立一个compresjs.bat文件，内容如下 <br /></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
<li><span>(dir&nbsp;%</span><span class="number"><span style="color: #c00000;">1</span></span><span>&nbsp;/aa&nbsp;/b&nbsp;/s&nbsp;|&nbsp;findstr&nbsp;/e&nbsp;/c:</span><span class="string"><span style="color: #0000ff;">"js"</span></span><span>)&nbsp;&gt;tmp.txt &nbsp;&nbsp;</span> </li>
<li><span class="keyword"><strong><span style="color: #7f0055;">for</span></strong></span><span>&nbsp;/f&nbsp;%%i&nbsp;in&nbsp;(tmp.txt)&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">do</span></strong></span><span>&nbsp;java&nbsp;-jar&nbsp;yuicompressor-</span><span class="number"><span style="color: #c00000;">2.4</span></span><span>.</span><span class="number"><span style="color: #c00000;">2</span></span><span>.jar&nbsp;--type&nbsp;js&nbsp;--charset&nbsp;utf-</span><span class="number"><span style="color: #c00000;">8</span></span><span>&nbsp;-o&nbsp;%%i.tmp&nbsp;%%i&nbsp;&amp;&nbsp;copy&nbsp;%%i</span><span class="string"><span style="color: #0000ff;">".tmp"</span></span><span>&nbsp;%%i&nbsp;&amp;&nbsp;del&nbsp;%%i</span><span class="string"><span style="color: #0000ff;">".tmp"</span></span><span>&nbsp;&nbsp;</span> </li>
</ol></div>
<p>&nbsp;</p>
<pre name="code" class="java">(dir %1 /aa /b /s | findstr /e /c:"js") &gt;tmp.txt
for /f %%i in (tmp.txt) do java -jar yuicompressor-2.4.2.jar --type js --charset utf-8 -o %%i.tmp %%i &amp; copy %%i".tmp" %%i &amp; del %%i".tmp"</pre>
<p>运行这个bat文件，会自动寻找本文件所在目录下所有子文件夹中的.js文件，进行压缩并覆盖源文件。 <br /><br />compresjs.bat使用的方法只是对文件进行压缩，如果有10个源文件，还会压缩成10个文件，并没有进行打包。 我们可以对他进行更进一步的处理，把这10个源文件打包压缩成1个文件，就像ext-all.js那样。 <br /><br />建立一个packagejs.bat文件，内容如下 <br /></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
<li><span class="keyword"><strong><span style="color: #7f0055;">for</span></strong></span><span>&nbsp;/r&nbsp;..\WebContent\js&nbsp;%%i&nbsp;in&nbsp;(*.js)&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">do</span></strong></span><span>&nbsp;type&nbsp;%%i&gt;&gt;uiiang-debug.js &nbsp;&nbsp;</span> </li>
<li><span>java&nbsp;-jar&nbsp;yuicompressor-</span><span class="number"><span style="color: #c00000;">2.4</span></span><span>.</span><span class="number"><span style="color: #c00000;">2</span></span><span>.jar&nbsp;--type&nbsp;js&nbsp;--charset&nbsp;utf-</span><span class="number"><span style="color: #c00000;">8</span></span><span>&nbsp;-o&nbsp;uiiang.js&nbsp;uiiang-debug.js&nbsp;&nbsp;</span> </li>
</ol></div>
<p>&nbsp;</p>
<pre name="code" class="java">for /r ..\WebContent\js %%i in (*.js) do type %%i&gt;&gt;uiiang-debug.js
java -jar yuicompressor-2.4.2.jar --type js --charset utf-8 -o uiiang.js uiiang-debug.js</pre>
<p>在packagejs.bat中，先将..\WebContent\js下的所有JS文件内容合并到uiiang-debug.js文件中，然后再
使用yuicompressor对uiiang-debug.jsp压缩成uiiang.js，这样就可以得到一个经过压缩并包含全部.js文件的代码
了。 <br /><br />packagejs.bat中使用的方法有一个缺点，那就是它在合并js文件时的顺序，是按照文件夹及子文件夹还有js文件的排
列顺序进行合并的，也就是按文件名顺序排列。但是在我们实际项目中，一般情况下JS文件的引用是要指定一个特定的加载顺序，不然的话就会报错。所以还要对
packagejs.bat进行再进一步的改造。 <br /><br />首先要建立一个列表文件dir.txt <br /></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
<li><span>..\WebContent\js\widgets\WidgetInit.js &nbsp;&nbsp;</span> </li>
<li><span>..\WebContent\js\utils\Cache.js &nbsp;&nbsp;</span> </li>
<li><span>..\WebContent\js\common\GlobalConstant.js &nbsp;&nbsp;</span> </li>
<li><span>..\WebContent\js\common\GlobalVariable.js &nbsp;&nbsp;</span> </li>
<li><span>..\WebContent\js\common\GlobalFunc.js &nbsp;&nbsp;</span> </li>
<li><span>..\WebContent\js\core\Initialize.js&nbsp;&nbsp;</span> </li>
</ol></div>
<p>&nbsp;</p>
<pre name="code" class="java">..\WebContent\js\widgets\WidgetInit.js
..\WebContent\js\utils\Cache.js
..\WebContent\js\common\GlobalConstant.js
..\WebContent\js\common\GlobalVariable.js
..\WebContent\js\common\GlobalFunc.js
..\WebContent\js\core\Initialize.js</pre>
<p>在这个文件中，按照JSP中指定的JS文件加载顺序写好文件的路径 <br />再修改packagejs.bat</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
<li><span class="keyword"><strong><span style="color: #7f0055;">for</span></strong></span><span>&nbsp;/f&nbsp;%%i&nbsp;in&nbsp;(dir.txt)&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">do</span></strong></span><span>&nbsp;type&nbsp;%%i&nbsp;&gt;&gt;&nbsp;uiiang-debug.js &nbsp;&nbsp;</span> </li>
<li><span>java&nbsp;-jar&nbsp;yuicompressor-</span><span class="number"><span style="color: #c00000;">2.4</span></span><span>.</span><span class="number"><span style="color: #c00000;">2</span></span><span>.jar&nbsp;--type&nbsp;js&nbsp;--charset&nbsp;utf-</span><span class="number"><span style="color: #c00000;">8</span></span><span>&nbsp;-o&nbsp;uiiang.js&nbsp;uiiang-debug.js&nbsp;&nbsp;</span> </li>
</ol></div>
<p>&nbsp;</p>
<pre name="code" class="java">for /f %%i in (dir.txt) do type %%i &gt;&gt; uiiang-debug.js
java -jar yuicompressor-2.4.2.jar --type js --charset utf-8 -o uiiang.js uiiang-debug.js</pre>
<p>执行这个packagejs.bat文件后，批处理命令会自动读取dir.txt并按照你指定的顺序逐行取出.js文件的路径进行，把文件内容合并到uiiang-debug.js中。 <br /><br />另外要注意的一点就是在dir.txt中，一定要把所需要打包压缩的的JS文件路径全部列出来，因为新的pakagejs.bat不会再自动寻找全部的JS文件了，如果有遗漏就只好报错 <br /><br />至此，批处理压缩打包js文件的工作就完成了，还可以将代码中的.JS换成.css对CSS文件进行打包，当然yuicompressor的--type也要改成css。 </p><img src="http://www.cnblogs.com/h-hello/aggbug/1562589.html?type=2" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/h-hello/articles/1562589.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/h-hello/articles/1562589.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59098/" target="_blank">美博客列20家值得关注纽约创业企业</a><span style="color:gray">(2010-03-18 23:49)</span><br/>· <a href="http://news.cnblogs.com/n/59097/" target="_blank">王建宙：希望在国内销售苹果iPad和iPhone</a><span style="color:gray">(2010-03-18 22:53)</span><br/>· <a href="http://news.cnblogs.com/n/59095/" target="_blank">传网易微博20号正式上线 门户网站角力微博</a><span style="color:gray">(2010-03-18 22:48)</span><br/>· <a href="http://news.cnblogs.com/n/59094/" target="_blank">蓝港CEO王峰谈3年开发感悟：有点唠叨像唐僧</a><span style="color:gray">(2010-03-18 22:07)</span><br/>· <a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><span style="color:gray">(2010-03-18 22:03)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59068/" target="_blank">VS2010全球首发，京沪穗三地即将盛大发布</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>监控 SQL Server (2005/2008) 的运行状况</title><link>http://www.cnblogs.com/h-hello/articles/1558159.html</link><dc:creator>h-hello</dc:creator><author>h-hello</author><pubDate>Tue, 01 Sep 2009 08:23:00 GMT</pubDate><guid>http://www.cnblogs.com/h-hello/articles/1558159.html</guid><description><![CDATA[<p>阅读: 13 评论: 0 作者: <a href="http://www.cnblogs.com/h-hello/" target="_blank">h-hello</a> 发表于 2009-09-01 16:23 <a href="http://www.cnblogs.com/h-hello/articles/1558159.html" target="_blank">原文链接</a></p><p>原文地址：<br />
<a href="http://technet.microsoft.com/zh-cn/library/bb838723.aspx" target="_blank">http://technet.microsoft.com/zh-cn/library/bb838723.aspx</a>
</p>
<p>Microsoft SQL Server 2005 提供了一些工具来监控数据库。方法之一是动态管理视图。动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的运行状况、诊断问题和优化性能。</p>
<p>常规服务器动态管理对象包括：</p>
<ul>
<li>
<p>dm_db_*：数据库和数据库对象</p>
</li>
<li>
<p>dm_exec_*：执行用户代码和关联的连接</p>
</li>
<li>
<p>dm_os_*：内存、锁定和时间安排</p>
</li>
<li>
<p>dm_tran_*：事务和隔离</p>
</li>
<li>
<p>dm_io_*：网络和磁盘的输入/输出</p>
</li>
</ul>
<p>此部分介绍为监控 SQL Server 运行状况而针对这些动态管理视图和函数运行的一些常用查询。</p>
<p><br />
摘录部分精彩SQL如下：<br />
<span id="ctl00_MTContentSelector1_mainContentContainer_ctl03"><br />
 </span>
</p>
<p>下面的查询显示 CPU 平均占用率最高的前 50 个 SQL 语句。</p>
<p>       <span id="ctl00_MTContentSelector1_mainContentContainer_ctl04">
<div id="ctl00_MTContentSelector1_mainContentContainer_ctl04_" class="libCScode">     </div>
</span>
</p>
<div class="cnblogs_code"><!--   {cps..0}--><span style="color: #0000ff;">
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div>
</div>
<ol class="dp-rb" start="1">
<li class="alt"><span><span>SELECT&nbsp;TOP&nbsp;50&nbsp;&nbsp;</span></span></li>
<li><span>total_worker_time/execution_count&nbsp;AS&nbsp;[Avg&nbsp;CPU&nbsp;<span class="builtin">Time</span><span>],&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>(SELECT&nbsp;SUBSTRING(text,statement_start_offset/2,(CASE&nbsp;WHEN&nbsp;statement_end_offset&nbsp;=&nbsp;-1&nbsp;<span class="keyword">then</span><span>&nbsp;LEN(CONVERT(nvarchar(max),&nbsp;text))&nbsp;*&nbsp;2&nbsp;ELSE&nbsp;statement_end_offset&nbsp;</span><span class="keyword">end</span><span>&nbsp;-statement_start_offset)/2)&nbsp;FROM&nbsp;sys.dm_exec_sql_text(sql_handle))&nbsp;AS&nbsp;query_text,&nbsp;*&nbsp;&nbsp;</span></span></li>
<li><span>FROM&nbsp;sys.dm_exec_query_stats&nbsp;&nbsp;&nbsp;</span></li>
<li class="alt"><span>ORDER&nbsp;BY&nbsp;[Avg&nbsp;CPU&nbsp;<span class="builtin">Time</span><span>]&nbsp;DESC&nbsp;&nbsp;</span></span></li>
</ol></div>
<textarea style="display: none;" cols="50" rows="15" name="code" class="ruby">SELECT
TOP 50
total_worker_time/execution_count AS [Avg CPU Time],
(SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN
statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2
ELSE statement_end_offset end -statement_start_offset)/2) FROM
sys.dm_exec_sql_text(sql_handle)) AS query_text, *
FROM sys.dm_exec_query_stats ORDER BY [Avg CPU Time] DESC</textarea>
 </span>

</div>
<p><br />
下面的查询显示一些可能占用大量 CPU 使用率的运算符（例如 &lsquo;%Hash Match%&rsquo;、&lsquo;%Sort%&rsquo;）以找出可疑对象。</p>
<div class="cnblogs_code"><!--   {cps..1}--><span style="color: #0000ff;">
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div>
</div>
<ol class="dp-py" start="1">
<li class="alt"><span><span>select&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;</span></span></li>
<li><span><span class="keyword">from</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys.dm_exec_cached_plans&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cross&nbsp;&nbsp;apply&nbsp;sys.dm_exec_query_plan(plan_handle)&nbsp;&nbsp;</span></li>
<li class="alt"><span>where&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cast&nbsp;(query_plan&nbsp;&nbsp;as&nbsp;&nbsp;&nbsp;nvarchar&nbsp;(&nbsp;max&nbsp;))&nbsp;&nbsp;like&nbsp;&nbsp;&nbsp;<span class="string">'&nbsp;%Sort%&nbsp;'</span><span>&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">or</span><span>&nbsp;&nbsp;&nbsp;cast&nbsp;(query_plan&nbsp;&nbsp;as&nbsp;&nbsp;&nbsp;nvarchar&nbsp;(&nbsp;max&nbsp;))&nbsp;&nbsp;like&nbsp;&nbsp;&nbsp;</span><span class="string">'&nbsp;%Hash&nbsp;Match%&nbsp;'</span><span>&nbsp;&nbsp;</span></span></li>
</ol></div>
<textarea style="display: none;" cols="50" rows="15" name="code" class="python">select   *
from  
      sys.dm_exec_cached_plans
       cross  apply sys.dm_exec_query_plan(plan_handle)
where  
       cast (query_plan  as   nvarchar ( max ))  like   ' %Sort% '
       or   cast (query_plan  as   nvarchar ( max ))  like   ' %Hash Match% '</textarea>
 </span>

</div>
<p><br />
运行下面的 DMV 查询以查看 CPU、计划程序内存和缓冲池信息。</p>
<div class="cnblogs_code"><!--   {cps..2}--><span style="color: #0000ff;">
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div>
</div>
<ol class="dp-py" start="1">
<li class="alt"><span><span>select&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
<li><span>cpu_count,&nbsp;&nbsp;</span></li>
<li class="alt"><span>hyperthread_ratio,&nbsp;&nbsp;</span></li>
<li><span>scheduler_count,&nbsp;&nbsp;</span></li>
<li class="alt"><span>physical_memory_in_bytes&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;<span class="number">1024</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;</span><span class="number">1024</span><span>&nbsp;&nbsp;&nbsp;as&nbsp;&nbsp;physical_memory_mb,&nbsp;&nbsp;</span></span></li>
<li><span>virtual_memory_in_bytes&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;<span class="number">1024</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;</span><span class="number">1024</span><span>&nbsp;&nbsp;&nbsp;as&nbsp;&nbsp;virtual_memory_mb,&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>bpool_committed&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;<span class="number">8</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;</span><span class="number">1024</span><span>&nbsp;&nbsp;&nbsp;as&nbsp;&nbsp;bpool_committed_mb,&nbsp;&nbsp;</span></span></li>
<li><span>bpool_commit_target&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;<span class="number">8</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;</span><span class="number">1024</span><span>&nbsp;&nbsp;&nbsp;as&nbsp;&nbsp;bpool_target_mb,&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>bpool_visible&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;<span class="number">8</span><span>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;</span><span class="number">1024</span><span>&nbsp;&nbsp;&nbsp;as&nbsp;&nbsp;bpool_visible_mb&nbsp;&nbsp;</span></span></li>
<li><span><span class="keyword">from</span><span>&nbsp;&nbsp;sys.dm_os_sys_info&nbsp;&nbsp;</span></span></li>
</ol></div>
<textarea style="display: none;" cols="50" rows="15" name="code" class="python">select  
cpu_count,
hyperthread_ratio,
scheduler_count,
physical_memory_in_bytes  /   1024   /   1024   as  physical_memory_mb,
virtual_memory_in_bytes  /   1024   /   1024   as  virtual_memory_mb,
bpool_committed  *   8   /   1024   as  bpool_committed_mb,
bpool_commit_target  *   8   /   1024   as  bpool_target_mb,
bpool_visible  *   8   /   1024   as  bpool_visible_mb
from  sys.dm_os_sys_info</textarea>
 </span>

</div>
<p><br />
下面的示例查询显示已重新编译的前 25 个存储过程。<strong>plan_generation_num</strong>
 指示该查询已重新编译的次数。</p>
<div class="cnblogs_code"><!--   {cps..3}--><span style="color: #0000ff;">
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div>
</div>
<ol class="dp-py" start="1">
<li class="alt"><span><span>select&nbsp;&nbsp;&nbsp;top&nbsp;&nbsp;&nbsp;</span><span class="number">25</span><span>&nbsp;&nbsp;</span></span></li>
<li><span>sql_text.&nbsp;text&nbsp;,&nbsp;&nbsp;</span></li>
<li class="alt"><span>sql_handle,&nbsp;&nbsp;</span></li>
<li><span>plan_generation_num,&nbsp;&nbsp;</span></li>
<li class="alt"><span>execution_count,&nbsp;&nbsp;</span></li>
<li><span>dbid,&nbsp;&nbsp;</span></li>
<li class="alt"><span>objectid&nbsp;&nbsp;&nbsp;</span></li>
<li><span><span class="keyword">from</span><span>&nbsp;&nbsp;sys.dm_exec_query_stats&nbsp;a&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>cross&nbsp;&nbsp;apply&nbsp;sys.dm_exec_sql_text(sql_handle)&nbsp;&nbsp;as&nbsp;&nbsp;sql_text&nbsp;&nbsp;</span></li>
<li><span>where&nbsp;&nbsp;plan_generation_num&nbsp;&nbsp;&gt;&nbsp;&nbsp;&nbsp;<span class="number">1</span><span>&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>order&nbsp;&nbsp;&nbsp;by&nbsp;&nbsp;plan_generation_num&nbsp;&nbsp;desc&nbsp;&nbsp;</span></li>
</ol></div>
<textarea style="display: none;" cols="50" rows="15" name="code" class="python">select   top   25
sql_text. text ,
sql_handle,
plan_generation_num,
execution_count,
dbid,
objectid 
from  sys.dm_exec_query_stats a
cross  apply sys.dm_exec_sql_text(sql_handle)  as  sql_text
where  plan_generation_num  &gt;   1
order   by  plan_generation_num  desc</textarea>
 </span>

</div>
<p><br />
下面的 DMV 查询可用于查找哪些批处理/请求生成的 I/O 最多。如下所示的 DMV 查询可用于查找可生成最多 I/O 的前五个请求。调整这些查询将提高系统性能。</p>
<!--   {cps..4}-->
<p><span style="color: #0000ff;">
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="http://blog.csdn.net/downmoon/archive/2009/08/12/4440239.aspx#" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div>
</div>
<ol class="dp-py" start="1">
<li class="alt"><span><span>select&nbsp;&nbsp;&nbsp;top&nbsp;&nbsp;&nbsp;</span><span class="number">5</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;(total_logical_reads&nbsp;/&nbsp;execution_count)&nbsp;&nbsp;as&nbsp;&nbsp;avg_logical_reads,&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;(total_logical_writes&nbsp;/&nbsp;execution_count)&nbsp;&nbsp;as&nbsp;&nbsp;avg_logical_writes,&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;(total_physical_reads&nbsp;/&nbsp;execution_count)&nbsp;&nbsp;as&nbsp;&nbsp;avg_phys_reads,&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Execution_count,&nbsp;&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;statement_start_offset&nbsp;&nbsp;as&nbsp;&nbsp;stmt_start_offset,&nbsp;&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;sql_handle,&nbsp;&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;plan_handle&nbsp;&nbsp;</span></li>
<li class="alt"><span><span class="keyword">from</span><span>&nbsp;&nbsp;sys.dm_exec_query_stats&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
<li><span>order&nbsp;&nbsp;&nbsp;by&nbsp;&nbsp;&nbsp;(total_logical_reads&nbsp;&nbsp;+&nbsp;&nbsp;total_logical_writes)&nbsp;&nbsp;Desc&nbsp; <br /></span></li>
</ol></div>
</span></p><img src="http://www.cnblogs.com/h-hello/aggbug/1558159.html?type=2" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/h-hello/articles/1558159.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/h-hello/articles/1558159.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59098/" target="_blank">美博客列20家值得关注纽约创业企业</a><span style="color:gray">(2010-03-18 23:49)</span><br/>· <a href="http://news.cnblogs.com/n/59097/" target="_blank">王建宙：希望在国内销售苹果iPad和iPhone</a><span style="color:gray">(2010-03-18 22:53)</span><br/>· <a href="http://news.cnblogs.com/n/59095/" target="_blank">传网易微博20号正式上线 门户网站角力微博</a><span style="color:gray">(2010-03-18 22:48)</span><br/>· <a href="http://news.cnblogs.com/n/59094/" target="_blank">蓝港CEO王峰谈3年开发感悟：有点唠叨像唐僧</a><span style="color:gray">(2010-03-18 22:07)</span><br/>· <a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</a><span style="color:gray">(2010-03-18 22:03)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59068/" target="_blank">VS2010全球首发，京沪穗三地即将盛大发布</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>