﻿<?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>IT博客-KiMoGiGi 技术文集</title><link>http://www.cnitblog.com/seeyeah/</link><description>不在乎选择什么，而在乎坚持多久……</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 06:00:13 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 06:00:13 GMT</pubDate><ttl>60</ttl><item><title>格式化输出xml</title><link>http://www.cnitblog.com/seeyeah/archive/2011/03/16/73108.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Wed, 16 Mar 2011 03:49:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2011/03/16/73108.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/73108.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2011/03/16/73108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/73108.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/73108.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;FormatXmlString<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;newline&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;tab&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;FormatXmlString()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">(Environment.NewLine,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\t</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;FormatXmlString(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;newline,&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;tab)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.newline&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;newline;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.tab&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tab;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;FormatString(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;xmlString,&nbsp;Encoding&nbsp;encoding)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlDocument&nbsp;document&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;XmlDocument();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.LoadXml(xmlString);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;formatString&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;StringBuilder();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlWriterSettings&nbsp;setting&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;XmlWriterSettings();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setting.CheckCharacters&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setting.Encoding&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;encoding;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setting.Indent&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setting.IndentChars&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.tab.ToString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setting.NewLineChars&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.newline;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;(XmlWriter&nbsp;writer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;XmlWriter.Create(formatString,&nbsp;setting))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.WriteTo(writer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;formatString.ToString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;MyClass<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Test()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;rawXml&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">&lt;?xml&nbsp;version=""1.0""&nbsp;encoding=""UTF-8""&nbsp;?&gt;&lt;root&gt;&lt;head&gt;&lt;serviceName&gt;aaaa&lt;/serviceName&gt;&lt;v&gt;1.0&lt;/v&gt;&lt;/head&gt;&lt;body&gt;&lt;clientId&gt;10&lt;/clientId&gt;&lt;clientIdExt&gt;1701&lt;/clientIdExt&gt;<br>&lt;clientIp&gt;192.168.1.1&lt;/clientIp&gt;&lt;timeToken&gt;20110315103732140&lt;/timeToken&gt;&lt;serviceId&gt;000&lt;/serviceId&gt;&lt;loginType&gt;1&lt;/loginType&gt;<br>&lt;loginName&gt;testtest&lt;/loginName&gt;&lt;loginPassword&gt;111111&lt;/loginPassword&gt;&lt;/body&gt;&lt;/root&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">FormatXmlString&nbsp;fxs&nbsp;=&nbsp;new&nbsp;FormatXmlString();</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormatXmlString&nbsp;fxs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;FormatXmlString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;br&nbsp;/&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;format&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fxs.FormatString(rawXml,&nbsp;Encoding.UTF8);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(format);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/73108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2011-03-16 11:49 <a href="http://www.cnitblog.com/seeyeah/archive/2011/03/16/73108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)</title><link>http://www.cnitblog.com/seeyeah/archive/2010/11/04/70891.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 04 Nov 2010 03:35:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2010/11/04/70891.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/70891.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2010/11/04/70891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/70891.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/70891.html</trackback:ping><description><![CDATA[来自：http://www.cnblogs.com/craig/archive/2008/11/18/1335809.html
<br><br>
<p><strong> 一、没有使用代理服务器的情况： </strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 您的 IP<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 没数值或不显示<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 没数值或不显示</p>
<p><strong> 二、使用透明代理服务器的情况：Transparent Proxies </strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 最后一个代理服务器 IP <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 您的真实 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 这类代理服务器还是将您的信息转发给您的访问对象，无法达到隐藏真实身份的目的。</p>
<p><strong> 三、使用普通匿名代理服务器的情况：Anonymous Proxies </strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 最后一个代理服务器 IP <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 代理服务器 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 隐藏了您的真实IP，但是向访问对象透露了您是使用代理服务器访问他们的。</p>
<p><strong> 四、使用欺骗性代理服务器的情况：Distorting Proxies </strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 代理服务器 IP <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 随机的 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 告诉了访问对象您使用了代理服务器，但编造了一个虚假的随机IP代替您的真实IP欺骗它。</p>
<p><strong> 五、使用高匿名代理服务器的情况：High Anonymity Proxies (Elite proxies) </strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 代理服务器 IP<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 没数值或不显示<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 没数值或不显示 ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 完全用代理服务器的信息替代了您的所有信息，就象您就是完全使用那台代理服务器直接访问对象。</p>
<br><img src ="http://www.cnitblog.com/seeyeah/aggbug/70891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2010-11-04 11:35 <a href="http://www.cnitblog.com/seeyeah/archive/2010/11/04/70891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】开发总结3 -- shell 简单指令</title><link>http://www.cnitblog.com/seeyeah/archive/2010/08/25/68396.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Wed, 25 Aug 2010 09:03:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2010/08/25/68396.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/68396.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2010/08/25/68396.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/68396.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/68396.html</trackback:ping><description><![CDATA[1、--help<br><br>当要获取相关指令的帮助时，在指令后打--help，即会显示帮助信息。<br>如<br>grep --help<br><br>2、ls 和 ll<br><br>* 两个指令是显示当前文件夹的文件。<br>ls只是显示文件名，ll会以列表形式显示文件名，并且会有日期、大小等。<br><br>* ll -h<br>这样文件大小就会以我们平常可读的形式显示，如10k，100M等。<br><br>3、pwd<br>显示当前目录路径<br><br>4、vi<br><br>* 直接打开文本 <br>vi +n path<br>打开文件，并将光标置于第n行首<br><br>* vi的快捷键<br>http://www.lpfrx.com/wp-content/uploads/2008/09/vi.jpg<br>常用快捷键<br>ctrl + u 向上翻半屏<br>ctrl + d 向下翻半屏<br>ctrl + b 向上翻一屏<br>ctrl + f 向下翻一屏<br><br>/pattern 从光标开始向文件尾开始搜索pattern<br>?pattern 从光标开始向文件首开始搜索pattern<br>n 同一方向重复上一次搜索指令<br>N 反方向重复上一次搜索指令<br><br>:q! 不保存文件并推出<br><br>5、grep<br><br>* 显示文本内容的匹配行<br>如：grep pattern filename<br>pattern可以是正则<br><br>* -r 可以递归文件夹搜索<br>grep 139 filename* -r<br><br>* -A -B -n 可以显示匹配行的前后几行<br>grep 139 filename -A 2 #显示匹配139行的后2行<br>grep 139 filename -B 1 #显示匹配139行的前1行<br>grep 139 filename -3&nbsp;&nbsp; #显示匹配139行的前3行和后3行<br><br>* -h 打印结果时，不显示文件名，使结果看起来清爽一点<br><br>* -m 打印匹配的前几项<br>grep 139 filename -m 10 #显示匹配前10行<br><br>* -n 打印结果时，前面带行号<br><br>* -v 打印不匹配的行<br><br>* --color 把匹配的文本标红色<br><br>6、cat<br>打印文本<br><br>7、sort<br>对结果排序<br><br>-k是指排序的列，1为第一列；-t是指定分隔符，默认为空格；-n列以数字形式排序；-r为倒序。<br>这些选项大多都可以合并<br><br>如<br>sort -k1nr<br>即结果第一列以数字形式倒序形式排列。<br><br>8、uniq<br>唯一统计，-c是显示统计结果<br><br>9、awk<br><br>结构如下<br>awk 'BEGIN{command} condition {command_line} END {command}' file<br><br>-F 为指定分隔符，默认为空格<br><br>常用内置函数如下<br>gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string <br>index(search,string) 返回string中search串的位置 <br>length(string) 求串string中的字符个数 <br>match(string,reg) 返回常规表达式reg匹配的string中的位置 <br>printf(format,variable) 格式化输出，按format提供的格式输出变量variable。 <br>split(string,store,delim) 根据分界符delim,分解string为store的数组元素 <br>strftime(format,timestamp) 返回一个基于format的日期或者时间串，timestmp是systime()函数返回的时间 <br>sub(reg,string,target) 第一次当常规表达式reg匹配，替换target串中的字符串 <br>substr(string,position,len) 返回一个以position开始len个字符的子串 <br>totower(string) 返回string中对应的小写字符 <br>toupper(string) 返回string中对应的大写字符 &nbsp;<br><br><br>常用内置标量如下<br>FNR 当前文件中的记录号<br>FS&nbsp; 输入域分隔符，默认为一个空格<br>RS&nbsp; 输入记录分隔符<br>NF&nbsp; 当前记录里域个数<br>NR&nbsp; 到目前为止记录数<br><br>例子：<br>搜索iis生产线日志，打印出执行描述超过5000ms的行：<br>awk 'NF==17 &amp;&amp; $NF&gt;5000 {printf("%-8s: %s %s %-50s %-17s %-4s %s %s %-8s %+7s&nbsp; \n",FNR,$1,$2,$6,$10,$14,$12,$15,$16,$NF/1000);}' ex100823.log<br>解释：<br>NF == 17 ：保证日志行有17列，可以屏蔽一些其他行<br>$NF &gt; 5000 ：$NF就是第17列，即最后列（一般我们的iis日志都是最后一列为执行事件）<br>printf ：打印行，并格式化。按生产线的日志，打印的列分别如下所示<br>"行号","日期","时间","链接","客户ip","win状态","http状态","发送字节数","接受字节数","时间（单位秒）"<br><br>10、top<br>监控当前进程执行状况<br><br>11、head和tail<br>分别为查看文本的头几行和尾几行<br>tail -f filename<br>可以监控文件的写入<br><br>12、ifconfig<br>当前机器的网卡状态<br><br><br>  <img src ="http://www.cnitblog.com/seeyeah/aggbug/68396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2010-08-25 17:03 <a href="http://www.cnitblog.com/seeyeah/archive/2010/08/25/68396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】开发总结2 -- cmd命令</title><link>http://www.cnitblog.com/seeyeah/archive/2010/06/29/67095.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Tue, 29 Jun 2010 14:42:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2010/06/29/67095.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/67095.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2010/06/29/67095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/67095.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/67095.html</trackback:ping><description><![CDATA[由于用.net开发，少不了跟window服务器做交互。window系统的交互的确方便，但如果要做一些快速操作还是cmd比较快，而且不可能每个人都远程连接到服务器去操作、查看。<br><br>虽然window有powershell弥补cmd的不足，但Powershell的执行效率始终是个问题，而且cmd已经够我们日常的操作。<br><br>下面列出我常用的cmd操作指令。<br><br>
<h1>1、help</h1>
help指令会列出cmd一系列原生的指令，以及其简单的描述。<br>如果要对某个cmd指令做详细的帮助，可以输入<br>xx /?&nbsp;&nbsp;&nbsp; (xx为指令名)<br><br>
<h1>2、call</h1>
执行一个bat程序，如果有一些常用的一系列cmd指令，我们可以写成一个bat文件，然后用call来执行。<br><br>
<h1>3、findstr</h1>
在文件中搜索字符串，类似于shell的grep，但弱很多。<br>-- 查询准确字符串<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">findstr&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">n&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">l&nbsp;xxx&nbsp;doc.log&nbsp;</span></div>
<br>-- 查询模糊字符串<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">findstr&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">n&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">r&nbsp;xxx&nbsp;doc.log&nbsp;</span></div>
<br><br>其中&#8220;/n&#8221;是表示显示匹配行的行号，而查询模糊字符串的通配符并不是正则，是微软规定的通配符，如下所示：<br><br>一般表达式的快速参考:<br><br>&nbsp; .&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通配符: 任何字符<br>&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重复: 以前字符或类别出现零或零以上次数<br>&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行位置: 行的开始<br>&nbsp; $&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行位置: 行的终点<br>&nbsp; [class]&nbsp; 字符类别: 任何在字符集中的字符<br>&nbsp; [^class] 补字符类别: 任何不在字符集中的字符<br>&nbsp; [x-y]&nbsp;&nbsp;&nbsp; 范围: 在指定范围内的任何字符<br>&nbsp; \x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Escape: 元字符 x 的文字用法<br>&nbsp; \&lt;xyz&nbsp;&nbsp;&nbsp; 字位置: 字的开始<br>&nbsp; xyz\&gt;&nbsp;&nbsp;&nbsp; 字位置: 字的结束<br><br>还需要注意的是，findstr是以操作系统的默认编码打开文本文件的，因此如果文本是unicode编码的话，便搜索不了，会乱码显示。<br><br>
<h1>4、type</h1>
显示文本的内容，跟findstr一样，有编码的缺点。<br><br><br>
<h1>5、tasklist</h1>
查询目前执行的进程状况，直接输入tasklist就直接以table形式列出所有进程的状况。<br><br>tasklist提供参数可以过滤信息，比如我们只想看w3wp进程的信息。<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">tasklist&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">fi&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Imagename&nbsp;eq&nbsp;w3wp.exe</span><span style="color: #000000;">"</span></div>
<br>我们想看使用内存大于500000k的进程<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">tasklist&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">fi&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">memusage&nbsp;gt&nbsp;50000</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span></div>
<br>相叠加条件的话，可以多个/fi即可。<br><br>tasklist 还提供一个参数 /M ，让我们可以查看进程加载dll的情况。<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">tasklist&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">fi&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Imagename&nbsp;eq&nbsp;w3wp.exe</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">m</span></div>
这样就可以清楚看到各个w3wp.exe所加载dll的情况，我们就可以分出哪个w3wp进程在管理哪个web程序。（本人通常看到服务器运行n个w3wp.exe，但却无法识别哪个w3wp对应是哪个web程序）<br>如果我们asp.net的dll有命名规则，比如dll都以公司名为开头，如CompanyName.Web.dll<br>那么可以在/M加上通配符过滤结果。<br>
<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">tasklist&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">fi&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Imagename&nbsp;eq&nbsp;w3wp.exe</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">m&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CompanyName*</span><span style="color: #000000;">"</span></div>
<br>这样就更清楚列出，这个w3wp具体加载我们dll的情况。<br><br><hr style="width: 100%; height: 2px;"><br>也许这些指令还不够用，微软提供了命令行的扩展包可供下载，<a style="text-decoration: underline;" target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;displaylang=en"></a><a style="text-decoration: underline;" target="_blank"  href="http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;displaylang=en">Windows Server 2003 Resource Kit Tools</a>
。直接安装即可使用，但安装后help并不会把这些指令列出来。<br><br>
<h1>1、qgrep</h1>
跟findstr类似，用于查询文本中的字符串。<br><br>
<h1>2、tail</h1>
跟shell的tail类似，但tail -f功能有时会失灵。。。<br><br><hr style="width: 100%; height: 2px;"><br>关于iis管理操作方面，也有指令可以做简单的控制。<br><br>
<h1>1、iisreset</h1>
管理iis的服务，可以查看、停止、重启、开启iis服务。<br><br>iisreset /stop&nbsp;&nbsp; 停止iis<br>iisreset /start&nbsp; 启动iis<br>iisreset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重启iis<br>iisreset /status 查看状态<br><br>
<h1>2、iisapp</h1>
iisapp用于管理应用程序池，我们更新配置文件需要清除缓存的时候，需要回收进程池。<br><br>我们可以用iisapp列出当前启用的进程池。<br>然后用<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">iisapp&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">a&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">appname</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">r</span></div>
回收进程池<br><br><hr style="width: 100%; height: 2px;"><br>一般cmd我们只可以操作本机，操作远程机器的我们需要借助微软的<a style="text-decoration: underline;" target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx">PsTools</a>。<br><br>pstools本身也有很多有用的指令，但远程的话，我们就只用psexec。<br><br>操作很简单，只需要客户端有pstools即可，服务器不用做额外服务配置，输入如下<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">psexec&nbsp;\\[ip或机器名]&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">u&nbsp;[用户名]&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">p&nbsp;[密码]&nbsp;cmd.exe&nbsp;</span></div>
<br><br>这样就可以操作远程机器的cmd了。<br><br><br>   <img src ="http://www.cnitblog.com/seeyeah/aggbug/67095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2010-06-29 22:42 <a href="http://www.cnitblog.com/seeyeah/archive/2010/06/29/67095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】开发总结1 -- 日志</title><link>http://www.cnitblog.com/seeyeah/archive/2010/06/27/67052.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 27 Jun 2010 03:34:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2010/06/27/67052.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/67052.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2010/06/27/67052.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/67052.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/67052.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=" utf-8="">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 11">
<meta name="Originator" content="Microsoft Word 11">
<link rel="File-List" href="file:///C:%5CUsers%5Ctoshiba%5CAppData%5CLocal%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><xml>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;
mso-font-charset:2;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:新宋体;
panose-1:2 1 6 9 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"\@新宋体";
panose-1:2 1 6 9 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:604776731;
mso-list-type:hybrid;
mso-list-template-ids:1522985040 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:21.0pt;
mso-level-number-position:left;
margin-left:21.0pt;
text-indent:-21.0pt;
font-family:Wingdings;}
@list l1
{mso-list-id:891304707;
mso-list-type:hybrid;
mso-list-template-ids:843605946 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l1:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:21.0pt;
mso-level-number-position:left;
margin-left:21.0pt;
text-indent:-21.0pt;
font-family:Wingdings;}
@list l2
{mso-list-id:2065907281;
mso-list-type:hybrid;
mso-list-template-ids:-555692502 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l2:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:21.0pt;
mso-level-number-position:left;
margin-left:21.0pt;
text-indent:-21.0pt;
font-family:Wingdings;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<p>&nbsp;</p>
<p><strong>一、前言</strong></p>
<p>&nbsp;</p>
<p>在日常个人开发中，有类似vs这样强大的IDE就可以方便地随意跟踪和debug。然而很多时候，错误和异常是发生在生产线上，而且并不是必然重现。对付这种类型的bug，在生产线上又没有（且不能有IDE）的情况下，跟踪和修复是极为困难的事情。因此，日志变得极其重要。</p>
<p>&nbsp;</p>
<p>日志好像很简单，就是程序运行到哪里，记录一些文字就ok了，它的实质也的确是如此，但如果不注意细节，到了实际的开发遇到真正问题要找日志的时候，你会遇到很多麻烦。</p>
<p>&nbsp;</p>
<p><strong>二、日志记录设计</strong></p>
<p>&nbsp;</p>
<p>随着你开发的进度，如果不及时清理旧有无用的日志（有些日志甚至是在开发时临时加上的），会令到你的日志文件变得臃肿、冗余，而且大部分都是无用的记录，这些都会导致定位问题困难。因此在开发时，除了设计程序结构，也要考虑到设计记录日志的地方。日志的设计除了记录日志的地方，还要考虑记录日志的级别，比如log4net就有Info、Debug、Warn、Error、Fatal，根据不同的情况输出不同级别的日志。下面就讲述在程序中使用日志开发应考虑的几点：</p>
<p>&nbsp;</p>
<p><strong>1</strong><strong>、日志配置文件</strong></p>
<p>一般的日志框架都会有跟随一个配置文件，它可以控制日志的输出内容格式、输出方式（文本）、输出的日志级别等等。通常一个程序对应一个配置文件是正确的。但在web的服务器上，通常我们会使用多台服务器做负载均衡，同样的一个web程序就会放置在不同的服务器上面，那样他们在正常情况读的都是同样的日志配置文件。有的设计为了方便，就把这些日志的配置文件放置到一个地方（如数据库），然后所有web程序都读取这个配置文件。这样做法有利有弊，利就是当修改日志配置文件时，修改一处即可；弊就是无法对个别web程序做差异化配置。</p>
<p>&nbsp;</p>
<p>因此我们为了兼顾差异化配置， 可以用如下顺序读取配置文件。</p>
<p>Web程序 -&gt; 先读取web本地的配置文件 -&gt; （如本地文件不存在）再读取公共配置的日志文件。</p>
<p>其实很简单，中间多一步处理就可以兼顾日志文件的差异化配置。</p>
<p>&nbsp;</p>
<p><strong>2</strong><strong>、记录日志级别</strong></p>
<p>上面也有提到log4net本身就提供Info、Debug、Warn、Error、Fatal 5种的日志级别。但我个人认为，用3种即可：Info、Debug、Error。</p>
<p>&nbsp;</p>
<p>Info：记录程序运行是否已到达某处；关键函数的执行始末；调用第三方函数执行的始末；关键函数的执行时间。</p>
<p>Debug：记录每个函数（方法）的输入和输出。</p>
<p>Error：程序异常，除了记录程序的Exception内容之外，还要记录导出此次异常的输入参数。</p>
<p>&nbsp;</p>
<p>关于Error，log4net会把整个异常的StackTrace打印出来，因为StackTrace内容太多，我们可以考虑Error也分开2个日志文件，一个放置我们的内容（出错函数名、输入参数、必要信息）；另一个放置Exception的详细内容。</p>
<p>&nbsp;</p>
<p>鉴于上面的分析，我们的日志产出的文件可以有3个：</p>
<ul>
    <li><!--[if !supportLists]--><!--[endif]-->Info级别的日志</li>
    <li><!--[if !supportLists]--><!--[endif]-->Debug级别和Error级别（我们自定义内容）</li>
    <li><!--[if !supportLists]-->Error级别，专门存放Exception详细内容的日志。</li>
</ul>
<p>&nbsp;</p>
<p><strong>3</strong><strong>、记录日志内容格式</strong></p>
<p>&nbsp;</p>
<p>这个一般是按个人喜好和团队习惯来定义，一般一个团队最好都用一个格式来定义，起码大家都能看懂。但无论用什么格式，我对日志格式有几个建议：</p>
<p>&nbsp;</p>
<ul>
    <li><!--[if !supportLists]--><!--[endif]-->一条日志内容应该都在一行，无论使用shell的grep还是powershell的select-string、cmd的find，这会都会方便的定位日志内容。</li>
    <li><!--[if !supportLists]-->日志内容都用英文，因为如果用中文的话，打开日志文件的时候会有可能有了乱码的问题，虽然有些命令行可以指定打开日志的编码，但始终会大为不便。</li>
    <li><!--[if !supportLists]--><!--[endif]-->日志文件命名，除了时间，要加上程序和服务器的名称。下载下来的时候，可以一眼知道此日志文件的来源。</li>
</ul>
<p>&nbsp;</p>
<p><strong>4</strong><strong>、避免写日志锁定</strong></p>
<p>&nbsp;</p>
<p>在记录日志的时候，尽量不要锁定日志文件。有的情景，需要不同程序写入同一个日志文件，这样就会导致文件被一个程序锁死而其他程序无法写入日志的异常。</p>
<p>&nbsp;</p>
<p><strong>三、定位日志内容</strong></p>
<p>&nbsp;</p>
<p>有了日志记录，有问题的时候，那当然要搜索日志文件。看似很简单，直接打开文本Ctrl + F不就完了吗？其实不是，在实际开发情况日志文件都在远程的服务器，而且日志文件有时大至几百兆，打开很困难。</p>
<p>&nbsp;</p>
<p>查看日志的方式有几个：</p>
<ul>
    <li><!--[if !supportLists]--><!--[endif]-->使用shell语言的话，直接使用grep指令即可。使用tail &#8211;f 可以跟踪日志文件</li>
    <li><!--[if !supportLists]--><!--[endif]-->Window2003本身没有tail指令，但可以安装Windows Server
    2003 Resource Kit Tools来获取tail指令。Window的远程cmd可以通过psexec来实现。</li>
</ul>
<p>&nbsp;</p>
<br>  <img src ="http://www.cnitblog.com/seeyeah/aggbug/67052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2010-06-27 11:34 <a href="http://www.cnitblog.com/seeyeah/archive/2010/06/27/67052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文章摘选【20091008】</title><link>http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 08 Oct 2009 14:03:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61734.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61734.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61734.html</trackback:ping><description><![CDATA[1、<a target="_blank"  href="http://www.codeproject.com/KB/toolbars/VS_IDE_Dock_Container.aspx">Visual Studio IDE like Dock Container - Second Version</a><br><br>仿VS IDE风格DockContainer插件，有标签预览功能，比较Cool的Ctrl+Tab预览。<br><br>2、<a target="_blank"  href="http://www.codeproject.com/KB/recipes/HashFile.aspx">Save Key/Value Pairs in a File</a><br><br>Hashtable运用方面非常广泛，但如果遇到大数据的话，会导致耗用大量内存。因此本文提供把Hashtable的数据结构存到&#8220;文件&#8221;的方案。<br><br>3、<a target="_blank"  href="http://www.codeproject.com/KB/aspnet/SandBox_CometSample.aspx">Using IHttpAsyncHandler and XMLHttpRequest to &#8220;push&#8221; messages to the client<br></a><br>一个从服务器&#8220;推&#8221;信息到客户端的方案。<br><br><br><img src ="http://www.cnitblog.com/seeyeah/aggbug/61734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-10-08 22:03 <a href="http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】Json对象格式化字符串输出</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/29/61618.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Mon, 28 Sep 2009 16:44:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/29/61618.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61618.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/29/61618.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61618.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61618.html</trackback:ping><description><![CDATA[函数的主要功能是：传入一个Json对象（为了节省空间，一般请求返回的Json都是没有格式化的，可读性不好），可以输出格式化字符串，提高Json可读性。<br>虽然很多IDE或工具已经实现，但有时做简单测试时，格式化还是需要的。<br><br>假设，JS调用（假设界面有一个id为result的textarea）<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;json&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;Id:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Test</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;Date:&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Date(),<br>&nbsp;&nbsp;&nbsp;&nbsp;Subjects:<br>&nbsp;&nbsp;&nbsp;&nbsp;[<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">语文</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">数学</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">英语</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Marks:&nbsp;[</span><span style="color: #000000;">90</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">83</span><span style="color: #000000;">,&nbsp;{&nbsp;Test:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">aaa</span><span style="color: #000000;">"</span><span style="color: #000000;">}]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;],<br>&nbsp;&nbsp;&nbsp;&nbsp;Company:<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Microsoft</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">USA</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;Test:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br>};<br></span><span style="color: #008000;">//</span><span style="color: #008000;">-------------测试</span><span style="color: #008000;"><br>//</span><span style="color: #008000;">格式化Json字符串</span><span style="color: #008000;"><br></span><span style="color: #000000;">document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">result</span><span style="color: #000000;">"</span><span style="color: #000000;">).value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;JsonUti.convertToString(json);<br></span></div>
<br>界面输出<br><br><img alt="" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/s1.jpg"><br>实现代码如下:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;JsonUti&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">定义换行符</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">定义制表符</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\t</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">转换String</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;convertToString:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(obj)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;JsonUti.__writeObj(obj,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">写对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__writeObj:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(obj&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;level&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">层次（基数为1）</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;isInArray)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">此对象是否在一个集合内</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果为空，直接输出null</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">null</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">为普通类型，直接输出值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Number&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Date&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;String&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Boolean)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;v&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;tab&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;isInArray&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;JsonUti.__repeatStr(JsonUti.t,&nbsp;level&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;:&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;String&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Date)&nbsp;{<br>&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><span style="color: #008000;">//</span><span style="color: #008000;">时间格式化只是单纯输出字符串，而不是Date对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&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><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;tab&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">\</span><span style="color: #000000;">""</span><span style="color: #000000;">&nbsp;+&nbsp;v&nbsp;+&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\</span><span style="color: #000000;">""</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Boolean)&nbsp;{<br>&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><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;tab&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;v.toLowerCase();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&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><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;tab&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">写Json对象，缓存字符串</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;currentObjStrings&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">遍历属性</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;name&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;obj)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">格式化Tab</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;paddingTab&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;JsonUti.__repeatStr(JsonUti.t,&nbsp;level);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(paddingTab);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">写出属性名</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(name&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj[name];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(val&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(</span><span style="color: #000000;">"</span><span style="color: #000000;">null</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&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><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;val.constructor;<br>&nbsp;<br>&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><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(c&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Array)&nbsp;{&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果为集合，循环内部对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&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;temp.push(JsonUti.n&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;paddingTab&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">[</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.n);<br>&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;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;levelUp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;level&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">层级+2</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;<br>&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;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;tempArrValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">集合元素相关字符串缓存片段</span><span style="color: #008000;"><br></span><span style="color: #000000;">&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;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;val.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br>&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;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">递归写对象&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><span style="color: #008000;"><br></span><span style="color: #000000;">&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;&nbsp;tempArrValue.push(JsonUti.__writeObj(val[i],&nbsp;levelUp,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">));<br>&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;}<br>&nbsp;<br>&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;temp.push(tempArrValue.join(</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.n));<br>&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;temp.push(JsonUti.n&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;paddingTab&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">]</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&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><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(c&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Function)&nbsp;{<br>&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;temp.push(</span><span style="color: #000000;">"</span><span style="color: #000000;">[Function]</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&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><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&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;</span><span style="color: #008000;">//</span><span style="color: #008000;">递归写对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&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;temp.push(JsonUti.__writeObj(val,&nbsp;level&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">加入当前对象&#8220;属性&#8221;字符串</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentObjStrings.push(temp.join(</span><span style="color: #000000;">""</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(level&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">isInArray&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;JsonUti.n&nbsp;:&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果Json对象是内部，就要换行格式化</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.__repeatStr(JsonUti.t,&nbsp;level&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">{</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">加层次Tab格式化</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;currentObjStrings.join(</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">串联所有属性值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.n&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.__repeatStr(JsonUti.t,&nbsp;level&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">}</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">封闭对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__isArray:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(obj)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Array;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__repeatStr:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(str,&nbsp;times)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;newStr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(times&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;times;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newStr.push(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;newStr.join(</span><span style="color: #000000;">""</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br>&nbsp;<br></span></div>
<br>实例下载：<a  href="http://www.cnitblog.com/Files/seeyeah/JsonToString.rar" title="JsonToString.rar">JsonToString.rar</a><br><img src ="http://www.cnitblog.com/seeyeah/aggbug/61618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-29 00:44 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/29/61618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>翻译 Threading in C#    </title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/25/61560.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 24 Sep 2009 16:30:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/25/61560.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61560.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/25/61560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61560.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61560.html</trackback:ping><description><![CDATA[英文原版：<a style="text-decoration: underline;" target="_blank"  href="http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html">http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html</a><br>
<br>中文翻译：<a target="_blank"  href="http://knowledge.swanky.wu.googlepages.com/threading_in_c_sharp.html"><span style="text-decoration: underline;">http://knowledge.swanky.wu.googlepages.com/threading_in_c_sharp.html
</span></a><br> <img src ="http://www.cnitblog.com/seeyeah/aggbug/61560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-25 00:30 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/25/61560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2005 SP1 “无法使用此产品的安装源,请确认安装源存在,并且您可以访问它”的错误</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/22/61517.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Tue, 22 Sep 2009 02:58:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/22/61517.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61517.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/22/61517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61517.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61517.html</trackback:ping><description><![CDATA[摘至：http://www.cnblogs.com/wayne-ivan/archive/2008/02/29/1086104.html<br><hr style="width: 100%; height: 2px;">系统：Windows 2003 std<br><br>安装的是 Visual Studio 2005 Team Suite 中文版，
昨天下了SP1准备打上， 却在提取文件后出现&#8220;无法使用此产品的安装源,请确认安装源存在,并且您可以访问它&#8221;的错误。
开始怀疑是自己装的VS版本的问题（下载版＋正式序列号）。 于是卸了，再去找来貌似完Retail的TS英文版装上， 下了个英文版的SP1，
问題依旧。 <br><br>Google了一下， 光见有问的，没见有回答的。 看来大多人安装都挺顺的， 自己找原因吧。<br><br>打开临时文件夹看了看， 找到安装Log， 看到了错误所在：&#8220;Error 1718. File was rejected by digital signature policy&#8221;。 有的放矢，解决问题就容易了。 <br><br><br>
<h2><font size="4">原因</font></h2>
当计算机没有足够的连续内存可供 Windows Server 2003 或 Windows XP 用于验证是否对 .msi 包或 .msp 包正确进行了签名时将出现此问题。<br>数字签名可帮助确保程序包不会被篡改。当 Windows Installer 调用 <strong>SaferIdentifyLevel</strong> 函数时，Windows Server 2003 和 Windows XP 使用其他安全级别，即软件限制策略。<br><br>当 Windows Installer 同时调用 <strong>SaferIdentifyLevel</strong> 函数和 <strong>SAFER_CRITERIA_IMAGEHASH</strong>
标志时，整个程序包被加载到计算机上的内存中。计算机必须拥有程序包大小所需的足够连续内存。如果计算机没有足够的连续内存，则会出现错误。由于出现错
误，Windows Installer 将无法验证是否对该程序包正确地进行了签名。因此，会收到&#8220;症状&#8221;部分中提到的错误消息。<br><br><br><font style="font-weight: bold;" size="4">方法一（建议使用）<br></font><font size="4"><font size="2">1. 打开注册表编辑器， 转到项：</font></font>HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Safer\CodeIdentifiers<br><br>2.将 PolicyScope 的注册表值从0改为1. （没有就新建一个）<br>3.命令行中执行 net stop msiserver 停止Windows Installer服务。<br>4.安装 SP1 （好慢，不过这回挺顺了）<br>5.装完把步骤2中的 PolicyScope值改回0.<br>6.喜欢的话就重启一下。<br><br><font style="font-weight: bold;" size="4">方法二<br></font>如果以上步骤不能解决该问题，请按照下列步骤操作：<br>1. 管理工具－》本地安全设置－》软件限制策略。（如果如果没有软件限制，右击&#8220;软件限制策略&#8221;，新建一个。）<br>2. &#8220;对象类型&#8221;下双击&#8220;强制&#8221;，并将第2个勾选从&#8220;所有用户&#8221;改为&#8220;除本地管理员以外的所有用户&#8221;<br>3. 重启，安装SP1.<br>4.改回原先设置。
<br><br><img src ="http://www.cnitblog.com/seeyeah/aggbug/61517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-22 10:58 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/22/61517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软反跨站脚本库3.0 RTM</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61497.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 20 Sep 2009 14:29:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61497.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61497.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61497.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61497.html</trackback:ping><description><![CDATA[摘至：http://www.cnblogs.com/shanyou/archive/2009/07/16/1524515.html<br><br>
<p>跨站脚本Cross-Site Scripting（XSS）又叫CSS (Cross Site Script)
，跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码，当用户浏览该页之时，嵌入其中Web里面的html代码会被执行，从而达到恶意
用户的特殊目的。XSS属于被动式的攻击，因为其被动且不好利用，所以许多人常呼略其危害性。<br>跨站脚本Cross-Site Scripting（XSS）是最为流行的Web安全漏洞之一。据统计，2007年，跨站脚本类的安全漏洞的数目已经远远超出传统类型的安全漏洞(<a title="http://en.wikipedia.org/wiki/Cross-site_scripting" href="http://en.wikipedia.org/wiki/Cross-site_scripting">http://en.wikipedia.org/wiki/Cross-site_scripting</a>)</p>
<p>虽然在IE8中引入了客户端的XSS过滤器以减少XSS对用户造成的危害，但是XSS本质上是Web应用服务的漏洞，仅仅依赖客户端的保护措施是不够的。解决问题的根本是在Web应用程序的代码中消除XSS安全漏洞。</p>
<p>以下是在Web应用的开发中避免XSS安全漏洞的几个原则：</p>
<ul>
    <li>检查所有产生动态网页的代码</li>
    <li>判定动态网页的内容是否包括不安全的输入信息</li>
    <li>对输入进行校验</li>
    <li>对输出进行编码以过滤特殊字符 </li>
</ul>
<p>采用不同的Web开发工具，实施以上原则的具体步骤也不相同。当需要将一个字符串输出到Web网页时，但又不能完全确定这个字符串是否包括HTML
的特殊字符，例如&#8220;&lt;,&gt;,&amp;&#8221;等等，可以使用编码（HTMLEncode）以过滤这些特殊字符。在ASP.NET中有两种方法：一
种是使用HttpUtility，另一种就是使用微软提供的XSS库，最新版本是3.0
,采用MS-PL协议发布的开源项目，7月14日发布了，下载地址是：<a title="http://www.microsoft.com/downloads/details.aspx?FamilyId=051ee83c-5ccf-48ed-8463-02f56a6bfc09&amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=051ee83c-5ccf-48ed-8463-02f56a6bfc09&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?FamilyId=051ee83c-5ccf-48ed-8463-02f56a6bfc09&amp;displaylang=en</a>。</p>
<p>AntiXss的使用方式与HttpUtility类似：</p>
<p>String Name = AntiXss.HtmlEncode(Request.QueryString["Name"]);</p>
<p>它们最大的区别在于HttpUtility.HtmlEncode采用的是黑名单验证（Black
list）方式。即HttpUtility.HtmlEncode仅仅过滤它知道的特殊字符，而允许其它的输入。AntiXss.HtmlEncode采
用的白名单验证（White list）方式。它只允许输出它认为合法的字符，而过滤掉其它的所有字符。</p>
<p>两者中，AntiXss.HtmlEncode要更为安全，是推荐的使用手段。</p>
<p>在asp.net 程序中避免 Cross-Site Scripting 攻击的正确方法：</p>
<p>(1) ValidateRequest = true</p>
<p>(2) 对于所有使用者的输入加以<strong> 编码</strong> 并检查长度 ： Application、Session、Url QueryString、Cookie、HTTP Header、数据库、文件、Form表单(根据输出的区域，使用以下相对应的七种编码方法)</p>
<p>&nbsp;</p>
<p>XSS Libray 包含如下的方法：</p>
<table border="0" cellpadding="2" cellspacing="0" width="987">
    <tbody>
        <tr>
            <td valign="top" width="200"><strong> Encoding Method</strong> </td>
            <td valign="top" width="785"><strong> Description</strong> </td>
        </tr>
        <tr>
            <td valign="top" width="200">HtmlEncode</td>
            <td valign="top" width="785">Encodes input strings for use in HTML </td>
        </tr>
        <tr>
            <td valign="top" width="200">HtmlAttributeEncode </td>
            <td valign="top" width="785">Encodes input strings for use in HTML attributes </td>
        </tr>
        <tr>
            <td valign="top" width="200">JavaScriptEncode </td>
            <td valign="top" width="785">Encodes input strings for use in JavaScript </td>
        </tr>
        <tr>
            <td valign="top" width="200">UrlEncode </td>
            <td valign="top" width="785">Encodes input strings for use in Universal Resource Locators (URLs)</td>
        </tr>
        <tr>
            <td valign="top" width="200">VisualBasicScriptEncode </td>
            <td valign="top" width="785">Encodes input strings for use in Visual Basic Script </td>
        </tr>
        <tr>
            <td valign="top" width="200">XmlEncode </td>
            <td valign="top" width="785">Encodes input strings for use in XML </td>
        </tr>
        <tr>
            <td valign="top" width="200">XmlAttributeEncode </td>
            <td valign="top" width="785">Encodes input strings for use in XML attributes </td>
        </tr>
    </tbody>
</table>
<p>具体的使用方法及示例，请参考MSDN： <a href="http://msdn.microsoft.com/en-us/library/aa973813.aspx">Microsoft Anti-Cross Site Scripting Library V1.5: Protecting the Contoso Bookmark Page</a>&nbsp;</p>
<p>AntiXSS Library v3.0 除了保留了老版本的一些静态的Encode工具方法(重新实现),另外最重要的就是新增了<br>AntiXSS HttpModule 用于统一 Encode 输出ASP.Net Server Web Control 为encode 输出的相关属性,如:Text属性等<br>原理大概是《利用 HttpModule,基于输出,统一控制、干预、处理(例如: 过滤关键字、AntiXSS) ASP.Net WebForm Control 展现属性的方案原型》<br><a href="http://www.cnblogs.com/Microshaoft/archive/2009/01/08/1371475.html" target="_blank"><font color="#f03331">http://www.cnblogs.com/Microshaoft/archive/2009/01/08/1371475.html</font></a><br><br></p>
<p>微软反跨站脚本库主页：<a title="http://msdn.microsoft.com/en-us/security/aa973814.aspx" href="http://msdn.microsoft.com/en-us/security/aa973814.aspx">http://msdn.microsoft.com/en-us/security/aa973814.aspx</a><br>XSS（跨站）攻击全解析: <a href="http://www4.it168.com/jtzt/shenlan/safe/xss/">http://www4.it168.com/jtzt/shenlan/safe/xss/</a><br>CodePlex站点: <a href="http://antixss.codeplex.com/">http://antixss.codeplex.com/</a></p>
<br>作者: <a href="http://shanyou.cnblogs.com/" target="_blank">自由、创新、研究、探索&#8230;&#8230;</a><br>
出处：<a href="http://shanyou.cnblogs.com/" target="_blank">http://shanyou.cnblogs.com/</a><br>
版权：本文版权归作者和博客园共有<br>
转载：欢迎转载，为了保存作者的创作热情，请按要求【转载】，谢谢<br>
要求：未经作者同意，必须保留此段声明；必须在文章中给出原文连接；否则必究法律责任 <br>
个人网站: <a href="http://www.openbeta.cn/">http://www.openbeta.cn/</a>
<br><br><img src ="http://www.cnitblog.com/seeyeah/aggbug/61497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-20 22:29 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/20/61497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】扩展log4net的PatternLayout</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61491.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sat, 19 Sep 2009 16:53:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61491.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61491.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61491.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61491.html</trackback:ping><description><![CDATA[		<strong>
一、需求
</strong>
<br>
<br>PatternLayout的配置格式化如下所示：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">layout&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="log4net.Layout.PatternLayout"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">conversionPattern&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="[%date{yyyy-MM-dd&nbsp;HH:mm:ss}]&nbsp;[%level]&nbsp;%message&nbsp;%exception&nbsp;%newline"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">layout</span><span style="color: #0000ff;">&gt;</span></div>
<br>由PatternLayout的conversionPattern来设置一个&#8220;模板&#8221;信息。其变量都有&#8220;%&#8221;开头的单词标识。如%level、%message；变量也可以传入参数，如%date{ yyyy-MM-dd HH:mm:ss }，其中yyyy-MM-dd HH:mm:ss就是%date的参数。<br><br>PatternLayout默认所可以支持的单词标识，请参考：<br><a style="text-decoration: underline;" target="_blank" href="http://www.cnitblog.com/seeyeah/archive/2008/10/15/50291.html">http://www.cnitblog.com/seeyeah/archive/2008/10/15/50291.html</a><br><br>现在我们需要扩展这些单词标记。<br>假设模板字符串定义如下所示：<br>&nbsp;[%date{yyyy-MM-dd HH:mm:ss}] %o{Message}，%o{User} %newline"<br>注意%o{Message}，%o是我们要实现扩展的一个标记，标识传入的message的对象，后面的参数{Message}、{User}表示message的对象的2个属性名。<br><br>我们先设计一个传递日志消息的实体类，定义如下所示<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;SampleMessage<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;Message&nbsp;{&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;User&nbsp;{&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">;&nbsp;}<br>}</span></div>
<br><br>如下调用ILog的Info方法。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">log.Info(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SampleMessage()&nbsp;{&nbsp;Message&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Test1</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;User&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">User1</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;});<br>log.Info(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SampleMessage()&nbsp;{&nbsp;Message&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Test2</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;User&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">User2</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;});</span></div>
<br><br>我们想要的结果如下所示：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">[</span><span style="color: #000000;">2009</span><span style="color: #000000;">-</span><span style="color: #000000;">09</span><span style="color: #000000;">-</span><span style="color: #000000;">19</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">14</span><span style="color: #000000;">:</span><span style="color: #000000;">27</span><span style="color: #000000;">:</span><span style="color: #000000;">29</span><span style="color: #000000;">]&nbsp;Test1，User1<br>[</span><span style="color: #000000;">2009</span><span style="color: #000000;">-</span><span style="color: #000000;">09</span><span style="color: #000000;">-</span><span style="color: #000000;">19</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">14</span><span style="color: #000000;">:</span><span style="color: #000000;">27</span><span style="color: #000000;">:</span><span style="color: #000000;">29</span><span style="color: #000000;">]&nbsp;Test2，User2&nbsp;</span></div>
<br><br><strong>二、方案<br></strong><br>Log4net用appender来记录日志的加载方式，内置就有很多种appender：RollingFileAppender、ConsoleAppender、AdoNetAppender等等。其中，日志信息的格式由appender中的layout掌控，log4net内置的layout是log4net.Layout.PatternLayout。<br><br>Appender（具体以RollingFileAppender为例，其他类型Appender类似）与layout的关系如下所示：<br>&nbsp;<br><img alt="" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/log4net/1.jpg" height="464" width="396"><br><br>RollingFileAppender的基类FileAppender以及TextWriterAppender是文件日志类的公用基类。AppenderSkeleton是所有log4net的appender的基类，内部封装了常用方法，如线程锁定、日志等级过滤和支持一般的文件写入等。<br><br>另外一边的PatternLayout，结构跟Appender相似，IAppender包含一个ILayout负责格式化日志的格式。因此如果我们要扩展日志的格式化，就需要扩展PatternLayout。<br><strong><br></strong><strong>三、实现</strong><br><strong><br></strong>下面说明，扩展PatternLayout的实现过程。<br><br><strong>Step1：实现一个Converter</strong><br><br>Log4net内置提供的每个模板参数，都有对应的Converter做处理。如%message对应MessagePatternConverter；%date对应DatePatternConverter等。这个对应关系可以查看log4net的源代码PatternLayout.cs的静态构造函数，内部用一个静态的Hashtable管理关键字与Converter的关系：<strong><br></strong><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;Initialize&nbsp;the&nbsp;global&nbsp;registry<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;remarks&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;para&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;Defines&nbsp;the&nbsp;builtin&nbsp;global&nbsp;rules.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/para&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/remarks&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;PatternLayout()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Hashtable(</span><span style="color: #000000;">45</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">literal</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(log4net.Util.PatternStringConverters.LiteralPatternConverter));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">newline</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(log4net.Util.PatternStringConverters.NewLinePatternConverter));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(log4net.Util.PatternStringConverters.NewLinePatternConverter));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">c</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(LoggerPatternConverter));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">logger</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(LoggerPatternConverter));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">C</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TypeNamePatternConverter));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">class</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TypeNamePatternConverter));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">type</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TypeNamePatternConverter));</span></div>
<strong><br></strong>再看看我们将要实现的模板字符串：<br>[%date{yyyy-MM-dd HH:mm:ss}] %o{Message}，%o{User} %newline"<br>我们要实现的关键字是&#8220;o&#8221;，按照log4net的PatternLayout的设计，我们也要相应实现一个Converter去解析关键字是&#8220;o&#8221;的内容，我们定义这个类名为ObjectConverter。<br><br>下面是ObjectConverter的实现方式，实现较为简单，详细看注释：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;根据键值获取值的对象<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IGetObjectValueByKey<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;GetByKey(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;对应%o的对象转换器<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;remarks&gt;</span><span style="color: #008000;">用于PatternLayout</span><span style="color: #808080;">&lt;/remarks&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ObjectConverter&nbsp;:&nbsp;PatternLayoutConverter<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Func</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;funcs;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;ObjectConverter()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">********根据键值获取值的顺序<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">从接口获取值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcs&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;GetValueByInterface;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">反射获取属性值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcs&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;GetValueByReflection;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">从索引值获取值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcs&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;GetValueByIndexer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;实现PatternLayoutConverter.Convert抽象方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="writer"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="loggingEvent"&gt;&lt;/param&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">override</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Convert(TextWriter&nbsp;writer,&nbsp;LoggingEvent&nbsp;loggingEvent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取传入的消息对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;objMsg&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;loggingEvent.MessageObject;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(objMsg&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果对象为空输出log4net默认的null字符串</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(SystemInfo.NullText);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.IsNullOrEmpty(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.Option))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果属性为空，输出消息对象的ToString()</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(objMsg.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetValue(funcs,&nbsp;objMsg,&nbsp;Option);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(val&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">&nbsp;:&nbsp;val.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">#region</span><span style="color: #000000;">&nbsp;静态方法</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;循环方法列表，根据键值获取值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="func"&gt;</span><span style="color: #008000;">方法列表委托</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="obj"&gt;</span><span style="color: #008000;">对象</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="name"&gt;</span><span style="color: #008000;">键值</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetValue(Func</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;func,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;obj,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(func&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(Func</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;del&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;func.GetInvocationList())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;del(obj,&nbsp;name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果获取的值不为null，则跳出循环</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(val&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&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><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;使用接口方式取值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="obj"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="name"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;remarks&gt;</span><span style="color: #008000;">效率最高，避免了反射带来的效能损耗</span><span style="color: #808080;">&lt;/remarks&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetValueByInterface(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;obj,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IGetObjectValueByKey&nbsp;objConverter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;IGetObjectValueByKey;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(objConverter&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;objConverter.GetByKey(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;反射对象的获取属性，获取属性值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="obj"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="name"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetValueByReflection(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;obj,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;t&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj.GetType();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;propertyInfo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;t.GetProperty(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(propertyInfo&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;propertyInfo.GetValue(obj,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;反射对象的索引器，获取值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="obj"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="name"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetValueByIndexer(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;obj,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInfo&nbsp;getValueMethod&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj.GetType().GetMethod(</span><span style="color: #000000;">"</span><span style="color: #000000;">get_Item</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(getValueMethod&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getValueMethod.Invoke(obj,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">[]&nbsp;{&nbsp;name&nbsp;});<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span></div>
<br><br><br>主要是ObjectConvertert按顺序用了3种从键值获取值的方式<br>1、&nbsp;&nbsp;&nbsp; 对象实现了我们所定义的接口IGetObjectValueByKey，直接调用方法获取。此方法效率最好，因为内部避免了反射所带来的损耗。<br>2、&nbsp;&nbsp;&nbsp; 用反射获取属性值<br>3、&nbsp;&nbsp;&nbsp; 用反射获取索引值<strong><br><br><br>Step2：把Converter注册到PatternLayout</strong><br><br>现在我们需要把已实现的ObjectConverter加入PatternLayout的解析逻辑中。<br>我们先从ILog中找到藏在里面的PatternLayout实例，实现如下代码所示：<strong><br><br></strong>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">var&nbsp;log&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Log4NetCommon.GetLog(</span><span style="color: #000000;">"</span><span style="color: #000000;">LogConfig1st</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>var&nbsp;appender&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log.Logger.Repository.GetAppenders()[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br>var&nbsp;layout&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((appender&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;AppenderSkeleton).Layout&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;PatternLayout);<br></span></div>
<strong><br></strong>Log4NetCommon是我们自己用于初始化Log4Net的工具类。log是我们一般主打使用日志的ILog实例，第二行我们找到对应的Appender，最后通过转换类型找到了PatternLayout。<br><br>PatternLayout提供了AddConverter方法，可以轻松加入我们刚实现Converter。<br>AddConverter有2个签名版本：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;AddConverter(ConverterInfo&nbsp;converterInfo)<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;AddConverter(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name,&nbsp;Type&nbsp;type)</span></div>
<br>根据源代码对AddConverter的解析<br>Programmatic users should use the alternative &lt;see cref="AddConverter(string,Type)"/&gt; method.<br>我们还是按要求调用AddConverter(string name, Type type)的版本。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">layout.AddConverter(</span><span style="color: #000000;">"</span><span style="color: #000000;">o</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(ObjectConverter));</span></div>
<br><br>但目前还是不能解析模板中关键字&#8220;o&#8221;，为什么呢？<br><br>首先我们先简单了解一下PatternLayout如何、在什么时候注册关键字与Converter。<br><br>1、&nbsp;&nbsp;&nbsp; 在PatternLayout中，定义了一个s_globalRulesRegistry的静态Hashtable，Key为关键字，Value为对应的Converter类型。在PatternLayout的静态构造函数中，先会注册log4net内置的45个关键字。<br>2、&nbsp;&nbsp;&nbsp; 初始化log4net配置的时候，会调用PatternLayout的ActivateOptions初始化以上的配置，以及在ActivateOptions中会调用CreatePatternParser解析配置中的模板字符串。<br><br>在初始化log4net配置的时候，都还没来得及AddConverter，log4net就已经解析完毕了。因此在调用了AddConverter，即修改了所有有关PatternLayout配置时，必须再手动调用一次ActivateOptions重新解析一次模板字符串。<br><br>全部代码实现如下所示：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">var&nbsp;log&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Log4NetCommon.GetLog(</span><span style="color: #000000;">"</span><span style="color: #000000;">LogConfig1st</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>var&nbsp;appender&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log.Logger.Repository.GetAppenders()[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br>var&nbsp;layout&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((appender&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;AppenderSkeleton).Layout&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;PatternLayout);<br>layout.AddConverter(</span><span style="color: #000000;">"</span><span style="color: #000000;">o</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(ObjectConverter));<br>layout.ActivateOptions();<br></span></div>
<br>实现完毕！<br><br><strong><br></strong><strong>三、全部代码下载</strong><br><br><a href="http://www.cnitblog.com/Files/seeyeah/Log4NetPatternLayoutExtension.zip" title="Log4NetPatternLayoutExtension.zip">Log4NetPatternLayoutExtension.zip</a><br><br>  <img src ="http://www.cnitblog.com/seeyeah/aggbug/61491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-20 00:53 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/20/61491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单的性能计数器：CodeTimer</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61456.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 17 Sep 2009 05:19:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61456.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61456.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61456.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61456.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘至：http://www.cnblogs.com/JeffreyZhao/archive/2009/03/10/CodeTimer.html有数据，有真相，相信大家在平时的工作或学习过程中，都需要比较几种不同方法或实现之间的性能差距。在这些时候，往往就需要我们不断地创建Stopwatch，打开，关闭，然后打印时间。这种一遍又一遍的重复终有一天会让人忍无可忍，因此如果能有一个“标准”的性能计数...&nbsp;&nbsp;<a href='http://www.cnitblog.com/seeyeah/archive/2009/09/17/61456.html'>阅读全文</a><img src ="http://www.cnitblog.com/seeyeah/aggbug/61456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-17 13:19 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/17/61456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fast Reflection Library</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61455.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 17 Sep 2009 05:16:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61455.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61455.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61455.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61455.html</trackback:ping><description><![CDATA[摘至：http://www.cnblogs.com/JeffreyZhao/archive/2009/02/01/Fast-Reflection-Library.html<br /><br />这是我在CodePlex上创建的一个项目，它的网址是<a href="http://www.codeplex.com/FastReflectionLib">http://www.codeplex.com/FastReflectionLib</a>，使用Microsoft Public License (Ms-PL)，您可以随意在自己的产品中使用它的全部或部分代码。这个项目用到了我在《<a href="http://www.cnblogs.com/JeffreyZhao/archive/2008/11/24/invoke-method-by-lambda-expression.html">方法的直接调用，反射调用与Lambda表达式调用</a>》和《<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/01/09/DynamicPropertyAccessor-and-FastEval.html">这下没理由嫌Eval的性能差了吧？</a>》两篇文章里用到的做法，并加以提炼和扩展发布的项目——随便搞搞，留个印记，也供以后参考。 <h4>基本使用方式</h4><p>　
　反射是.NET中非常重要的功能。使用反射来构造对象、调用方法或是访问属性是某些项目中常用的做法之一（例如ORM框架）。众所周知，与一个成员的直
接访问相比，反射调用的性能要低好几个数量级。FastReflectionLib提供了一种简便的方式，使一些常用反射调用的性能得到大幅提高。如下：</p><pre class="code"><span style="color: blue;">using </span>System;<br /><span style="color: blue;">using </span>System.Reflection;<br /><span style="color: blue;">using </span>FastReflectionLib;<br /><br /><span style="color: blue;">namespace </span>SimpleConsole<br />{<br /><span style="color: blue;">class </span><span style="color: rgb(43, 145, 175);">Program<br /></span>{<br /><span style="color: blue;">static void </span>Main(<span style="color: blue;">string</span>[] args)<br />        {<br /><span style="color: rgb(43, 145, 175);">PropertyInfo </span>propertyInfo = <span style="color: blue;">typeof</span>(<span style="color: blue;">string</span>).GetProperty(<span style="color: rgb(163, 21, 21);">"Length"</span>);<br /><span style="color: rgb(43, 145, 175);">MethodInfo </span>methodInfo = <span style="color: blue;">typeof</span>(<span style="color: blue;">string</span>).GetMethod(<span style="color: rgb(163, 21, 21);">"Contains"</span>);<br /><br /><span style="color: blue;">string </span>s = <span style="color: rgb(163, 21, 21);">"Hello World!"</span>;<br /><br /><span style="color: green;">// get value by normal reflection<br /></span><span style="color: blue;">int </span>length1 = (<span style="color: blue;">int</span>)propertyInfo.GetValue(s, <span style="color: blue;">null</span>);<br /><span style="color: green;">// get value by the extension method from FastReflectionLib,<br />            // which is much faster<br /></span><span style="color: blue;">int </span>length2 = (<span style="color: blue;">int</span>)propertyInfo.FastGetValue(s);<br /><br /><span style="color: green;">// invoke by normal reflection<br /></span><span style="color: blue;">bool </span>result1 = (<span style="color: blue;">bool</span>)methodInfo.Invoke(s, <span style="color: blue;">new object</span>[] { <span style="color: rgb(163, 21, 21);">"Hello" </span>});<br /><span style="color: green;">// invoke by the extension method from FastReflectionLib,<br />            // which is much faster<br /></span><span style="color: blue;">bool </span>result2 = (<span style="color: blue;">bool</span>)methodInfo.FastInvoke(s, <span style="color: blue;">new object</span>[] { <span style="color: rgb(163, 21, 21);">"Hello" </span>});<br />        }<br />    }<br />}<br /></pre><p>　　在得到了PropertyInfo或MethodInfo对象之后，我们可以使用GetValue或Invoke方法来访问属性或调用方法。在
FastReflectionLib中为PropertyInfo、MethodInfo等对象定义了对应的扩展方法，于是我们就可以使用这些扩展方法
（从代码上看来，基本上只是在原来的方法之前加上“Fast”）来进行调用，与之前的方法相比，新的扩展方法性能有极大的提高。</p><h4>直接使用各工作对象</h4><p>　　各FastXxx方法实际上是将PropertyInfo等对象作为Key去一个Cache中获取对应的工作对象，然后调用工作对象上对应的方法。因此，直接调用工作对象可以获得更好的性能。各工作对象类型的对应关系如下：</p><ul><li>PropertyInfo：IPropertyAccessor 
</li><li>MethodInfo：IMethodInvoker 
</li><li>ConstructorInfo：IConstructorInvoker 
</li><li>FieldInfo：IFieldAccessor</li></ul><p>　　我们可以使用FastReflectionCaches.MethodInvokerCache来获取一个IMethodInvoker对象：</p><pre class="code"><span style="color: blue;">static void </span>Execute(<span style="color: rgb(43, 145, 175);">MethodInfo </span>methodInfo, <span style="color: blue;">object </span>instance, <span style="color: blue;">int </span>times)<br />{ <br /><span style="color: rgb(43, 145, 175);">IMethodInvoker </span>invoker = <span style="color: rgb(43, 145, 175);">FastReflectionCaches</span>.MethodInvokerCache.Get(methodInfo);<br /><span style="color: blue;">object</span>[] parameters = <span style="color: blue;">new object</span>[0];<br /><span style="color: blue;">for </span>(<span style="color: blue;">int </span>i = 0; i &lt; times; i++)<br />    {<br />        invoker.Invoke(instance, parameters);<br />    }<br />}<br /></pre><h4>工作对象的默认实现与扩展</h4><p>　　在FastReflectionLib中，已经提供了IPropertyAccessor等接口的默认实现。该实现将会构造一颗表达式树
（Expression
Tree）并将其编译（调用其Compile方法）以获得一个与反射方法签名相同的委托对象。这是一种简单、通用而安全的实现，由于Compile方法使
用了Emit，其性能也较为令人满意（可见下面的性能测试）。但是这并不是性能最高的做法，如果使用Emit生成最优化的代码，其性能甚至会高于方法的直
接调用（例如<a href="http://www.codeplex.com/Dynamic">Dynamic Reflection Library</a>）。如果您想使用更好的实现来替换，则可以自行构造一个工作对象接口的实现，并替换对应的Factory：</p><pre class="code"><span style="color: blue;">public class </span><span style="color: rgb(43, 145, 175);">BetterPropertyAccessor </span>: <span style="color: rgb(43, 145, 175);">IPropertyAccessor<br /></span>{<br /><span style="color: blue;">public </span>BetterPropertyAccessor(<span style="color: rgb(43, 145, 175);">PropertyInfo </span>propertyInfo) { ... }<br /><br />    ...<br />}<br /><br /><span style="color: blue;">public class </span><span style="color: rgb(43, 145, 175);">BetterPropertyAccessorFactory </span>:<br /><span style="color: rgb(43, 145, 175);">IFastReflectionFactory</span>&lt;<span style="color: rgb(43, 145, 175);">PropertyInfo</span>, <span style="color: rgb(43, 145, 175);">IPropertyAccessor</span>&gt;<br />{<br /><span style="color: blue;">public </span><span style="color: rgb(43, 145, 175);">IPropertyAccessor </span>Create(<span style="color: rgb(43, 145, 175);">PropertyInfo </span>key)<br />    {<br /><span style="color: blue;">return new </span><span style="color: rgb(43, 145, 175);">BetterPropertyAccessor</span>(key);<br />    }<br />}<br /><br /><span style="color: blue;">class </span><span style="color: rgb(43, 145, 175);">Program<br /></span>{<br /><span style="color: blue;">static void </span>Main(<span style="color: blue;">string</span>[] args)<br />    {<br /><span style="color: rgb(43, 145, 175);">FastReflectionFactories</span>.PropertyAccessorFactory =<br /><span style="color: blue;">new </span><span style="color: rgb(43, 145, 175);">BetterPropertyAccessorFactory</span>();<br /><br />        ...<br />    }<br />}<br /></pre><h4>缓存的默认实现与扩展</h4><p>　　在FastReflectionLib中使用基于
System.Collections.Generic.Dictionary&lt;TKey,
TValue&gt;类型编写的缓存容器。每次调用FastXxx扩展方法时，类库将从对应的缓存容器中获取工作对象。如果缓存容器中还没有所需的工作对
象，那么它就会调用合适的Factory来构造新的工作对象。从下面的性能测试来看，许多时间是消耗在缓存查找上的，如果您有更好的缓存实现，可以使用以
下的方法替换默认的缓存的容器：</p><pre class="code"><span style="color: blue;">public class </span><span style="color: rgb(43, 145, 175);">BetterMethodInvokerCache </span>:<br /><span style="color: rgb(43, 145, 175);">IFastReflectionCache</span>&lt;<span style="color: rgb(43, 145, 175);">MethodInfo</span>, <span style="color: rgb(43, 145, 175);">IMethodInvoker</span>&gt;<br />{<br /><span style="color: blue;">public </span><span style="color: rgb(43, 145, 175);">IMethodInvoker </span>Get(<span style="color: rgb(43, 145, 175);">MethodInfo </span>key) { ... }<br />}<br /><br /><span style="color: blue;">class </span><span style="color: rgb(43, 145, 175);">Program<br /></span>{<br /><span style="color: blue;">static void </span>Main(<span style="color: blue;">string</span>[] args)<br />    {<br /><span style="color: rgb(43, 145, 175);">FastReflectionCaches</span>.MethodInvokerCache = <br /><span style="color: blue;">new </span><span style="color: rgb(43, 145, 175);">BetterMethodInvokerCache</span>();<br /><br />        ...<br />    }<br />}<br /></pre><h4>根据需要自行缓存工作对象</h4><p>　　FastReflectionLib中通过PropertyInfo等对象作为Key，对PropertyAccessor等工作对象进行缓
存。但是在某些场景下，您也可以选择合适的方式来自行缓存工作对象。与FastReflectionLib源码同时发布的CustomCache示例网站
中包含了一个FastEval扩展，在某些场景下，我们可以使用这个更高效的方法来替换内置的Eval方法。这个示例的特点如下：</p><ul><li>使用对象的类型和属性名同时作为缓存的Key获取对应的PropertyAccessor对象 
</li><li>使用PropertyAccessor获取“匿名对象”中的属性值 
</li><li>缓存的作用域为特定页面，而不是整个AppDomain。</li></ul><h4>性能测试</h4><p>　　FastReflectionLib源码中包含了一个性能测试项目，您可以从中看出FastReflectionLib对于反射的性能改进。摘录部分数据如下（测试在我的笔记本上运行，Release编译）。</p><p>　　执行以下方法：</p><pre class="code"><span style="color: blue;">public class </span><span style="color: rgb(43, 145, 175);">Test<br /></span>{<br /><span style="color: blue;">public void </span>MethodWithArgs(<span style="color: blue;">int </span>a1, <span style="color: blue;">string </span>a2) { }<br />}<br /></pre><p>　　进行一百万次调用，结果如下：</p><table border="1" cellpadding="5" cellspacing="0"><tbody align="middle"><tr><td><strong>调用方式</strong></td><td><strong>消耗时间（秒）</strong></td></tr><tr><td>方法直接调用</td><td>0.0071397</td></tr><tr><td>内置反射调用</td><td>1.4936181</td></tr><tr><td>工作对象调用</td><td>0.0468326</td></tr><tr><td>Fast方法调用</td><td>0.1373712</td></tr></tbody></table><br /><img src ="http://www.cnitblog.com/seeyeah/aggbug/61455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-17 13:16 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/17/61455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对ashx请求用Gzip,Deflated压缩</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/15/61405.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Tue, 15 Sep 2009 01:06:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/15/61405.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61405.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/15/61405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61405.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61405.html</trackback:ping><description><![CDATA[摘至：<a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/liuju150/archive/2009/09/14/1566479.html">对ashx请求用Gzip,Deflated压缩</a><br /><br />//GZIP压缩<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">查看请求头部</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> acceptEncoding </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> context.Request.Headers[</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Accept-Encoding</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">].ToString().ToUpperInvariant();<br /></span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">String.IsNullOrEmpty(acceptEncoding))<br />{<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">如果头部里有包含"GZIP”,"DEFLATE",表示你浏览器支持GZIP,DEFLATE压缩</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (acceptEncoding.Contains(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">GZIP</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">))<br />    {<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">向输出流头部添加压缩信息</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        context.Response.AppendHeader(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Content-encoding</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">gzip</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        context.Response.Filter </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> GZipStream(context.Response.Filter, CompressionMode.Compress);<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (acceptEncoding.Contains(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">DEFLATE</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">))<br />    {<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">向输出流头部添加压缩信息</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        context.Response.AppendHeader(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Content-encoding</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">deflate</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        context.Response.Filter </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> DeflateStream(context.Response.Filter, CompressionMode.Compress);<br />    }<br />}</span></div><br /><p>这样每次context.Response.Write出支的数据就压缩了</p><p>对效多的文本信息压缩可以压缩到原来三分之一到四分之一的样子</p><p>如果发送的信息只有几个字节就没有必要了</p><br /><br /><br /><img src ="http://www.cnitblog.com/seeyeah/aggbug/61405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-15 09:06 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/15/61405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js控制media player参数</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/10/61344.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 10 Sep 2009 06:50:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/10/61344.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61344.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/10/61344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61344.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61344.html</trackback:ping><description><![CDATA[
		<div class="blog_content">
				<div class="postbody">
						<div class="code">&lt;object id="player" height="64" width="260" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"&gt; <br />&lt;param NAME="AutoStart" VALUE="-1"&gt; <br />&lt;!--是否自动播放--&gt; <br />&lt;param NAME="Balance" VALUE="0"&gt; <br />&lt;!--调整左右声道平衡,同上面旧播放器代码--&gt; <br />&lt;param name="enabled" value="-1"&gt; <br />&lt;!--播放器是否可人为控制--&gt; <br />&lt;param NAME="EnableContextMenu" VALUE="-1"&gt; <br />&lt;!--是否启用上下文菜单--&gt; <br />&lt;param NAME="url" value="/blog/1.wma"&gt; <br />&lt;!--播放的文件地址--&gt; <br />&lt;param NAME="PlayCount" VALUE="1"&gt; <br />&lt;!--播放次数控制,为整数--&gt; <br />&lt;param name="rate" value="1"&gt; <br />&lt;!--播放速率控制,1为正常,允许小数,1.0-2.0--&gt; <br />&lt;param name="currentPosition" value="0"&gt; <br />&lt;!--控件设置:当前位置--&gt; <br />&lt;param name="currentMarker" value="0"&gt; <br />&lt;!--控件设置:当前标记--&gt; <br />&lt;param name="defaultFrame" value=""&gt; <br />&lt;!--显示默认框架--&gt; <br />&lt;param name="invokeURLs" value="0"&gt; <br />&lt;!--脚本命令设置:是否调用URL--&gt; <br />&lt;param name="baseURL" value=""&gt; <br />&lt;!--脚本命令设置:被调用的URL--&gt; <br />&lt;param name="stretchToFit" value="0"&gt; <br />&lt;!--是否按比例伸展--&gt; <br />&lt;param name="volume" value="50"&gt; <br />&lt;!--默认声音大小0%-100%,50则为50%--&gt; <br />&lt;param name="mute" value="0"&gt; <br />&lt;!--是否静音--&gt; <br />&lt;param name="uiMode" value="mini"&gt; <br />&lt;!--播放器显示模式:Full显示全部;mini最简化;None不显示播放控制,只显示视频窗口;invisible全部不显示--&gt; <br />&lt;param name="windowlessVideo" value="0"&gt; <br />&lt;!--如果是0可以允许全屏,否则只能在窗口中查看--&gt; <br />&lt;param name="fullScreen" value="0"&gt; <br />&lt;!--开始播放是否自动全屏--&gt; <br />&lt;param name="enableErrorDialogs" value="-1"&gt; <br />&lt;!--是否启用错误提示报告--&gt; <br />&lt;param name="SAMIStyle" value&gt; <br />&lt;!--SAMI样式--&gt; <br />&lt;param name="SAMILang" value&gt; <br />&lt;!--SAMI语言--&gt; <br />&lt;param name="SAMIFilename" value&gt; <br />&lt;!--字幕ID--&gt; <br />&lt;/object&gt;</div>
						<strong>常用的方法和属性：</strong>
						<div class="code">//基本属性<br />URL:String; 指定媒体位置，本机或网络地址<br />uiMode:String; 播放器界面模式，可为Full, Mini, None, Invisible<br />playState:integer; 播放状态，1=停止，2=暂停，3=播放，6=正在缓冲，9=正在连接，10=准备就绪<br />enableContextMenu:Boolean; 启用/禁用右键菜单（也是简单的防盗链方法）<br />fullScreen:boolean; 是否全屏显示<br /><br />//播放器控制属性<br />controls.play; 播放<br />controls.pause; 暂停<br />controls.stop; 停止<br />controls.currentPosition:double; 当前进度<br />controls.currentPositionString:string; 当前进度，字符串格式。如“00:23”<br />controls.fastForward; 快进<br />controls.fastReverse; 快退<br />controls.next; 下一曲<br />controls.previous; 上一曲<br />*注：上一曲和下一曲属性一般不能使用，因为这种功能是对一个播放列表气作用的，而对于新版本的播放器，js脚本一般没有权限去新建和修改播放列表的。只能自己去设计一个播放列表，自己去修改url属性去选曲。<br /><br />//播放器基本属性<br />settings.volume:integer; 音量，0-100<br />settings.autoStart:Boolean; 是否自动播放<br />settings.mute:Boolean; 是否静音<br />settings.playCount:integer; 播放次数<br /><br />//当前播放媒体的属性<br />currentMedia.duration:double; 媒体总长度<br />currentMedia.durationString:string; 媒体总长度，字符串格式。如“03:24”<br />currentMedia.getItemInfo(const
string);
获取当前媒体信息"Title"=媒体标题，"Author"=艺术家，"Copyright"=版权信息，"Description"=媒体内容描
述，"Duration"=持续时间（秒），"FileSize"=文件大小，"FileType"=文件类型，"sourceURL"=原始地址<br />currentMedia.setItemInfo(const string); 通过属性名设置媒体信息<br />currentMedia.name:string; 同 currentMedia.getItemInfo("Title")<br />[currentPlaylist] wmp.currentPlaylist //当前播放列表属性<br />currentPlaylist.count:integer; 当前播放列表所包含媒体数<br />currentPlaylist.Item[integer]; 获取或设置指定项目媒体信息，其子属性同wmp.currentMedia<br /><br />//最后是一些很少用到的参数和属性<br />AllowChangeDisplaySize 返回或设置最终用户是否能设置显示尺寸(逻辑型)<br />AllowScan 返回或设置是否允许扫描(逻辑型)<br />AnimationAtStart 返回或设置控件开始播放之前是否先播放一个动画序列(逻辑型)<br />AudioStream 返回或设置音频流的编号(用于多音频流的剪辑，默认为-1)(长整型)<br />AutoRewind 返回或设置媒体文件播放完毕后是否自动回绕(逻辑型)<br />AutoSize 返回或设置是否自动调整控件大小来适应载入的媒体(逻辑型)<br />AutoStart 返回或设置在载入媒体文件之后是否自动开始播放(逻辑型)<br />Balance 返回或设置指定立体声媒体文件的播放声道(-10000为左声道，10000为右声道，0为立体声)(长整型)<br />Bandwidth 返回或设置当前文件的带宽(长整型)<br />BaseURL 返回基本的 HTTP URL(字符串)<br />BufferingCount 返回媒体文件回放时缓冲的总时间(长整型)<br />BufferingProgress 返回缓冲完成的百分比(长整型)<br />BufferingTime 返回缓冲的时间(双精度型)<br />CanPreview 返回或设置当前显示的剪辑是能否被预览(逻辑型)<br />CanScan 返回或设置当前文件是否支持快进或快退(逻辑型)<br />CanSeek 返回或设置当前文件是否能搜索并定位到某个时间(逻辑型)<br />CanSeekToMarkers 返回或设置文件是否支持搜索到标签(逻辑型)<br />CaptioningID 返回在标题中显示的帧或控件的名称(字符串)<br />ChannelDescription 返回电台的描述(字符串)<br />ChannelName 返回电台的名称(字符串)<br />ChannelURL 返回电台的元文件的位置(字符串)<br />ClickToPlay 返回或设置是否可以通过点击图像暂停或播放剪辑(逻辑型)<br />ClientID 返回客户端唯一的标识符(字符串)<br />CodecCount 返回文件使用的可安装的 codecs 的个数(长整型)<br />ContactAddress 返回电台的联系地址(字符串)<br />ContactEmail 返回电台的联系电子邮件地址(字符串)<br />ContactPhone 返回电台的联系电话(字符串)<br />CreationDate 返回剪辑的创建日期(日期型)<br />CurrentMarker 返回或设置当前书签号码(长整型)<br />CurrentPosition 返回或设置剪辑的当前位置(双精度型)<br />CursorType 返回或设置指针类型(长整型)<br />DefaultFrame 返回或设置控件的默认目标 Http 帧(字符串)<br />DisplayBackColor 返回或设置显示面板的背景色(OLE_COLOR 值)<br />DisplayForeColor 返回或设置显示面板的前景色(OLE_COLOR 值)<br />DisplayMode 返回或设置显示面板是否用秒或帧的形式显示当前位置(MPDisplayModeConstants 值)<br />DisplaySize 返回或设置图像显示窗口的大小(MPDisplaySizeConstant 值)<br />Duration 返回或设置剪辑剪辑的播放时间(双精度型)<br />EnableContextMenu 返回或设置是否允许使用上下文菜单(逻辑型)<br />Enabled 返回或设置控件是否可用(逻辑型)<br />EnableFullScreenControls 返回或设置全屏幕控制是否可用(逻辑型)<br />EnablePositionControls 返回或设置位置控制是否可用(逻辑型)<br />EnableTracker 返回或设置搜索栏控制是否可用(逻辑型)<br />ErrorCode 返回当前错误代码(长整型)<br />ErrorCorrection 返回当前剪辑的错误修正类型(长整型)<br />ErrorDescription 返回当前错误的描述(字符串)<br />FileName 返回或设置要播放的剪辑的文件名称(字符串)<br />HasError 返回控件是否发生错误(逻辑型)<br />HasMultipleItems 返回或设置控件是否包含某些多重项目的内容(逻辑型)<br />ImageSourceHeight 返回或设置当前剪辑的原始图像高度(长整型)<br />ImageSourceWidth 返回或设置当前剪辑的原始图像宽度(长整型)<br />InvokeURLs 返回或设置 URL 是否自动发送请求(逻辑型)<br />IsBroadcast 返回或设置源是否进行广播(逻辑型)<br />IsDurationValid 返回或设置持续时间值是否有效(逻辑型)<br />Language 返回或设置用于本地化语言支持的当前区域语言(长整型)<br />LostPackets 返回丢失的数据包数量(长整型)<br />MarkerCount 返回文件书签的数量(长整型)<br />Mute 返回或设置控件是否播放声音(逻辑型)<br />OpenState 返回控件的内容源状态(长整型)<br />PlayCount 返回或设置一个剪辑播放的次数(长整型)<br />PlayState 返回控件的当前操作状态(长整型)<br />PreviewMode 返回或设置控件是否处在预览模式(逻辑型)<br />Rate 返回或设置回放帧频(双精度型)<br />ReadyState 返回控件是否准备就绪(ReadyStateConstant 值)<br />ReceivedPackets 返回已接收到的数据包的数量(长整型)<br />ReceptionQuality 返回最后 30 秒接收到的数据包的百分比(长整型)<br />RecoveredPackets 返回已转换的数据包的数量(长整型)<br />SAMIFileName 返回或设置 closed-captioning 文件名(字符串)<br />SAMILang 返回或设置 closed captioning 语言(字符串)<br />SAMIStyle 返回或设置 closed captioning 风格(字符串)<br />SelectionEnd 返回或设置流的结束位置(双精度型)<br />SelectionStart 返回或设置流的起始位置(双精度型)<br />SendErrorEvents 返回或设置控件是否发送错误事件(逻辑型)<br />SendKeyboardEvents 返回或设置控件是否发送键盘事件(逻辑型)<br />SendMouseClickEvents 返回或设置控件是否发送鼠标单击事件(逻辑型)<br />SendMouseMoveEvents 返回或设置控件是否发送鼠标移动事件(逻辑型)<br />SendOpenStateChangeEvents 返回或设置控件是否发送打开状态改变事件(逻辑型)<br />SendPlayStateChangeEvents 返回或设置控件是否发送播放状态改变事件(逻辑型)<br />SendWarningEvents 返回或设置控件是否发送警告事件(逻辑型)<br />ShowAudioControls 返回或设置是否显示音频控制(逻辑型)<br />ShowCaptioning 返回或设置是否显示字幕(逻辑型)<br />ShowControls 返回或设置控制面板是否可见(逻辑型)<br />ShowDisplay 返回或设置是否显示显示面板(逻辑型)<br />ShowGotoBar 返回或设置是否显示跳转栏(逻辑型)<br />ShowPositionControls 返回或设置是否显示位置控制(逻辑型)<br />ShowStatusBar 返回或设置是否显示状态栏(逻辑型)<br />ShowTracker 返回或设置是否显示搜索栏(逻辑型)<br />SourceLink 返回内容文件的路径(字符串)<br />SourceProtocol 返回用于接收数据的协议(长整型)<br />StreamCount 返回媒体帧的数量(长整型)<br />TransparentAtStart 返回或设置在开始播放之前和停止之后控件是否透明(逻辑型)<br />VideoBorder3D 返回或设置视频边框是否显示为 3D 效果(逻辑型)<br />VideoBorderColor 返回或设置视频边框的颜色(OLE_颜色)<br />VideoBorderWidth 返回或设置视频边框的宽度(长整型)<br />Volume 返回或设置音量(长整型)</div>
				</div>
		</div>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/61344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-10 14:50 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/10/61344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关客户端浏览器缓存的Http头介绍</title><link>http://www.cnitblog.com/seeyeah/archive/2009/07/10/59991.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Fri, 10 Jul 2009 03:08:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/07/10/59991.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/59991.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/07/10/59991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/59991.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/59991.html</trackback:ping><description><![CDATA[
		<p>做网站开发离不开缓存，缓存分好多种：服务器缓存，第三方缓存，浏览器缓存等。其中浏览器缓存是代价最小的，因为浏览器缓存依赖的是客户端，而几乎不耗费服务器端的资源。</p>
		<p>让浏览器做缓存需要给浏览器发送指定的Http头，告诉浏览器缓存多长时间，或者坚决不要缓存。作为.net的程序员，其实我们一直都在用这种方法，在OutputCache指令中指定缓存的Location为Client时，其实就是给浏览器发送了一个Http头，告诉浏览器这个Url要缓存多长时间，最后修改的时间。</p>
		<p>微软在OutputCacheModule中对这些缓存用到的Http头给我们进行了很好的封装，但是了解这些Http头可以更灵活的使用它们。</p>
		<p>和客户端缓存相关的Http头有以下几个，分别是：<br /><strong>1. Expires:+过期时间</strong><br />表示在指定时间后浏览器缓存失效，需要注意的是这儿的过期时间必须是HTTP格式的日期时间，其他的都会被解析成当前时间“之前”，缓存会马上过期，HTTP的日期时间必须是格林威治时间（GMT），而不是本地时间。举例： <br />Expires: Fri, 30 Oct 2009 14:19:41</p>
		<p>使用Expires过期必须要求服务器的时间是正确的，否则发送的http头就会出问题，在windows服务下可以设置时间服务器来同步时间<br /><strong>2. Cache-control: <br /></strong>Cache-control直译成中文就是缓存控制，它的作用就是缓存控制，这个http头的值有几种。<br />1) max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间，这个参数是基于请求时间的相对时间间隔，而不是绝对过期时间，[秒]是一个数字，单位是秒：从请求时间开始到过期时间之间的秒数。 <br />2) s-maxage=[秒] — 类似于max-age属性，除了他应用于共享（如：代理服务器）缓存 <br />3) public — 标记认证内容也可以被缓存，一般来说： 经过HTTP认证才能访问的内容，输出是自动不可以缓存的； <br />4) no-cache — 强制每次请求直接发送给源服务器，而不经过本地缓存版本的校验。这对于需要确认认证应用很有用（可以和public结合使用），或者严格要求使用最新数据的应用（不惜牺牲使用缓存的所有好处）； <br />5) no-store — 强制缓存在任何情况下都不要保留任何副本 <br />6) must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的，HTTP允许缓存在某些特定情况下返回过期数据，指定了这个属性，你高速缓存，你希望严格的遵循你的规则。 <br />7) proxy-revalidate — 和 must-revalidate类似，除了他只对缓存代理服务器起作用 <br />举例:<br />Cache-Control: max-age=3600, must-revalidate </p>
		<p>很显然Cache-control可以提供比Expires更灵活的缓存控制，而且它不需要依赖于服务器时间。<br />在Asp.Net中微软把对Cache-control属性的设置封装到了HttpCachePolicy类中，我们可以通过Response.Cache来调用以下方法来做到对Cache-Control Http头值的控制：<br />Response.CacheControl;<br />Response.Cache.SetNoStore<br />Response.Cache.SetMaxAge<br />Response.Cache.SetProxyMaxAge<br />Response.Cache.SetRevalidation<br />            <br /><strong>3. Last-Modified/If-Modified-Since <br /></strong>这两个Http头是一对，前者表示某个地址的最近更新时间，是服务器端响应给客户端的；而后者是客户端浏览器发送给服务器的，告诉web服务器客户端有一个最后更改时间为什么时间的缓存，服务器端接收到If-Modified-Since头后则判断客户端缓存的这份url地址的缓存是否是最新的，如果是最新的则服务器端直接给客户端返回HttpStatus 304，意思是说这个内容在你上次请求之后没有变化过，你直接用缓存就可以了；如果服务器发现url的最后更新时间比If-Modified-Since 的值要新，则会输出新的内容。</p>
		<p>同样微软也为我们做了服务器端设置的封装，我们可以这样调用<br />Response.Cache.SetLastModified(DateTime)<br />Response.Cache.SetLastModifiedFromFileDependencies()</p>
		<p>如果有更复杂的需求就需要自己处理了。</p>
		<p>
				<strong>4. ETag/If-None-Match</strong>
				<br />ETag和Last-Modified类似，不过他发送的是一个字符串来标示url的版本，如果url变了则此标示也跟着变化，在浏览器发送If-None-Match时告诉浏览器内容已经变了，或者没变可以使用缓存。</p>
		<p>Iis会自动给静态文件加上Etag，在文件发生改变时重新生成一个Etag，这样对于一个网站中的n多个静态文件如：样式表，小图片等，客户端只下载一次就够了，可以减轻负载。</p>
		<p>在Asp.Net中我们可以用以下两个方法来设置<br />Response.Cache.SetETag(string)<br />Response.Cache.SetETagFromFileDependencies()</p>
		<p>尽管微软为我们做了很多封装，但是我们还是需要详细的了解之后才可以用好这几个Http头。</p>
		<div id="MySignature">
				<hr color="#f0f0f0" noshade="" size="1" />
				<p>请尊重作者的劳动，转载请保留链接 <a href="http://www.cnblogs.com/yukaizhao/">玉开的技术博客</a>   </p>
		</div>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/59991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-07-10 11:08 <a href="http://www.cnitblog.com/seeyeah/archive/2009/07/10/59991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【摘至网上】Sql2005获取表结构</title><link>http://www.cnitblog.com/seeyeah/archive/2009/05/23/58722.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sat, 23 May 2009 10:22:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/05/23/58722.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/58722.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/05/23/58722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/58722.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/58722.html</trackback:ping><description><![CDATA[
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: rgb(0, 0, 255);">SELECT</span>
				<span style="color: rgb(0, 0, 0);">  <br />表名               </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">CASE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">WHEN</span>
				<span style="color: rgb(0, 0, 0);">   A.COLORDER</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">1</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">THEN</span>
				<span style="color: rgb(0, 0, 0);">   D.NAME   </span>
				<span style="color: rgb(0, 0, 255);">ELSE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">END</span>
				<span style="color: rgb(0, 0, 0);">,<br />表說明           </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">CASE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">WHEN</span>
				<span style="color: rgb(0, 0, 0);">   A.COLORDER</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">1</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">THEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">ISNULL</span>
				<span style="color: rgb(0, 0, 0);">(F.VALUE, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">)   </span>
				<span style="color: rgb(0, 0, 255);">ELSE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">END</span>
				<span style="color: rgb(0, 0, 0);">,<br />欄位序號       </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   A.COLORDER,<br />欄位名           </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   A.NAME,<br />標識               </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">CASE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">WHEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">COLUMNPROPERTY</span>
				<span style="color: rgb(0, 0, 0);">(   A.ID,A.NAME, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">ISIDENTITY </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">)</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">1</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">THEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">√ </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 255);">ELSE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">END</span>
				<span style="color: rgb(0, 0, 0);">,<br />主鍵               </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">CASE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">WHEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(128, 128, 128);">EXISTS</span>
				<span style="color: rgb(0, 0, 0);">(</span>
				<span style="color: rgb(0, 0, 255);">SELECT</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">1</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">FROM</span>
				<span style="color: rgb(0, 0, 0);">   SYSOBJECTS   </span>
				<span style="color: rgb(0, 0, 255);">WHERE</span>
				<span style="color: rgb(0, 0, 0);">   XTYPE</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">PK </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   PARENT_OBJ</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">A.ID   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   NAME   </span>
				<span style="color: rgb(128, 128, 128);">IN</span>
				<span style="color: rgb(0, 0, 0);">   (<br /></span>
				<span style="color: rgb(0, 0, 255);">SELECT</span>
				<span style="color: rgb(0, 0, 0);">   NAME   </span>
				<span style="color: rgb(0, 0, 255);">FROM</span>
				<span style="color: rgb(0, 0, 0);">   SYSINDEXES   </span>
				<span style="color: rgb(0, 0, 255);">WHERE</span>
				<span style="color: rgb(0, 0, 0);">   INDID   </span>
				<span style="color: rgb(128, 128, 128);">IN</span>
				<span style="color: rgb(0, 0, 0);">(<br /></span>
				<span style="color: rgb(0, 0, 255);">SELECT</span>
				<span style="color: rgb(0, 0, 0);">   INDID   </span>
				<span style="color: rgb(0, 0, 255);">FROM</span>
				<span style="color: rgb(0, 0, 0);">   SYSINDEXKEYS   </span>
				<span style="color: rgb(0, 0, 255);">WHERE</span>
				<span style="color: rgb(0, 0, 0);">   ID   </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   A.ID   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   COLID</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">A.COLID)))   </span>
				<span style="color: rgb(0, 0, 255);">THEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">√ </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">ELSE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">END</span>
				<span style="color: rgb(0, 0, 0);">,<br />類型               </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   B.NAME,<br />佔用位元組數   </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   A.LENGTH,<br />長度               </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">COLUMNPROPERTY</span>
				<span style="color: rgb(0, 0, 0);">(A.ID,A.NAME, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">PRECISION </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">),<br />小數位數       </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">ISNULL</span>
				<span style="color: rgb(0, 0, 0);">(</span>
				<span style="color: rgb(255, 0, 255);">COLUMNPROPERTY</span>
				<span style="color: rgb(0, 0, 0);">(A.ID,A.NAME, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">SCALE </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">),</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">0</span>
				<span style="color: rgb(0, 0, 0);">),<br />允許空           </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">CASE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">WHEN</span>
				<span style="color: rgb(0, 0, 0);">   A.ISNULLABLE</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">1</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">THEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">√ </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 255);">ELSE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">END</span>
				<span style="color: rgb(0, 0, 0);">,<br />預設值           </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">ISNULL</span>
				<span style="color: rgb(0, 0, 0);">(E.</span>
				<span style="color: rgb(0, 0, 0); font-weight: bold;">TEXT</span>
				<span style="color: rgb(0, 0, 0);">, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">),<br />欄位說明       </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">ISNULL</span>
				<span style="color: rgb(0, 0, 0);">(G.</span>
				<span style="color: rgb(255, 0, 0);">[</span>
				<span style="color: rgb(255, 0, 0);">VALUE</span>
				<span style="color: rgb(255, 0, 0);">]</span>
				<span style="color: rgb(0, 0, 0);">, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">)<br /></span>
				<span style="color: rgb(0, 0, 255);">FROM</span>
				<span style="color: rgb(0, 0, 0);">  <br />SYSCOLUMNS   A<br /></span>
				<span style="color: rgb(255, 0, 255);">LEFT</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">JOIN</span>
				<span style="color: rgb(0, 0, 0);">  <br />SYSTYPES   B  <br /></span>
				<span style="color: rgb(0, 0, 255);">ON</span>
				<span style="color: rgb(0, 0, 0);">  <br />A.XUSERTYPE</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">B.XUSERTYPE<br /></span>
				<span style="color: rgb(0, 0, 255);">INNER</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">JOIN</span>
				<span style="color: rgb(0, 0, 0);">  <br />SYSOBJECTS   D  <br /></span>
				<span style="color: rgb(0, 0, 255);">ON</span>
				<span style="color: rgb(0, 0, 0);">  <br />A.ID</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">D.ID     </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   D.XTYPE</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">U </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">     D.NAME </span>
				<span style="color: rgb(128, 128, 128);">&lt;&gt;</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">DTPROPERTIES </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
				</span>
				<span style="color: rgb(255, 0, 255);">LEFT</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">JOIN</span>
				<span style="color: rgb(0, 0, 0);">  <br />SYSCOMMENTS   E  <br /></span>
				<span style="color: rgb(0, 0, 255);">ON</span>
				<span style="color: rgb(0, 0, 0);">  <br />A.CDEFAULT</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">E.ID<br /></span>
				<span style="color: rgb(255, 0, 255);">LEFT</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">JOIN</span>
				<span style="color: rgb(0, 0, 0);">  <br />sys.extended_properties   G  <br /></span>
				<span style="color: rgb(0, 0, 255);">ON</span>
				<span style="color: rgb(0, 0, 0);">  <br />A.ID</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">G.major_id   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   A.COLID</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">G.minor_id    <br /></span>
				<span style="color: rgb(255, 0, 255);">LEFT</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">JOIN</span>
				<span style="color: rgb(0, 0, 0);">  <br />sys.extended_properties   F  <br /></span>
				<span style="color: rgb(0, 0, 255);">ON</span>
				<span style="color: rgb(0, 0, 0);">  <br />D.ID</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">F.major_id   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   F.minor_id</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">0</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
				</span>
				<span style="color: rgb(0, 128, 128);">--</span>
				<span style="color: rgb(0, 128, 128);">where   d.name='pa_T_FORM_FI'         --如果只查询指定表,加上此条件  </span>
				<span style="color: rgb(0, 128, 128);">
						<br />
				</span>
				<span style="color: rgb(0, 0, 255);">ORDER</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">BY</span>
				<span style="color: rgb(0, 0, 0);">  <br />A.ID,A.COLORDER </span>
		</div>
		<br />
<img src ="http://www.cnitblog.com/seeyeah/aggbug/58722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-05-23 18:22 <a href="http://www.cnitblog.com/seeyeah/archive/2009/05/23/58722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在C#中生成指定长度的随机字符</title><link>http://www.cnitblog.com/seeyeah/archive/2009/05/12/57119.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Tue, 12 May 2009 02:30:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/05/12/57119.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/57119.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/05/12/57119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/57119.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/57119.html</trackback:ping><description><![CDATA[
		<p>摘至：http://www.cnblogs.com/nclly/archive/2008/12/19/1357961.html<br /></p>
		<p>
				<br />
		</p>
		<p>///&lt;summary&gt;<br />
///得到随机字符.<br />
///&lt;/summary&gt;<br />
///&lt;param name="intLength"&gt;Length of the int.&lt;/param&gt;<br />
///&lt;param name="booNumber"&gt;if set to &lt;c&gt;true&lt;/c&gt; [boo number].&lt;/param&gt;<br />
///&lt;param name="booSign"&gt;if set to &lt;c&gt;true&lt;/c&gt; [boo sign].&lt;/param&gt;<br />
///&lt;param name="booSmallword"&gt;if set to &lt;c&gt;true&lt;/c&gt; [boo smallword].&lt;/param&gt;<br />
///&lt;param name="booBigword"&gt;if set to &lt;c&gt;true&lt;/c&gt; [boo bigword].&lt;/param&gt;<br />
///&lt;returns&gt;&lt;/returns&gt;<br />
public string getRandomizer(int intLength, bool booNumber, bool booSign, bool booSmallword, bool booBigword)<br />
{<br />
 //定义<br />
 Random ranA = new Random();<br />
 int intResultRound = 0;<br />
 int intA = 0;<br />
 string strB = "";<br />
 while (intResultRound &lt; intLength)<br />
 {<br />
  //生成随机数A，表示生成类型<br />
  //1=数字，2=符号，3=小写字母，4=大写字母<br />
  intA = ranA.Next(1, 5);<br />
  //如果随机数A=1，则运行生成数字<br />
  //生成随机数A，范围在0-10<br />
  //把随机数A，转成字符<br />
  //生成完，位数+1，字符串累加，结束本次循环<br />
  if (intA == 1 &amp;&amp; booNumber)<br />
  {<br />
   intA = ranA.Next(0, 10);<br />
   strB = intA.ToString() + strB;<br />
   intResultRound = intResultRound + 1;<br />
   continue;<br />
  }<br />
  //如果随机数A=2，则运行生成符号<br />
  //生成随机数A，表示生成值域<br />
  //1：33-47值域，2：58-64值域，3：91-96值域，4：123-126值域<br />
  if (intA == 2 &amp;&amp; booSign == true)<br />
  {<br />
   intA = ranA.Next(1, 5);<br />
   //如果A=1<br />
   //生成随机数A，33-47的Ascii码<br />
   //把随机数A，转成字符<br />
   //生成完，位数+1，字符串累加，结束本次循环<br />
   if (intA == 1)<br />
   {<br />
    intA = ranA.Next(33, 48);<br />
    strB = ((char)intA).ToString() + strB;<br />
    intResultRound = intResultRound + 1;<br />
    continue;<br />
   }</p>
		<p>   //如果A=2<br />
   //生成随机数A，58-64的Ascii码<br />
   //把随机数A，转成字符<br />
   //生成完，位数+1，字符串累加，结束本次循环<br />
   if (intA == 2)<br />
   {<br />
    intA = ranA.Next(58, 65);<br />
    strB = ((char)intA).ToString() + strB;<br />
    intResultRound = intResultRound + 1;<br />
    continue;<br />
   }</p>
		<p>   //如果A=3<br />
   //生成随机数A，91-96的Ascii码<br />
   //把随机数A，转成字符<br />
   //生成完，位数+1，字符串累加，结束本次循环<br />
   if (intA == 3)<br />
   {<br />
    intA = ranA.Next(91, 97);<br />
    strB = ((char)intA).ToString() + strB;<br />
    intResultRound = intResultRound + 1;<br />
    continue;<br />
   }</p>
		<p>   //如果A=4<br />
   //生成随机数A，123-126的Ascii码<br />
   //把随机数A，转成字符<br />
   //生成完，位数+1，字符串累加，结束本次循环<br />
   if (intA == 4)<br />
   {<br />
    intA = ranA.Next(123, 127);<br />
    strB = ((char)intA).ToString() + strB;<br />
    intResultRound = intResultRound + 1;<br />
    continue;<br />
   }<br />
  }</p>
		<p>  //如果随机数A=3，则运行生成小写字母<br />
  //生成随机数A，范围在97-122<br />
  //把随机数A，转成字符<br />
  //生成完，位数+1，字符串累加，结束本次循环<br />
  if (intA == 3 &amp;&amp; booSmallword == true)<br />
  {<br />
   intA = ranA.Next(97, 123);<br />
   strB = ((char)intA).ToString() + strB;<br />
   intResultRound = intResultRound + 1;<br />
   continue;<br />
  }</p>
		<p>  //如果随机数A=4，则运行生成大写字母<br />
  //生成随机数A，范围在65-90<br />
  //把随机数A，转成字符<br />
  //生成完，位数+1，字符串累加，结束本次循环<br />
  if (intA == 4 &amp;&amp; booBigword == true)<br />
  {<br />
   intA = ranA.Next(65, 89);<br />
   strB = ((char)intA).ToString() + strB;<br />
   intResultRound = intResultRound + 1;<br />
   continue;<br />
  }<br />
 }<br />
 return strB;<br />
}</p>
		<p>//随机字符串生成器的主要功能如下： <br />
//1、支持自定义字符串长度<br />
//2、支持自定义是否包含数字<br />
//3、支持自定义是否包含小写字母<br />
//4、支持自定义是否包含大写字母<br />
//5、支持自定义是否包含特殊符号<br />
//6、支持自定义字符集</p>
		<p>///&lt;summary&gt;<br />
///生成随机字符串<br />
///&lt;/summary&gt;<br />
///&lt;param name="length"&gt;目标字符串的长度&lt;/param&gt;<br />
///&lt;param name="useNum"&gt;是否包含数字，1=包含，默认为包含&lt;/param&gt;<br />
///&lt;param name="useLow"&gt;是否包含小写字母，1=包含，默认为包含&lt;/param&gt;<br />
///&lt;param name="useUpp"&gt;是否包含大写字母，1=包含，默认为包含&lt;/param&gt;<br />
///&lt;param name="useSpe"&gt;是否包含特殊字符，1=包含，默认为不包含&lt;/param&gt;<br />
///&lt;param name="custom"&gt;要包含的自定义字符，直接输入要包含的字符列表&lt;/param&gt;<br />
///&lt;returns&gt;指定长度的随机字符串&lt;/returns&gt;<br />
public string GetRnd(int length, bool useNum, bool useLow, bool useUpp, bool useSpe, string custom)<br />
{<br />
 byte[] b = new byte[4];<br />
 new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);<br />
 Random r = new Random(BitConverter.ToInt32(b, 0));<br />
 string s = null, str = custom;<br />
 if (useNum == true) { str += "0123456789"; }<br />
 if (useLow == true) { str += "abcdefghijklmnopqrstuvwxyz"; }<br />
 if (useUpp == true) { str += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; }<br />
 if (useSpe == true) { str += "!\"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\\]^_`{|}~"; }<br />
 for (int i = 0; i &lt; length; i++)<br />
 {<br />
  s += str.Substring(r.Next(0, str.Length - 1), 1);<br />
 }<br />
 return s;<br />
}</p>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/57119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-05-12 10:30 <a href="http://www.cnitblog.com/seeyeah/archive/2009/05/12/57119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】Sql2005 实现递归</title><link>http://www.cnitblog.com/seeyeah/archive/2009/03/25/55749.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Wed, 25 Mar 2009 13:26:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/03/25/55749.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/55749.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/03/25/55749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/55749.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/55749.html</trackback:ping><description><![CDATA[现有数据结构如下图所示<br /><br /><img height="211" alt="sqlsnap1.jpg" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/sql1/sqlsnap1.jpg" width="380" border="0" /><br /><br />由U和U2，2个栏位，可以看出此示例数据表示着2条“链”。<br /><br />1、A =》B=》C=》D=》E<br />2、A1=》B1=》C1<br /><br />要搜出这样的数据，oracle有“connect by... start with”来遍历树结构，避免了写递归函数。<br /><br />SQL2005没有对应的函数，但使用SQL2005提供的CTE（Common Table Expression）可以实现“connect by... start with”的遍历。<br /><br />假设我们要找出第一条“链”（A =》B=》C=》D=》E）<br />Sql实现：<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">with</span><span style="COLOR: #000000"> custom_cte_query(id,u,u2)<br /></span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"><br />(<br />    </span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">起始条件</span><span style="COLOR: #008080"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> id,u,u2 <br />    </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> cte_test<br />    </span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> u </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">A</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">union</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">all</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">递归条件</span><span style="COLOR: #008080"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> a.id,a.u,a.u2<br />    </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> cte_test a<br />    </span><span style="COLOR: #0000ff">inner</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> <br />    custom_cte_query b<br />    </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> (a.u </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> b.u2)<br />)<br /><br /></span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> custom_cte_query</span></div><br />执行获得结果<br /><img height="138" alt="sqlsnap2.jpg" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/sql1/sqlsnap2.jpg" width="147" border="0" /><br /><br />参考： 
<div class="title">1、<a href="http://msdn.microsoft.com/zh-cn/library/ms186243(SQL.90).aspx" target="_blank">使用公用表表达式的递归查询<!----></a><br />2、<a href="http://msdn.microsoft.com/zh-cn/library/ms190766(SQL.90).aspx" target="_blank">使用公用表表达式</a></div><!--Content type: DocStudio. Transform: devdiv2mtps.xslt.--><img src ="http://www.cnitblog.com/seeyeah/aggbug/55749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-03-25 21:26 <a href="http://www.cnitblog.com/seeyeah/archive/2009/03/25/55749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分享 Threading in C# - Free E-book</title><link>http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Fri, 20 Mar 2009 02:29:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/55575.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/55575.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/55575.html</trackback:ping><description><![CDATA[
		<b>
				<u>
						<a target="_blank" href="http://www.albahari.com/threading/">Threading in C# </a>
				</u>
		</b>
		<br />
		<br />By <b>Joseph Albahari</b><br /><br /><b><u><a href="http://www.albahari.com/threading/threading.pdf">Download PDF</a></u></b><br /><img src ="http://www.cnitblog.com/seeyeah/aggbug/55575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-03-20 10:29 <a href="http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>