<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_路过秋天</title><subtitle type="text">同样的3年，有的人从学生到当了MVP了，而我却在原地，卖弄当年的代码，秋天的风，有点凄，有点凉！</subtitle><id>http://feed.cnblogs.com/blog/u/20967/rss</id><updated>2012-05-30T11:33:32Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/20967/rss"/><entry><id>http://www.cnblogs.com/cyq1162/archive/2012/05/30/2526573.html</id><title type="text">C# Aop简单扫盲及ORM实体类属性拦截示例</title><summary type="text">先说下场景，C#中为什么要使用Aop，而我又是在哪里使用Aop?本人只是想拦截实体类的Set的方法，然后在Set之前，调用一下其它方法，把值赋给另一个对象。而我做的都是在实体类的基类里处理：比如：public class OrmBase让所有继承这个基类的实体类都具有Orm操作功能，再加上一个小小特殊的要求处理，属性Set时，需要对另一对象赋值。如果说，我这样实现：在OrmBase中可以提供方法，让所有的子类的属性都这样操作：</summary><published>2012-05-30T09:22:00Z</published><updated>2012-05-30T09:22:00Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cyq1162/archive/2012/05/30/2526573.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/archive/2012/05/30/2526573.html"/><content type="html">&lt;span class="Apple-style-span" style="font-family: verdana, sans-serif; font-size: 12px; line-height: 18px; "&gt;&lt;strong&gt;先说下场景，C#中为什么要使用Aop，而我又是在哪里使用Aop?&lt;/strong&gt;&lt;div&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;本人只是想拦截实体类的Set的方法，然后在Set之前，调用一下其它方法，把值赋给另一个对象。&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;而我做的都是在实体类的基类里处理：&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;比如：&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;public class&amp;nbsp;&lt;a href="http://www.cyqdata.com/cyqdata" target="_blank" style="text-decoration: none; color: #336699; "&gt;OrmBase&lt;/a&gt;&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong style="color: #000000; "&gt;让所有继承这个基类的实体类都具有&lt;a href="http://www.cyqdata.com/cyqdata" title="cyq.data" target="_blank"&gt;Orm&lt;/a&gt;操作功能，再加上一个小小特殊的要求处理，属性Set时，需要对另一对象赋值。&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;如果说，我这样实现：在OrmBase中可以提供方法，让所有的子类的属性都这样操作：&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="background-color: #f5f5f5; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; font-family: 'Courier New'; font-size: 13px; overflow-x: auto; overflow-y: auto; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "&gt;&lt;div&gt;public class Users：OrmBase&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;public int _ID;&lt;/div&gt;&lt;div&gt;public int ID&amp;nbsp;&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;get;&lt;/div&gt;&lt;div&gt;set&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; base.SetXX(value);&lt;/div&gt;&lt;div&gt;&amp;nbsp;}&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;不过每个实体都这样写，虽然是啥没问题，不过能简化的还是简化。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在能追求简洁的世界里，当然更喜欢简洁的写法如：&lt;/p&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px; line-height: 18px; "&gt;&lt;strong&gt;public int ID {get;set;}&lt;/strong&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: verdana, sans-serif; font-size: 12px; line-height: 18px; "&gt;&lt;p&gt;因此，直接在基类里直接拦截子类set方法，在里面直接调用SetXX就搞定了，如何实现呢？又花了一天的时间查资料研究学习并实现。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;为此，要拦截，就得折腾Aop：&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;传统的Aop使用RealProxy，使用非常简单，但是被忽悠的非常复杂，下面：&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;1：在要拦截的类头上加个属性标识，同时继承自ContextBoundObject：&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="background-color: #f5f5f5; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; font-family: 'Courier New'; font-size: 13px; overflow-x: auto; overflow-y: auto; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "&gt;&lt;div&gt;[AopAttribute]&lt;/div&gt;&lt;div&gt;public class OrmBase:ContextBoundObject&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;OK,在基类里加一个，这样所有子类也算被附加了，加上一个标识，就可以被拦截了，那这个AopAttribute属性是啥？看下面&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;2：AopAttribute继承代理属性标识类，用来挂在要拦截的类的头上：&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="background-color: #f5f5f5; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; font-family: 'Courier New'; font-size: 13px; overflow-x: auto; overflow-y: auto; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; class AopAttribute : ProxyAttribute&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public override MarshalByRefObject CreateInstance(Type serverType)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AopProxy realProxy = new AopProxy(serverType);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return realProxy.GetTransparentProxy() as MarshalByRefObject;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;看，里面就两行，非常简单，中间调用了继承RealProxy的AopProxy类，AopProxy是什么，怎么出来的？看下面&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;3：AopProxy类，就是拦截的消息处理，先上个简单版，免的大伙看不懂：&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="background-color: #f5f5f5; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; font-family: 'Courier New'; font-size: 13px; overflow-x: auto; overflow-y: auto; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;class AopProxy : RealProxy&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public AopProxy(Type serverType)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : base(serverType)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public override IMessage Invoke(IMessage msg)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //消息拦截之后，就会执行这里的方法。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;OK，简单吧，就这么两个类，就可以实现拦截了，不过重点就是这里拦截之后的代码，稍为复杂点，一般照抄就行了，拦截的代码如下：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="background-color: #f5f5f5; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; font-family: 'Courier New'; font-size: 13px; overflow-x: auto; overflow-y: auto; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "&gt;&lt;p&gt;&amp;nbsp;if (msg is IConstructionCallMessage) // 如果是构造函数，按原来的方式返回即可。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return constructionReturnMessage;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if (msg is IMethodCallMessage) //如果是方法调用（属性也是方法调用的一种）&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IMethodCallMessage callMsg = msg as IMethodCallMessage;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; object[] args = callMsg.Args;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IMessage message;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (callMsg.MethodName.StartsWith("set_") &amp;amp;&amp;amp; args.Length == 1)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //这里检测到是set方法，然后应怎么调用对象的其它方法呢？&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; object o = callMsg.MethodBase.Invoke(GetUnwrappedServer(), args);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; message = new ReturnMessage(o, args, args.Length, callMsg.LogicalCallContext, callMsg);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch (Exception e)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; message = new ReturnMessage(e, callMsg);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return message;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return msg;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;为了调用原始对象的其它方法，我花了近一天的时间查资料，可惜网络上并没有相应的信息，多数的人应用，都是引向一个其它方法（一个不需要调用原始对象的方法）&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;目前网络上Aop信息太少，C#的更少，关于如何获取原始对象，然后调用原始对象的，找不到一篇相关文章，我特纠结。&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;于是，我按传统方式，想尽办法的想获取到原始对象，再调用，经过九九八十一招，还是失败了。&lt;/p&gt;&lt;p&gt;（一开始是想：通过反射从类型再创建一个实体这种不靠谱的尝试： 造成死循环，每次new拦截，在拦截里又new）&lt;/p&gt;&lt;p&gt;中间省一大堆......痛苦的经历和尝试.......&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font class="Apple-style-span" color="#ff0000"&gt;只要用心想，方法总有的，最终还是被我发现了：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1：获取要调用的方法：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在构造函数中，根据传进来的serverType，获取到SetXX的方法MethodInfo：&lt;/p&gt;&lt;p&gt;method = serverType.GetMethod("SetXX", BindingFlags.NonPublic | BindingFlags.Instance);&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2：在拦截方法中调用：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="background-color: #f5f5f5; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; font-family: 'Courier New'; font-size: 13px; overflow-x: auto; overflow-y: auto; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "&gt;&lt;p&gt;&amp;nbsp;if (callMsg.MethodName.StartsWith("set_") &amp;amp;&amp;amp; args.Length == 1)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;method.Invoke(GetUnwrappedServer(), new object[] { callMsg.MethodName.Substring(4), args[0] });//对属性进行调用&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;过程很复杂，尝试过N百种方式，结果很简单，分享很重要！&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为此，解决了ORM对子类的属性拦截，并实现了在属性赋值时调用实例其它方法。&lt;/p&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/cyq1162/aggbug/2526573.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2012/05/30/2526573.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cyq1162/archive/2012/05/21/2511025.html</id><title type="text">DBImport v3.0 中文版发布：支持各大数据库数据互导（IT人员必备工具）</title><summary type="text">DBImport 适合人群：IT人士、站长、及和数据库打交首的相关相关人员。只要你是开发者，难免会与数据库打交道，而且，随着项目的不同，接触的数据库也会不同，不管是你项目需要支持多种数据库切换、还是项目需要进行平台的移值，或者是其它因素；你最终都得各种数据库间折腾来折腾去，而折腾的背后，就是需要一个好的工具还节省你大量的时间。</summary><published>2012-05-20T17:25:00Z</published><updated>2012-05-20T17:25:00Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cyq1162/archive/2012/05/21/2511025.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/archive/2012/05/21/2511025.html"/><content type="html">&lt;p&gt;&lt;strong&gt;事隔一年，做为进军海外的&lt;a href="http://www.cyqdata.com/dbimport" target="_blank" title="dbimport 数据库互导工具"&gt;&lt;span style="color: #000000; "&gt;CYQ.DBImport&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;strong style="color: #000000; "&gt; &lt;/strong&gt;&lt;strong&gt;数据库工具，终于发布新版本：&lt;a href="http://www.cyqdata.com/dbimport" title="dbimport" target="_blank"&gt;&lt;span style="color: #000000; "&gt;DBImport&lt;/span&gt;&lt;/a&gt; V3.0。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为了广大国内同胞用的舒心，本次发布中文版本（V1、V2版本为英文版），同时去掉了个人商标CYQ前缀。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;另外，本版本内置未面世版&lt;a href="http://www.cyqdata.com/cyqdata" target="_blank" title="cyq.data"&gt;&lt;span style="color: #000000; "&gt;CYQ.Data&lt;/span&gt;&lt;/a&gt; V5内核。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #000000; "&gt;&lt;a href="http://www.cyqdata.com/dbimport" title="dbimport" target="_blank"&gt;&lt;span style="color: red; "&gt;DBImport&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="color: red; "&gt;适合人群：IT人士、站长、及和数据库打交首的相关相关人员。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;只要你是开发者，难免会与数据库打交道，而且，随着项目的不同，接触的数据库也会不同，&lt;br /&gt;不管是你项目需要支持多种数据库切换、还是项目需要进行平台的移值，或者是其它因素；&lt;br /&gt;你最终都得各种数据库间折腾来折腾去，而折腾的背后，就是需要一个好的工具还节省你大量的时间。&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;导数据，不是MSSQL数据库自带工具？Oracle不是自带？navicat For SQLite不是自带？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;别扯了，那些都不靠谱，&amp;nbsp;局限性太大，要是靠谱的话，网上也不会出来其它的导数据库工具了。&lt;br /&gt;要是网上那些靠谱能用，程序员也不用苦逼的自己写代码东导西导了，当年偶也不用折腾CYQ.DBImport工具出来了。&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;由于事隔一年，这里重新介绍下功能：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;：支持各大数据库的数据互导（Txt、Xml、Excel、Access、Mssql、Sqlite、MySql、Oracle）&lt;br /&gt;简单说你可以从一种数据库任意导到其它任意一种数据库，随你喜欢。&lt;/div&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;：支持数据库脚本导出：同样，随便从一种数据库导出成不同数据库的脚本。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;：支持数据库设置文档导出：同理，Access也能导出Oracle版的数据库设置文档。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;功能就上面三个，看似简单，其实不简单，要知道各数据兼容性的工作量有多大，这是集了多年的经验累职出来的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;界面依旧保持早期版本的风格，如下图：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.cyqdata.com/Upload/Editor/20120517/054751.jpg" width="816" height="555" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;由于都是IT人士，这么简单的操作，就不一步一步教了，以大伙的情商，一个界面的操作，小CASE了。&lt;/p&gt;&lt;p&gt;非要看的话，请看V2.0的操作步骤，见：&lt;span class="Apple-style-span" style="font-family: verdana; font-weight: bold; "&gt;&lt;a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/cyq1162/archive/2011/05/27/2060307.html" style="border-bottom-style: dotted; border-bottom-width: 0px; border-bottom-color: #efefef; padding-bottom: 10px; color: #78afd3; text-decoration: none; "&gt;CYQ.DBImport 数据库反向工程及批量导数据库工具 V2.0 发布[增加批量导出数据库脚本及数据库设计文档]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;本次版的改进：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;：以中文版本发布（早期V1和V2为英文版）&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;：借力CYQ.Data&amp;nbsp;V5强力框架、数据互导更流畅、出错率更低，兼容性更高,由于V5的引进，支持的数据库类型增加两个：文本(json格式)及Xml。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;：增加异常处理，避免软件遇到bug自动退出。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;：调整共享机制，取消原版本的账号注册及功能限制，变更为时间限制。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;：修正首列非&amp;#8220;ID&amp;#8221;列的兼容性问题。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800080;"&gt;6&lt;/span&gt;：其它不便公开的代码及机制改进。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800080;"&gt;7&lt;/span&gt;：其它请见下载后里的使用前说明。&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;另外给大伙补一段，获取不同数据库的表结构的区别代码：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一般调用表结构，可以用DBConnection.GetSchema（string&amp;nbsp;connectionName,string[] restrictionValues）方式：&lt;/p&gt;&lt;p&gt;而获取表的参数，稍有不同：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;connectionName，为：Tables&lt;br /&gt;另一个参数，各大数据库各不同，如下：&amp;nbsp;&lt;br /&gt;Access与SQLite：&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TABLE&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;MSSQL：&amp;nbsp;restrict&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BASE&amp;nbsp;TABLE&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;};&amp;nbsp;&lt;br /&gt;Oracle：&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&amp;#8220;登陆的用户名&amp;#8221;};&lt;br /&gt;MySql：&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;,&amp;nbsp;&amp;#8220;数据库名称&amp;#8221;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BASE&amp;nbsp;TABLE&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;};&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;因此，要兼容一些事情，要处理的事情比较多，有兴趣的自己多在各大数据库间折腾折腾。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;另外一边写文，一边在和四只蚊子对战，刚灭了三只，还有一只，不怕死的来来去，可惜还是被跑了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cyqdata.com/download/article-detail-42517" target="_blank" title="dbimport下载"&gt;&lt;span style="color: #000000; "&gt;DBImport V3.0&lt;/span&gt;&lt;/a&gt;下载地址：&lt;a href="http://www.cyqdata.com/download/article-detail-42517"&gt;http://www.cyqdata.com/download/article-detail-42517&lt;/a&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;另外：（评论里楼层尾数为0的，可以发邮件到contact@cyqdata.com，向作者免费索取注册码）&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cyq1162/aggbug/2511025.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2012/05/21/2511025.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cyq1162/archive/2012/05/12/2496501.html</id><title type="text">JS编辑器获取选择内容的HTML多浏览器兼容性写法（支持Chorme、Firefox）</title><summary type="text">昨天突然兴起，准备完善秋色园后台的编辑器关于Chrome、FireFox下的选择内容的HTML兼容处理,JS编辑器获取选择内容的HTML兼容性写法问题描述：对于如何获取选择的文本（包括Html标签），通常网络上的答案是：var deditor=document.getElementById('iframe名称').contentWindow;IE：deditor.pos.htmlText，获得html内容。其它浏览器：deditor.window.getSelection().toString(); 仅获取不包括html标签的文本。问题：假充你给一段选择的文字（包括换行、段落格式化的），加一个背影或边框等操作时，如果html标签都失踪了，仅剩下文字，那就不是您想要的效果了。</summary><published>2012-05-12T08:11:00Z</published><updated>2012-05-12T08:11:00Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cyq1162/archive/2012/05/12/2496501.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/archive/2012/05/12/2496501.html"/><content type="html">&lt;p&gt;&lt;strong&gt;昨天突然兴起，准备完善&lt;a href="http://www.cyqdata.com/" target="_blank"&gt;秋色园&lt;/a&gt;后台的编辑器关于Chrome、FireFox下的选择内容的HTML兼容处理。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font class="Apple-style-span" color="#ff0000"&gt;JS编辑器获取选择内容的HTML兼容性写法问题描述：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;对于如何获取选择的文本（包括Html标签），通常网络上的答案是：&lt;/p&gt;&lt;p&gt;var&amp;nbsp;&amp;nbsp;deditor=document.getElementById('iframe名称').contentWindow;&lt;/p&gt;&lt;p&gt;IE：deditor.pos.htmlText，获得html内容。&lt;/p&gt;&lt;p&gt;其它浏览器：deditor.window.getSelection().toString(); 仅获取不包括html标签的文本。&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: Simsun; font-size: medium; "&gt;问题：假充你给一段选择的文字（包括换行、段落格式化的），加一个背影或边框等操作时，如果html标签都失踪了，仅剩下文字，那就不是您想要的效果了。&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font class="Apple-style-span" color="#ff0000"&gt;既然知道了问题，如何&lt;a href="http://www.cyqdata.com/cyq1162/article-detail-54156" target="_blank" title="JS编辑器获取选择内容的HTML兼容性写法（IE、FireFox、Chrome)"&gt;&lt;span style="color: red; "&gt;解决JS兼容性&lt;/span&gt;&lt;/a&gt;？&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决问题步骤一：网络搜索&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;本人并不善长js，深夜中，只能靠程序员的本能，百度或Google现搜现处理了。&amp;nbsp;&lt;/p&gt;&lt;p&gt;然而这个互联网，稍为有点细活的代码，网络上总是难以搜寻，偶尔搜出来的，除了没有答案，另外就是通用性：&lt;/p&gt;&lt;p&gt;deditor.window.getSelection().toString()或deditor.window.getSelection().getRangeAt(0)。&lt;/p&gt;&lt;p&gt;类似的只能获取文字，可是，我要的是包括Html标签的文本，你本应该懂的。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决问题步骤二：代码调试&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;在指定相关符合关键字不多的网页中， 找到一个特殊的功能：&amp;#8220;Chrome&amp;#8220;的脚本调试。&lt;/p&gt;&lt;p&gt;调试方法：工具 - 开发人员工具 - scripts - 选择要调试的js文件。&lt;/p&gt;&lt;p&gt;接下来就是左侧设置断点，右边的设置监控变量和控制下一步等。&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;很遗憾的是，虽然能调试，试了很多属性和方法，可是还是没发现Chorme下能获取 选择的内容的Html方式。&lt;/p&gt;&lt;p&gt;调试截图如下：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.cyqdata.com/Upload/Editor/20120511/062313.jpg" border="0" align="absmiddle" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决问题步骤三：重复网络搜索&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;一般比较有价值的代码，网上很少会直接出现，一方是开发人员比较舍不得，另一方面是大伙不太爱写文章。&lt;/p&gt;&lt;p&gt;因此，继续搜索，从各类不同的文章中，提取出可能有用的代码。&lt;/p&gt;&lt;p&gt;最后，不知在哪了，看到了一个：selection.getRangeAt(0).cloneContents().childNodes。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;从正常的思维中，clone后再取子节点，和直接取子节点，有啥区别呢？可是就是有区别。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决问题步骤四：重复的代码调试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;继续调试，断点，监控变量及值，最后发现，通过克隆后取的子节点，可以取到outerHTML属性，于是问题比较明朗化，写个方法for一下组合。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&amp;nbsp;GetChormeInnerHTML(nodes)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;result='';&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;var node=null;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;for (var i = 0; i &amp;lt; nodes.length; i++)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;{&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;node=nodes[i];&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;if(node.outerHTML)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;{&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;result+=node.outerHTML;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;else if(node.nodeValue)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;{&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;result+=node.nodeValue;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;}&lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;result.replace("&amp;lt;div&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/div&amp;gt;","&amp;lt;br&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;由于在Chorme下每次回车都产生"&amp;lt;div&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/div&amp;gt;&amp;#8220;，于是去掉多余的标识。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;浏览器兼容，不会让你太轻松&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;本来以为问题解决了，于是在firefox下试了一下，靠，这B的firefox，竟然不行。&lt;/p&gt;&lt;p&gt;于是使用Firfox，进行脚本调试，发现firefox下获得到子节点，根本没有outerHTML属性，太悲剧了，连这个都没有，问题又卡住了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决问题步骤五：持续的网络搜索&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;关键换成了firefox下的js选择html的相关内容及兼容写法，可惜，网络上都是迷惑人标题+没有答案的内容。&lt;/p&gt;&lt;p&gt;在经过N小时的头脑风暴和搜索体验之后，冷静了一下，B的，回去继续调试，看能不能发现新大陆。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决问题步骤六：持续的调试代码&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在Firfox下，调试各属性可能产生的值，及出来的值，明显的没有直接的答案。&lt;/p&gt;&lt;p&gt;最后发现，由于是节点，节点就是属性，标签名、内容文本够成的。&lt;/p&gt;&lt;p&gt;调试如下图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.cyqdata.com/Upload/Editor/20120511/063407.jpg" border="0" align="absmiddle" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决问题步骤七：创新思维：无招剩有招，没有现成的，不要怕麻烦，一切从头组装&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在发挥不怕麻烦的精神下，自己重新组合节点的outerHTML，再把所有节点的outerHTML拼接起来。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&amp;nbsp;GetFireFoxInnerHTML(nodes)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;result='';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;node;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;nodes.length;&amp;nbsp;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node=nodes[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(node.nodeValue)&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&lt;span style="font-family: 'Courier New'; color: #008000; "&gt;//纯文本节点&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: #008000; "&gt;还原。&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result+=node.nodeValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(node.tagName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result+="&amp;lt;"+node.tagName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(node.innerHTML)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;属性还原。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(node.attributes&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;node.attributes.length&amp;gt;1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;j=0;j&amp;lt;node.attributes.length-1;j++)&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;忽略最后一个，最后一个是FirFox自己的节点。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result+='&amp;nbsp;'+node.attributes[j].name+"='"+node.attributes[j].value+"'";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result+="&amp;gt;"+node.innerHTML+"&amp;lt;/"+node.tagName+"&amp;gt;";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result+="&amp;nbsp;/&amp;gt;";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;result;&lt;/div&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;font class="Apple-style-span" face="'Courier New'" size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;步骤八：花点时间，记录在案，分享成果，后续可查。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;其它&lt;/strong&gt;：&amp;nbsp;&lt;/p&gt;&lt;p&gt;这两三天，花了点功能，给秋色园的博客增加了论坛模式，简单切换皮肤就变成了论坛，省去了部署论坛的麻烦，还省了点服务器费用。&lt;/p&gt;&lt;p&gt;博客论坛模式示例：&lt;a href="http://www.cyqdata.com/fensi" title="微博粉丝精灵" target="_blank"&gt;微博粉丝精灵&lt;/a&gt;&amp;nbsp;官网论坛示例，后续再考虑是否绑定BBS二级域名的SEO问题。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cyq1162/aggbug/2496501.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2012/05/12/2496501.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cyq1162/archive/2012/04/21/2460964.html</id><title type="text">DataReader不奇怪，该出手时就出手！</title><summary type="text">夜里三点多，刚完成微博粉丝精灵V3.763的微博升级，上来看看，刚看到一篇文章：【原】关于使用DataReader的一个很奇怪的问题，不应该用DataReader？于是准备花点时间解答下，顺便为这个月增添一篇文章。。下面请看：</summary><published>2012-04-20T20:16:00Z</published><updated>2012-04-20T20:16:00Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cyq1162/archive/2012/04/21/2460964.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/archive/2012/04/21/2460964.html"/><content type="html">&lt;p&gt;&lt;strong&gt;夜里三点多，刚完成&lt;a href="http://www.cyqdata.com/fensi" title="微博粉丝精灵" target="_blank"&gt;微博粉丝精灵&lt;/a&gt;V3.763的微博升级，上来看看，刚看到一篇文章：&lt;span class="Apple-style-span" style="font-family: verdana, Arial, Helvetica, sans-serif; line-height: 18px; "&gt;&lt;a class="titlelnk" href="http://www.cnblogs.com/fmp/archive/2012/04/20/2459386.html" target="_blank" style="color: #105cb6; font-size: 14px; text-decoration: underline; "&gt;【原】关于使用DataReader的一个很奇怪的问题，不应该用DataReader？&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;于是准备花点时间解答下，顺便为这个月增添一篇文章。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;关于DataReader，以前写过一篇文章，可参考：&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; line-height: 19px; "&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2011/04/06/2006412.html" class="searchItemTitle" target="_blank" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; clear: both; color: #261cdc; text-decoration: underline; "&gt;&lt;font color="#C60A00" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;DataReader&lt;/font&gt;&amp;nbsp;链接关闭解惑篇&lt;/a&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面将对原文，解答两个问题：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;一：&amp;nbsp;&lt;/strong&gt;&lt;strong style="color: red; "&gt;DataReader、DataTable、DataSet 的简单关系：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里先取原文的第一句话：&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;.net读取数据集有两种方式：DataSet&amp;nbsp;和&amp;nbsp;DataReader&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解答：.net 的Command操作里，默认可以有三种返回：DataReader、DataTable、DataSet&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这三者的简单关系为：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;DataReader&amp;nbsp;快速只向前读的流，需要开发者自己去关闭流。&lt;/div&gt;&lt;p&gt;DataTable&amp;nbsp;一个容器，把DataReeader读到DataTable容器后关闭流。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;DataSet 一个大容器，里面可放置多个DataTable。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;因此开发者，首先要明白这三者的简单关系，才不至于乱猜。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;二：数据库链接、链接池、close与dispose&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里再取原文的第N句话：&lt;span class="Apple-style-span" style="color: #666666; font-family: 微软雅黑, verdana, 'ms song', 宋体, Arial, Helvetica, sans-serif; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: simsun; line-height: 23px; text-align: left; "&gt;在sqlserver（2000）中查看进程，有&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 微软雅黑, verdana, 'ms song', 宋体, Arial, Helvetica, sans-serif; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 21px; font-family: simsun; text-align: left; color: #ff0000; "&gt;非常多的sleeping进程&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 微软雅黑, verdana, 'ms song', 宋体, Arial, Helvetica, sans-serif; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: simsun; line-height: 23px; text-align: left; "&gt;，直到最后打开页面，提示&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 微软雅黑, verdana, 'ms song', 宋体, Arial, Helvetica, sans-serif; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 21px; font-family: simsun; text-align: left; color: #ff0000; "&gt;超时，说连接池满&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #666666; font-family: 微软雅黑, verdana, 'ms song', 宋体, Arial, Helvetica, sans-serif; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: simsun; line-height: 23px; text-align: left; "&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解答：默认mssql的链接数是有限的，大体在100多个，简单的说你可以open 100多次而不关闭，超过后再open就会出现链接池不够的现象。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这之间的简单关系为：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;第一次Open出链接时，连接数据库（由于是首次建立链接，需要初始化先多信息，就是传说的性能问题）&lt;/div&gt;&lt;p&gt;然后你Close时，数据库断开链接，同时把链接状态改成sleep，但是不销毁（为了下次建立链接时省掉初始化，避免传说中的性能问题），这个不销毁的链接，放到一个池里面，被称之为链接池。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;如果你Dispose()，则会把链接从池里销毁，当然下次链接就会开始新的初始化。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;下面就会有很多种情况出现：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;情况一：一个线程的正常操作：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果使用时一个流程下来，是按顺序的open-&amp;gt;close-open-&amp;gt;close 状态，那么始终只用到一个链接（从连接池里进进出出），基本没有过多的初始化问题，传说性能好。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;情况二：多个线程的不正常操作：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果你一个链接，在Open状态，这时候另一个线程也要打开链接，发现链接池没有时，就会重新到数据库建一个链接（又开始初始化，一堆信息，最后产生一个链接）。&lt;/p&gt;&lt;p&gt;如果你所有的链接全在Open，不关闭，或者时间拖的很多，在其它线程要链接的时候，你的链接还没关闭，在产生100多个链接后，数据库最大数满了，就会出现&amp;#8220;链接池已满&amp;#8221;的情况。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;情况三：多个线程的正常操作：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果你懂的每个链接打开后，都快速关闭，通常一个正常语句的操作时间在0.001-0.1秒左右，这样关闭的链接就回到池里，可以快速供给其它线程使用。&lt;/p&gt;&lt;p&gt;这样，仅需要几十个链接，就可以循环的使用处理多线程问题。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;简单的假设：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果一个操作open到close，用时0.1秒一次， 那么一个链接在1秒内可以处理10次操作。而100个链接最大数就可以支持1000次操作。&lt;/p&gt;&lt;p&gt;简单的说就是1秒可以并发操作1000次以上，这对中小网站来说，处理是相当容易的事。&lt;/p&gt;&lt;p&gt;而新手容易犯的错误，就是链接打开后，长时间的不关闭，最后导致在多线程的情况下，把数据库链接资源用尽了，出现了错误而不得知。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;进一步的假设&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;在很多的程序处理中，对数据库的操作时间，往往是不平均的，这就需要有点经验的程序开发者，花点时间，来搞好这最大并发问题，通常是：&lt;/p&gt;&lt;p&gt;对长时间查询的，使用缓存（避免二次查询），或者集中使用队列（因为使用队列，就一个链接就可以搞定了，反正是开了读和关，然后下一个又是开了读和关，始终是一个链接），当然使用队列也要看情况。&lt;/p&gt;&lt;p&gt;对于时间短的，直接处理就可以了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;其实说白了，越往上，就越是&amp;#8220;看情况处理&amp;#8221;，没有啥定律，要是有，那就是数据库的最大链接数，无论你怎么耍流氓，反正你不能让它一次性给用完。&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;补充点：&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: verdana; font-size: 12px; line-height: 18px; "&gt;在sqlserver（2000）中查看进程，有非常多的sleeping进程，直到最后打开页面，提示超时，说连接池满，为什么，既然已经了很多 sleeping 的数据库连接， 为什么还会出现 不能连接数据库 的问题呢？？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;答：&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: verdana; font-size: 12px; line-height: 18px; "&gt;对于ADO.NET，它有一种机制，来分析是使用产生新的会话还是直接从链接池中返回，例如，不同的数据库链接，它会产生新的链接，而不会从原有链接池里返回。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: verdana; font-size: 12px; line-height: 18px; "&gt;而对于mssql，可能某种检测机制原因（不同的线程或进程链接），mssql分析后直接是为你产生新的链接，而不是从sleep状态的链接池返回，因此，原来的sleep无法复用，再次产生新的链接，就报链接池满了。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cyq1162/aggbug/2460964.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2012/04/21/2460964.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cyq1162/archive/2012/04/03/2431523.html</id><title type="text">Access优已成忧，一年后，还是离开了秋色园了</title><summary type="text">从上个月起，秋色园QBlog的数据库，已经从access+sqlite变更为sql2000+sqlite，从此，access离开了秋色园的怀抱。该走的还是走了，秋色园在用Access一年多后，目前对本人来说，已优无可优，甚到为之担忧的地步，终于还是离开了。下面让我们简单回顾一下秋色园与Access恩怨情仇(太久没写文章，不习惯写长文了）：</summary><published>2012-04-03T15:33:00Z</published><updated>2012-04-03T15:33:00Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cyq1162/archive/2012/04/03/2431523.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/archive/2012/04/03/2431523.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;从上个月起，秋色园&lt;a title="qblog" href="http://www.cyqdata.com/qblog" target="_blank"&gt;&lt;span style="color: #000000"&gt;QBlog&lt;/span&gt;&lt;/a&gt;的数据库，已经从access+sqlite变更为sql2000+sqlite，从此，access离开了秋色园的怀抱。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;该走的还是走了，秋色园在用Access一年多后，目前对本人来说，已优无可优，甚到为之担忧的地步，终于还是离开了。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;下面让我们简单回顾一下秋色园与Access恩怨情仇(太久没写文章，不习惯写长文了）：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;恩：&lt;/strong&gt;还记得最早秋色园使用Access，是由于秋色园是寄在朋友的godaddy的虚拟子目录下，那时候还没咋认识sqlite，因此access是最优选择，access感觉还是不错的，一开始感觉速度还是挺快的。&lt;/p&gt;&lt;p&gt;优点：简单实用，啥也不用想，传上去就OK了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;怨：&lt;/strong&gt;随着秋色园文章量的增加，access在速度上，特别是分页速度，已经明显的力不从心，文章量越大，速度越是下降的明显，多次优化分页方法，终于速度上去了一点点，但这一点点并解决不了问题，后来换上了512M内存的vps。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;缺点：经不起量（几万以上）的折磨。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;情：&lt;/strong&gt;虽然秋色园多次尝试换其它数据库，包括在oracle、Mysql、mssql等数据库上运行过秋色园，但由于内存实在太小，最终还是回归到access上，虽然也一度在sqlite上运行了，但没发sqlite有啥速度改善，于是一切回到了access，为并之优化打算奋斗到底。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;优点：原来还好很多可优化的地方。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;每次优化完access的问题，总多少会感觉到点优越感，弄久了，似觉的感情深了，以下回忆一下和Access优化有关的都有什么来着：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;：优化分页语句：在组合sql语句时，可以进行sql语句优化，这个好像到处都通用的，不需要分access了。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;：数据库分库：其实就是链接表，用链接表，的解可以在某种程度上解决一些问题。&lt;br /&gt;&lt;br /&gt;这个分库涉及：把大量段的分离，或者表分离，尽量保持一个数据库小一点。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;：建立索引：Access也有索引的，不过我设了和没设，没感觉到有区别（不像其它数据库，设置后效果太明显）。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;：压缩数据库，用久了压一压，数据库小点，感觉还是有点用处的。&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;晕，总结了一下，才发现access没多少可优化点，以前优化都是在尽量避免和access接触，基本上是程序上的优化。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;仇：&lt;/strong&gt;由于Access本身并不具备多少优化点，因此，程序上根本无法100%阻挡access的写入或读取，因此，总在某一时刻，数据库死锁了，最可怕的，最后还经常出现aspnet_isapi检测到死锁，重启应用程序池，这对本来内存就小的服务器是最致命的打击，从此，我恨access。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;缺点：当access死锁时，这是相当可怕的，因为除了重启IIS，你几乎没有其它方式可以恢复网站的正常运行。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;补充另外一招：调用GC.Collect()，这招可以释放Access未关闭链接而链接引用丢失时造成的临时锁。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;最后，我必须总结一下：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1：access本来就是桌面数据库，还是不要勉强逼它吃多线程应用。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2：站点有点流量的，内存一定要够大，vsp买时，内存至少得1G以上够开个sql2000，多花点钱，省N多时间。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3：目前秋色园&lt;a title="qblog" href="http://www.cyqdata.com/qblog" target="_blank"&gt;&lt;span style="color: #000000"&gt;&lt;strong&gt;QBlog&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;运行在sql2000下+sqlite辅助，一切正常。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4：本来是想写文本数据库（&lt;a title="CYQ.Data" href="http://www.cyqdata.com/cyqdata" target="_blank"&gt;&lt;span style="color: #000000"&gt;CYQ.Data&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;strong style="color: #000000"&gt; &lt;/strong&gt;&lt;strong&gt;数据框架操作文本）相关的文章，没想到写着写着写成这文章了，歪了。。。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cyq1162/aggbug/2431523.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2012/04/03/2431523.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cyq1162/archive/2012/03/27/2419655.html</id><title type="text">WebBrowser 显示Html内容3点细节技巧</title><summary type="text">早在（新浪）微博粉丝精灵的评论平台（现在移到微博人气精灵）里，需要有空间来显示新浪微博的内容，如下图：在图片的右侧，是一个WebBrowser 控件，用来显示新浪微博的内容给用户评论，然则却遇到不少问题。直接显示Html内容，不像直接导航网址容易处理:问题：按微软的控件属性提示，可以用WebBrowser.DocumentText 属性赋值 ，但是这种赋值，只是首次有效，后续切换都没啥作用。为决定这个问题</summary><published>2012-03-27T08:04:00Z</published><updated>2012-03-27T08:04:00Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cyq1162/archive/2012/03/27/2419655.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/archive/2012/03/27/2419655.html"/><content type="html">&lt;p&gt;&lt;strong&gt;先上技术内容，后面再感慨几句：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;早在（新浪）&lt;a href="http://www.cyqdata.com/fensi" title="微博粉丝精灵" target="_blank"&gt;微博粉丝精灵&lt;/a&gt;的评论平台（现在移到微博人气精灵）里，需要有空间来显示新浪微博的内容，如下图：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/cyq1162/201203/comment.jpg" width="878" height="542" alt="" longdesc="微博评论平台" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在图片的右侧，是一个WebBrowser 控件，用来显示新浪微博的内容给用户评论，然则却遇到不少问题。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;直接显示Html内容，不像直接导航网址容易处理:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;strong style="color: red; "&gt;按微软的控件属性提示，可以用WebBrowser.DocumentText 属性赋值&amp;nbsp;，但是这种赋值，只是首次有效，后续切换都没啥作用。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;为决定这个问题，自己花了点时间研究与摸索。&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red; "&gt;下面给出自己追求摸索的两点技巧：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1：通过WebBrowser.Document.Write(html)方法来输出html内容显示。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="display: inline-block; "&gt;&lt;/div&gt;由于WebBrowser 需要经历几个事件后才会显示，直接输出是不行的，为此，需要有点技巧的使用：&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;wbShowBlog.Navigate(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;about:blank&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;(wbShowBlog.ReadyState&amp;nbsp;!=&amp;nbsp;WebBrowserReadyState.Complete)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Application.DoEvents();&lt;br /&gt;}&lt;br /&gt;wbShowBlog.Document.Write(html)&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;先导航到空白页，再输出需要显示的Html内容，用这个方法解决。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2：二次显示内容，应该用节点替换，而不是重新输出内容&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一开始都调用输出显示，结果切换内容时，偶尔会出现切换后不显示新内容的问题。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在多次反复的试验中，反反复复，时好时坏之后，决定想法处理掉这个问题，为此，本人又想到另一种解决的方式：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; "&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;&lt;span style="color: #0000ff; "&gt;if&lt;/span&gt;&amp;nbsp;(wbShowBlog.Document&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff; "&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;{&lt;br /&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;htmlTemplate.Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;blogText);&lt;br /&gt;&amp;nbsp;wbShowBlog.Navigate(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;about:blank&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;(wbShowBlog.ReadyState&amp;nbsp;!=&amp;nbsp;WebBrowserReadyState.Complete)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; Application.DoEvents();&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;wbShowBlog.Document.Write(html);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里有问题，明天处理。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wbShowBlog.Document.GetElementById(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;weibospiritBody&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).InnerHtml&amp;nbsp;=&amp;nbsp;blogText;&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第二次时，通过直接切换内部某节点的InnerHtml来显示内容，而不是重新对浏览器赋值，通过这个方式，完美的解决了这个问题。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3：Document.Write(html) 带iframe时，解决iframe默认不显示的神秘问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;终于，直到某天，新的策略变化，内容下方的广告，不是直接显示内容，而且想套一个iframe来显示网页地址，这时候又发现新问题：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;通过Document.Write出来的iframe竟然显示不出来，折腾过后，发现刷新一下浏览器可以显示出来，为此，又补上一招，变成：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; "&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;&lt;span style="color: #0000ff; "&gt;if&lt;/span&gt;&amp;nbsp;(wbShowBlog.Document&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff; "&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;p&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;html&amp;nbsp;=&amp;nbsp;htmlTemplate.Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;blogText);&lt;br /&gt;&amp;nbsp; &amp;nbsp;wbShowBlog.Navigate(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;about:blank&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;(wbShowBlog.ReadyState&amp;nbsp;!=&amp;nbsp;WebBrowserReadyState.Complete)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Application.DoEvents();&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; wbShowBlog.Document.Write(html);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里有问题，明天处理。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; wbShowBlog.Refresh();&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;不刷新一下，Iframe显示不出来。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; wbShowBlog.Document.GetElementById(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;weibospiritBody&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).InnerHtml&amp;nbsp;=&amp;nbsp;blogText;&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;就是多一行刷新，解决了这个问题，以上就是3个细节点。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red; "&gt;&lt;strong&gt;下面感慨几句：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;现在很少写技术文章了，曾经天天写着文章，如今一个月才写一篇一小而短的文章，忆往昔，往事不堪回首了！&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;从离职到私奔出来自己折腾，快近一年了，从折腾&lt;a href="http://www.cyqdata.com/" title="秋色园" target="_blank"&gt;秋色园&lt;/a&gt;、&lt;a href="http://www.cyqdata.com/cyqdata" target="_blank" title="cyq.data"&gt;CYQ.Data 数据框架&lt;/a&gt;、&lt;a href="http://www.cyqdata.com/dbimport" title="数据库互导工具" target="_blank"&gt;CYQ.DBImport&lt;/a&gt;(数据库互导工具）、&lt;a href="http://www.cyqdata.com/iislogviewer" title="点格网站日志分析器" target="_blank"&gt;CYQ.IISLogViewer&lt;/a&gt;（IIS日志分析工具）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;到现在转战&lt;a href="http://www.cyqdata.com/fensi" title="微博粉丝精灵" target="_blank"&gt;新浪微博粉丝精灵&lt;/a&gt;，一直在忙碌，基本都在一线开发，战线似乎拉的点长，有些都顾不上更新版本了，要做的事太多了，所以没以前那会那么闲了，可以天天写文章。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;偶尔会发一发微博，有闲可以关注下我的新浪微博：&lt;a href="http://weibo.com/cyqdata"&gt;http://weibo.com/cyqdata&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cyq1162/aggbug/2419655.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2012/03/27/2419655.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cyq1162/archive/2012/02/17/2355679.html</id><title type="text">Winform 多组合老板键Alt_Ctrl_Shift</title><summary type="text">某天，为了给微博粉丝精灵增加个老板键功能，找一惯的方式，开始从网络下手寻找： 关键字类似”C# 老板键“，一搜，一堆又一堆，然而出来的代码，基本上都是一个样的：正常来说，老板键一般少不了：Alt+Ctrl+Shift+XX这种多组合方式，然而各类代码就是不直接说明，也没个提示，看来是有意隐藏，终于，还是被我发现其中的一些不为人知的隐藏属性：</summary><published>2012-02-17T05:50:00Z</published><updated>2012-02-17T05:50:00Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cyq1162/archive/2012/02/17/2355679.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/archive/2012/02/17/2355679.html"/><content type="html">&lt;div style="display: inline-block; "&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;某天，为了给&lt;a href="http://www.cyqdata.com/fensi" target="_blank" title="微博粉丝精灵"&gt;微博粉丝精灵&lt;/a&gt;增加个老板键功能，找一惯的方式，开始从网络下手寻找： 关键字类似&amp;#8221;C# 老板键&amp;#8220;，一搜，一堆又一堆，然而出来的代码，基本上都是一个样的：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;strong&gt;正常来说，老板键一般少不了：Alt+Ctrl+Shift+XX这种多组合方式，然而各类代码就是不直接说明，也没个提示，看来是有意隐藏，终于，还是被我发现其中的一些不为人知的隐藏属性：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;/div&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;下面看一下本人修改自网络常见的代码：&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;/div&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;delegate&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;HotkeyEventHandler(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;HotKeyID);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;SystemHotKey&amp;nbsp;:&amp;nbsp;System.Windows.Forms.IMessageFilter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;UInt32&amp;gt;&amp;nbsp;keyIDs&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;UInt32&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntPtr&amp;nbsp;hWnd;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;event&lt;/span&gt;&amp;nbsp;HotkeyEventHandler&amp;nbsp;OnHotkey;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;enum&lt;/span&gt;&amp;nbsp;KeyFlags&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Alt&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0x1&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Ctrl&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0x2&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Shift&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0x4&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Win&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0x8&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;组合键等于值相加&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Alt_Ctrl&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0x3&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Alt_Shift&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0x5&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Ctrl_Shift&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0x6&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Alt_Ctrl_Shift&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0x7&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;user32.dll&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;extern&lt;/span&gt;&amp;nbsp;UInt32&amp;nbsp;RegisterHotKey(IntPtr&amp;nbsp;hWnd,&amp;nbsp;UInt32&amp;nbsp;id,&amp;nbsp;UInt32&amp;nbsp;fsModifiers,&amp;nbsp;UInt32&amp;nbsp;vk);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;user32.dll&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;extern&lt;/span&gt;&amp;nbsp;UInt32&amp;nbsp;UnregisterHotKey(IntPtr&amp;nbsp;hWnd,&amp;nbsp;UInt32&amp;nbsp;id);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;kernel32.dll&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;extern&lt;/span&gt;&amp;nbsp;UInt32&amp;nbsp;GlobalAddAtom(String&amp;nbsp;lpString);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;kernel32.dll&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;extern&lt;/span&gt;&amp;nbsp;UInt32&amp;nbsp;GlobalDeleteAtom(UInt32&amp;nbsp;nAtom);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;SystemHotKey(IntPtr&amp;nbsp;hWnd)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;.hWnd&amp;nbsp;=&amp;nbsp;hWnd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;RegisterHotkey(KeyFlags&amp;nbsp;keyflags,&amp;nbsp;System.Windows.Forms.Keys&amp;nbsp;Key)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Windows.Forms.Application.AddMessageFilter(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32&amp;nbsp;hotkeyid&amp;nbsp;=&amp;nbsp;GlobalAddAtom(System.Guid.NewGuid().ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegisterHotKey((IntPtr)hWnd,&amp;nbsp;hotkeyid,&amp;nbsp;(UInt32)keyflags,&amp;nbsp;(UInt32)Key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;keyIDs.Add(hotkeyid);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;)hotkeyid;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;UnregisterHotkeys()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(keyIDs.Count&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Windows.Forms.Application.RemoveMessageFilter(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;foreach&lt;/span&gt;&amp;nbsp;(UInt32&amp;nbsp;key&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;keyIDs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UnregisterHotKey(hWnd,&amp;nbsp;key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GlobalDeleteAtom(key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;keyIDs.Clear();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;PreFilterMessage(&lt;span style="color: #0000FF;"&gt;ref&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Windows.Forms.Message&amp;nbsp;m)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(m.Msg&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;0x312&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(OnHotkey&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;foreach&lt;/span&gt;&amp;nbsp;(UInt32&amp;nbsp;key&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;keyIDs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;((UInt32)m.WParam&amp;nbsp;==&amp;nbsp;key)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnHotkey((&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;)m.WParam);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;/div&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;以上有几个要点说一下：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;/div&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;1：System.Windows.Forms.Application.AddMessageFilter(this);这句需要对应System.Windows.Forms.Application.RemoveMessageFilter(this);这里用完要记得取消。&lt;/div&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;由于原来的程序，只在构造函数里添加，所以取消后，再设置就会失效了，这里直接在注册的时候给加上，取消时去掉，注意下这个效果即可。&lt;/div&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;/div&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;2：热键的组合：&lt;/p&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //组合键等于值相加&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alt_Ctrl = 0x3,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alt_Shift = 0x5,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Ctrl_Shift = 0x6,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Alt_Ctrl_Shift = 0x7&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;这个是不经意思发觉的，网上的代码都没有提到，估计转的人太多了，知道的又不写出来。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;/div&gt;&lt;div style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;3：把Hastable变更成List&amp;lt;Unint32&amp;gt;方式。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最近事比较多，写文都比较简单了，大伙见谅了。&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;uint32&gt;&lt;uint32&gt;&lt;unint32&gt;&lt;/unint32&gt;&lt;/uint32&gt;&lt;/uint32&gt;&lt;img src="http://www.cnblogs.com/cyq1162/aggbug/2355679.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2012/02/17/2355679.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cyq1162/archive/2012/01/20/2327698.html</id><title type="text">当内存512遇上Access数据库600M，IO磁盘受伤了</title><summary type="text">服务器内存就512M，Access数据库（文章库）600多M，结果竟然就是IO受伤了。早些年写秋色园技术原理解析系列，园里不少看过的帅歌，应该有点印象，从开始到现在，还是铁打的Access数据库。虽然本人目前对Access恨入之骨，皆因囊中羞涩,暂时不得不与之同流合污。几个月来，秋色园一直运行正常，除了远程界面都变的很卡之外，基本上也没发现什么异常。然而这个隐藏多年的内伤，如果不是那一天，客服把我服务器给关机了，估计到现在也没察觉，让IO受伤了好几个月了。</summary><published>2012-01-19T16:38:00Z</published><updated>2012-01-19T16:38:00Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cyq1162/archive/2012/01/20/2327698.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/archive/2012/01/20/2327698.html"/><content type="html">&lt;p&gt;&lt;strong&gt;服务器内存就512M，Access数据库（文章库）600多M，结果竟然就是IO受伤了。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;早些年写&lt;/strong&gt;&lt;a href="http://www.cyqdata.com/qblog/article-cate-103"&gt;&lt;strong&gt;秋色园技术原理解析&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;系列，园里不少看过的帅歌，应该有点印象，从开始到现在，还是铁打的Access数据库。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;虽然本人目前对Access恨入之骨，皆因&lt;font size="2"&gt;囊中羞涩,暂时不得不与之&lt;/font&gt;同流合污。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;忙碌&lt;a title="微博粉丝精灵" href="http://www.cyqdata.com/fensi" target="_blank"&gt;微博粉丝精灵&lt;/a&gt;几个月来，&lt;a title="秋色园" href="http://www.cyqdata.com/"&gt;秋色园&lt;/a&gt;一直运行正常，除了远程界面都变的很卡之外，基本上也没发现什么异常。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;然而这个隐藏多年的内伤，如果不是那一天，客服把我服务器给关机了，估计到现在也没察觉，让IO受伤了好几个月了。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;以下是故事的过程，有兴趣扫一眼，没兴趣直接拉到后面看结果：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;就在那天，服务器让客服给直接关机了，理由是：CPU持续三小时100%，IO磁盘每秒读写50M，为不影响其它用户，直接给关了，让处理完再开机。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;前面的CPU百分百是忽悠我的，因为你对客户说，因磁盘读写问题而关机，比较悬，如果说CPU满了而关机，都直观容易理解。&lt;/p&gt;&lt;p&gt;不过，因为刚才我还在看着服务器，CPU正常，根本不可能持续三小时百分&amp;#8221;（当然了，偶尔应用程序池刚重启时，瞬时十来秒上到100%这个我知道，由于是短暂的，我一直没查明真相）我让客服给我截图，并恢复开机，我说CPU我会处理。&lt;/p&gt;&lt;p&gt;神奇的客服，给我截了另一张图，说我磁盘读写超标，让我处理完再开机。&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://www.cyqdata.com/Upload/Editor/20120116/031537.jpg" align="absMiddle" border="0" /&gt;&lt;/p&gt;&lt;p&gt;从这图看的出来，这台服务器上至少挤了好几十个VPS用户了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;磁盘读写超标，是件很悬的事件，首先这超标的标准是什么？硬盘每秒读写速率达到多少才算超标？这超标又怎么影响到其它用户了？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当然了，谁家的网站不经常读写IO呢，这VPS就这么丁点内存，肯定重点就会转发到硬盘去了，习惯性思维以为是自己的程序问题，因为实在平时对磁盘读写没怎么在意，好像开发这么久，还没怎么和磁盘的负载扯上关系，这一块是一片空白。&lt;/p&gt;&lt;p&gt;于是，当开机后，用户一张一张的截图，说让我处理，着实把我弄急了：&lt;/p&gt;&lt;p&gt;没办法，我只好暂时把秋色园网站停止，说我要去吃饭了（八九点还不让人吃饭），然后问客服，降下来没有，客服说：我看到依然还是有问题 。 我先断开你的网络把，你吃完饭后回来 联系我处理。&lt;/p&gt;&lt;p&gt;我急了，肯定不能断开网络了，毕竟微博粉丝精灵服务还在运行，没办法，我下了下手，把粉丝精灵服务也给关了，问，现在正常了没有，客服又来一张图说：现在正常一些了 0.59是1分钟内的负载，1.68是五分钟内的平均负载 &lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://www.cyqdata.com/Upload/Editor/20120116/032533.jpg" align="absMiddle" border="0" /&gt;&lt;/p&gt;&lt;p&gt;我特纠结，服务器一共就两网站，这全都关了，你只是正常了点，靠，直接把远程密码发给对方，你去折腾，我去吃饭。&lt;/p&gt;&lt;p&gt;快速吃完回来问客服情况怎样，对方三弄几弄，说正常了，我问弄什么了，对方说：&amp;#8220;App_Data 这个目录 我随便改了名字。&amp;nbsp;&amp;nbsp; 除此之外 我都没有动 &amp;#8221;。&lt;/p&gt;&lt;p&gt;这目录下就放着数据库，我说难道和数据库有关？里面有一个数据库600多M（文章表）。&lt;/p&gt;&lt;p&gt;客服说可能，但不确定。&lt;/p&gt;&lt;p&gt;于是我把秋色园解析解到其它地方，然后再开启网站，自己访问一下，才刚开，客服马上问我干啥了，负载又上去了，弄的我只好网站又停了，停了还没用，客服一样叫高，接着又来一张图：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://www.cyqdata.com/Upload/Editor/20120116/034335.jpg" align="absMiddle" border="0" /&gt;&lt;/p&gt;&lt;p&gt;说实在，我都不明白这些代表啥意，于是问了，这些怎么看，对方回答&amp;#8220;高于 1 即资源超载，三个数字1分钟，5分钟，10分钟内的系统平均负载&amp;#8221;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;我纠结了：不占cpu，不占内存，不占带宽，如果磁盘也不占，这网站怎么折腾？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;还有这磁盘，是读高，还是写高？&lt;/p&gt;&lt;p&gt;对方答复&amp;#8220;只能看一个系统分析值 ，就是VPS虚拟化自带的分析图&amp;#8221;。&lt;/p&gt;&lt;p&gt;接下来，我又把数据库的文件夹给改名了，看似得到的回复是正常了，瞬时好似问题的根源，就在于600多M的Access数据库上。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;结果：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;后续的问题，就是把它分成了10个库，用的&lt;/strong&gt;&lt;a href="http://www.cyqdata.com/dbimport" target="_blank"&gt;&lt;strong&gt;CYQ.DBImport&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;在远程直接操作分库，改了下算法，终于，客服不再叫了，远程操作变流畅了。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="red"&gt;多年隐藏的内伤表现：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;当Access的数据库大小超过内存的大小时，相关问题主要表现在磁盘读写超标（这个正常没法知道）。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;内伤一：界面影响特卡（可能会以为是CPU或内存问题）。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;内伤&lt;/strong&gt;二：还会影响到其它VPS用户（这个更不可能得知了）。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;内&lt;strong&gt;伤&lt;/strong&gt;三：同时应用程序池重启变慢（会误以为是程序写的不好）。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;内伤四：内存占用明显上去了（误以为缓存了Html导致的)。&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为此，Access虽然上限是2G，具体还得看你内存有多少，通常硬件不佳内存小才用Access，因此在使用时，量力而大！！！&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/cyq1162/aggbug/2327698.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2012/01/20/2327698.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cyq1162/archive/2012/01/07/2315467.html</id><title type="text">TextBox灵异事件之背后神秘的深度灵异事件真相揭秘</title><summary type="text">上篇：半解TextBox灵异事件背后神秘的深度灵异事件，一文中，一共提出两个问题：1：TextBox竟然扯上了User-Agent，是什么让它们生生死死的扯在了一起?2：本地的请求头发出时，被拦截修改成以下内容，是神秘黑客？还是UFO？还是台湾间蝶？：Mozilla/4.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.0.11) 在上文结果之时，同时后续补充了两个让人左右摇晃的事件：</summary><published>2012-01-06T17:49:00Z</published><updated>2012-01-06T17:49:00Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cyq1162/archive/2012/01/07/2315467.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/archive/2012/01/07/2315467.html"/><content type="html">&lt;p&gt;&lt;strong style="color: red"&gt;最近又忙于&lt;a title="秋色园" href="http://www.cyqdata.com/" target="_blank"&gt;秋色园&lt;/a&gt;和&lt;a title="微博粉丝精灵" href="http://www.cyqdata.com/fensi" target="_blank"&gt;微博粉丝精灵&lt;/a&gt;的开发，本来N天前应该出来的文，迟来了好几天，今天抽空写了写，把事件的真相给大伙说清楚：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;上篇：&lt;/strong&gt;&lt;a class="postTitle2" id="ctl02_TitleUrl" href="http://www.cnblogs.com/cyq1162/archive/2011/12/29/2305933.html"&gt;&lt;font color="#78afd3"&gt;&lt;strong&gt;半解TextBox灵异事件背后神秘的深度灵异事件&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;strong&gt;，一文中，一共提出两个问题：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1：TextBox竟然扯上了User-Agent，是什么让它们生生死死的扯在了一起?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2：本地的请求头发出时，被拦截修改成以下内容，是神秘黑客？还是UFO？还是台湾间蝶？：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;Mozilla/4.0 (Windows; U; Windows NT 5.1; &lt;strong style="color: red"&gt;zh-TW&lt;/strong&gt;; rv:1.9.0.11)&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;在上文结果之时，同时后续补充了两个让人左右摇晃的事件：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;事件A：在发布完上文不久后，网络神秘恢复正常，不得不让人联想是否黑客和UFO的存在。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;后续有网友留言：Never too late：额，gfw是什么啊，秋天大哥现在不经常写文章了啊，期待灵异事件再次发生然后获得最终的答案！！嘿嘿&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;好一个利嘴，一说就中。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;事件B：在补充完说网络恢复不久，网络再次失常，这时时纠心的背后，究竟是何种神秘组织在掌握着这一切？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;如果您没看完上文，请先看上文，再续此文！！！！&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;迷、迷、迷，所有的问题太神太出乎常理，如果没有追踪，如果没有探索，如果没有发现，一切只有由四个字来解释&amp;#8220;灵异事件&amp;#8221;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;从大伙开始Coding开始，估计已接触过相当多的貌似解不开的&amp;#8220;灵异事件&amp;#8221;，总有各种原因，没来得急细细追究，它们才成功了进升为&amp;#8220;灵异事件&amp;#8221;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;本文将为大伙揭开这个陌生又神秘的事件，估计是千难难遇一回，有理由相信，是被2012这个数字所扯来了，好了，有的没的真的假的扯了一堆，请看下文：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;为求真相，我白天不思夜的黑，就一路的想，这请求头，从我这里送出，经过网关路由，然后上一层是什么呢？这里会不会是从别人那里分线出来的呢？如果是分线出来，那么有理由相信，是分线的上一家给拦截了，为此，找出自己的网络定位，很有必要：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;一：宽带类型追踪&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;首先，查了一下自己的IP，显示是电信的：然后搜了搜几个抽屉，找到一个开通&amp;#8220;长城宽带&amp;#8221;的协议书，这个很纠结，&amp;#8220;长城宽带&amp;#8221;的网络会显示电信的IP？&lt;/p&gt;&lt;p&gt;于是我上网搜了一下，还真有不少消息说长城宽带租借电信或联通的IP的情况，于是，暂时就这么以为了：登陆了长城宽带的网官，试图联系长宽网络在线客服。&lt;/p&gt;&lt;p&gt;结果折腾了N久，终于发现并加到一个客服QQ，结果死活Q都没人在线，官网写着服务时间是9：00-22:00，当时从5点多，call到7点多，都没人响应，这个，真叫人不好说，说不好，不说好。&lt;/p&gt;&lt;p&gt;终于到了8点多，友人回来了，问了一下，宽带是什么的，友人说是电信的，小小震精了一下，唉，电信的网络跑长宽门前扣了两个多小时，还没人响应，这咋说的清。&lt;/p&gt;&lt;p&gt;再续问友人，这网络是直接拉的电信的不？友人说不知道，是别人转让的，连个合同书都没的，这下子没折，只好试图先从电信里那探下风。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;二：追踪电信人工服务与在线客服&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;认定目标，直接直接拔打10000号，想转人工服务，没想到电信的语音提示把人工服务藏的特别深，好比山歌十八弯，这里直接给大伙上答案：&lt;/p&gt;&lt;p&gt;1：打10000号，然后按1，转普通话。&lt;/p&gt;&lt;p&gt;2：然后按0，转其它，然后直接按&amp;#8220;1#&amp;#8221;，就可以转人工了。&lt;/p&gt;&lt;p&gt;由于全程没有出现一个&amp;#8220;人工服务&amp;#8221;相关的文字，所以特别不好找，一般转几转就转晕了。&lt;/p&gt;&lt;p&gt;好不容易，找到人工的正确按法，结果大伙都懂的，就是给你放音乐，放完音乐提示没人，是否继续等待，按&amp;#8220;是&amp;#8221;，直接给结束通话。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这里又很纠结，反正按是与否都自动结束，你B的没事还问啥虾米是否等待呢？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;人工的没折了，好在电信网官上，很有用户体验，极度友好的还给出了其它多种沟通方式：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1：在线网页沟通。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2：在线QQ。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3：在线填写原因。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;结果大伙都懂的，在线网页怎么打也打不开，在线QQ是很智能的，先让你选择分类，选完后直接跳到在线网页，结果就重复1的悲剧，在线填写的后续再说。&lt;/p&gt;&lt;p&gt;再结果，当天晚上就没法处理了，睡了一觉，第二天来临了：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;经过九九八十一刷，终于刷开了电信了网页客服，想象中迎来了一可爱的女客服：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我：直接把详细情况给反应了，打了特别多的字。&lt;/p&gt;&lt;p&gt;客服：您是否使用路由器上网？&lt;/p&gt;&lt;p&gt;我：是。&lt;/p&gt;&lt;p&gt;客服：请不要使用路由器上网看看。&lt;/p&gt;&lt;p&gt;我：（我很纠结，因为大伙上着网，不太方便让大伙断网，再说，路由器会修改请求头？路由也会中病毒？因此，我说）您了解我的情况吗？我这边测试一下，您那边也提交一下我情况，毕竟刷开个网页不容易。&lt;/p&gt;&lt;p&gt;客服：技术问题需要提交给提交给技术人员，请填写表单，48小时会人回复您。&lt;/p&gt;&lt;p&gt;我：把表单填了，结果大伙都懂的，4800小时也不会有回复的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一下到了夜里，我和&amp;#8220;毛&amp;#8221;大哥聊起了这怪事：他一来就和我说，ISO分几层你知道不？链路层是不会出现数据传输封包错误的，（简单的说就是电信是不会出现数据错误的），因此，他怀疑是内部ARP引发的可能性更大一些。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;经这么一提醒，基本上，要么问题就出现在局域网内，要么就是假设这线路外面还有一个私人的关口，因此，从内部查起最简单。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;终于，夜比较长，等来了方便重启路由的时机，为此对路由进行了一系列测试：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;测试流程如下：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1：直接拔号上网，避开路由，发现网络正常，这一正常，直接排除了私人关口的可能性，问题直接定位在局域网中，也怀疑有可能是ARP。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2：为了测试是否ARP，路由拔号上网，关闭其它网线路，只保留1台电脑上网，结果发现网络异常，为了进一步验证是否ARP，单独换了另外一台电脑测试，结果仍是网络异常，为此，基本断定是路由器所为&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;到这里就有一个大大大的悬念了：路由器也会中病毒？您猜猜？您信不？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;断定是路由器问题之后：采用了&amp;#8220;重启路由&amp;#8221;和&amp;#8220;恢复出厂&amp;#8221;多种策略，结果还是网络异常，病毒根深蒂固到这地步，连&amp;#8220;恢复出厂&amp;#8221;都搞它不定！！！&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这里报一下路由器型号是腾达I4，非常古老的具有历史的路由器，不带无线功能。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这时，已经特别纠结了，连恢复出厂都无效，你还要我怎么着？？？如果是你，又会怎么着？？？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;上天总会在特别时候眷顾一些特别的人，路由器突然变神经质了，网络一会显示断线，一会显示链接，无法上外网了，OH MY G，这下我火了！！！！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;死马当活马医了，革路由的命，必须的：升级路由器软件。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;扯开了路由，直接拔号上网，到了腾达官网下载了I4版本的路由最新版软件，直接升级。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;你看怎么着？网络正常了，灵异事件消失了！！！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;写到这里，迷底已经解开了，也没啥好神秘了，就是路由器软件问题！！！记住，是腾达I4&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: red"&gt;至于是不是中病毒被修改了，还是原来的路由软件程序写的就有问题，这个留下给大伙猜了，你猜，你猜，你猜猜猜猜。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;备注：关于TextBox和User-Agent的终身大事，就留给有缘人，或某天有空时再解迷了！！！！&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cyq1162/aggbug/2315467.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2012/01/07/2315467.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cyq1162/archive/2011/12/29/2305933.html</id><title type="text">半解TextBox灵异事件背后神秘的深度灵异事件</title><summary type="text">就在前几天，当我来到当下所在的网络时，查看微博粉丝精灵后台时，一件很灵异的事情发生了：TextBox变小了,究竟有多小？我给大伙截一下当前网络下博客园后编辑框：天正想打10086问下看看有没有头绪，再次访问服务器，查看，晕了，恢复正常了！！难道是我发布的文章被“神秘黑客”发觉了，于是故意恢复的？</summary><published>2011-12-29T04:47:00Z</published><updated>2011-12-29T04:47:00Z</updated><author><name>路过秋天</name><uri>http://www.cnblogs.com/cyq1162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cyq1162/archive/2011/12/29/2305933.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cyq1162/archive/2011/12/29/2305933.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font color="red"&gt;TextBox灵异事件：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;就在前几天，当我来到当下所在的网络时，查看&lt;/strong&gt;&lt;a href="http://www.cyqdata.com/fensi" target="_blank"&gt;&lt;strong&gt;微博粉丝精灵&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;后台时，一件很灵异的事情发生了：TextBox变小了,&lt;/strong&gt;&lt;strong&gt;究竟有多小？我给大伙截一下当前网络下博客园后编辑框：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://www.cyqdata.com/Upload/Editor/20111229/033354.jpg" align="absMiddle" border="0" /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;看到了吧，摘要变小了，当时的第一反应是，神马情况？赶紧访问本地的后台，发现正常，难道，黑客入侵了？赶紧再上传复盖一次，情况还是一样。&lt;/p&gt;&lt;p&gt;这让我很纠结，赶紧让另一个有权限的弟兄访问看一下，对方说正常，OH，正常就好，免的自己吓自己，正常就是这个框应该很大，有宽度和高度，由于近两天折腾&lt;a href="http://www.cyqdata.com/" target="_blank"&gt;秋色园&lt;/a&gt;深度优化比较忙，因此忽略了一下这个事件。&lt;/p&gt;&lt;p&gt;之后回到老地方上网，也是正常的，更是忘了这问题，今天再度回到这网络，发现还是变小了，刚好有点空，于是开始追寻这问题的根源。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="red"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="red"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;为了更简单清晰的说清灵异本质：TextBox灵异事件&lt;/font&gt;&lt;/strong&gt;二度解析：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ASPX页面上原始TextBox代码：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;asp:TextBox ID="txtSql" runat="server" Height="298px" TextMode="MultiLine" Width="97%"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正常应该生成的html，有style带有宽和高：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;textarea name="txtSql" rows="2" cols="20" id="txtSql" style="height:202px;width:97%;"&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;灵异时却生成的html，style不见了：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;textarea name="txtSql" rows="2" cols="20" id="txtSql"&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="green"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="green"&gt;于是，结果就是如上图的那么小。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#008000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#008000"&gt;恰逢秋色园QBlog优化告一小段落，于是腾出点时间出来追踪一下原因：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#008000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="red"&gt;方法一：基础排除法&lt;strong&gt;&lt;font color="#ff0000"&gt;灵异本质&lt;/font&gt;&lt;/strong&gt;：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1：首先：排除电脑系统环境因素&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由于个人带着笔记本两边走，因此基本上排除是电脑的差异引发的问题。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2：其次：排除网络差距化因素[这个很神秘]&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;由于在旧所访问是正常的，因此，我一反应是设置代理访问。&lt;/p&gt;&lt;p&gt;所先寻找到国内代理IP：通过代理&amp;#8220;北京&amp;#8221;IP访问，问题依旧。&lt;/p&gt;&lt;p&gt;由于服务器在国外，因此找了国外的代理&amp;#8220;美国&amp;#8221;IP试了访问，问题仍依旧。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;到这里就很纠结，感觉相当的神秘了，究竟是什么，造成了这么灵异的事件？？？神秘神秘特神秘！！！&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="red"&gt;方法二：源码追寻法：直击TextBox源码，试图找出问题根源：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;既然最原始的问题来源于TextBox，看下其源码有啥特别没有先：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;打开了Reflector，F3搜索TextBox，由于问题是style的宽和高没出来，因此追寻宽和高两个属性。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;扫了一下TextBox，自身并没有宽和高属性，两个属性继承其基类WebControl的，直接查看Width属性源码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;[DefaultValue(typeof(Unit), ""), WebSysDescription("WebControl_Width"), WebCategory("Layout")]&lt;br /&gt;public virtual Unit Width&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!this.ControlStyleCreated)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Unit.Empty;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.ControlStyle.Width;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ControlStyle.Width = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;发现只有!this.ControlStyleCreated时，才会返回Unit.Empty，因此自然的就点进ControlStyleCreated：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false), WebSysDescription("WebControl_ControlStyleCreated"), EditorBrowsable(EditorBrowsableState.Advanced)]&lt;br /&gt;public bool ControlStyleCreated&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (this.controlStyle != null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;只有一行this.controlStyle，很自然又点击controlStyle进去，这一点，一看，我震精了：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://www.cyqdata.com/Upload/Editor/20111229/040139.jpg" align="absMiddle" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这么一个大&amp;#8220;SB&amp;#8221;在我眼前，弄的我都不好意思看下去了。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;于是草草扫了几眼，见通篇属性都是用ViewState保存着，似乎与ViewState有着某种联系，于是调整界面相关的ViewState开启又关闭，升级又复盖，结果仍是一样。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;由于源码过多，又无法调试，加之一堆&amp;#8220;特性&amp;#8221;和我正负极相坼，于是另寻方法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="red"&gt;方法三：网络请求模拟拦截追寻问题：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;由于最新习惯了原始的抓包比较，于是打开了Fiddler，直接构造一个请求访问本机：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://www.cyqdata.com/Upload/Editor/20111229/041507.jpg" align="absMiddle" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这一访问不得了，竟然出现了和服务器一样的灵异事件，文本框返回的style属性不见了。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;由于之前用浏览器访问是正常的，于是的直接拦截浏览器对本机的请求，发现是正常的有style属性，通过比较，唯一的区别竟然是在&amp;#8220;User-Agent&amp;#8221;这个属性上。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="red"&gt;于是，通过多次反复证实，TextBox竟然会和&amp;#8220;User-Agent&amp;#8221;扯上关系。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;而且这关系又很灵异，不是判断User-Agent有没有，而是随意造一个假的User-Agent，也是显示不出来的style属性的。&lt;/p&gt;&lt;p&gt;再经过多次试验证实，其生成的style属性的样式，基本上都有&amp;#8220;User-Agent&amp;#8221;扯上关系，不仅如此，&lt;strong&gt;博客园后台的编辑器也出不来&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="green"&gt;灵异事件到此，终于截到最本质的答案了，前后花了两个小时差不多，当然，灵异的背后，User-Agent和TextBox属性的输出，究竟有着何种深度的关系？时间太晚了，就保留到下次再研究了。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#008000"&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="red"&gt;灵异事件再次升级：&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;既然发现了&amp;#8220;User-Agent&amp;#8221;是神秘的主宰，那么，本机发出的请求，究竟发生了什么事情？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由于Fiddler只能拦截从本机发出的请求头，然后这个请求头到达服务器的过程，究竟发生了什么事情？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;为了追寻这个问题，我在服务器直接设置了把发过来的请求头直接输出，这个一输，吓偶一大跳：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Mozilla/4.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.0.11)&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;本机所有浏览器发出的请求，到达服务器，全是这个请求头！！！！！！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="green"&gt;竟然还是zh-TW，台湾？这是神马情况？网络被黑客拦截了？这个，地球也太危险了吧！！！&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;留下这未解之迷，该睡了。。。。。。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以上文章写于凌晨四点半，这个可以见首发文章地址：&lt;a href="http://www.cyqdata.com/cyq1162/article-detail-53227"&gt;http://www.cyqdata.com/cyq1162/article-detail-53227&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;今天正想打10086问下看看有没有头绪，再次访问服务器，查看，晕了，恢复正常了！！！请求头也恢复正&lt;strong&gt;常了。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;难道是我发布的文章被&amp;#8220;神秘黑客&amp;#8221;发觉了，于是故意恢复的？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如果只是一瞬间的问题，为何持续的时间，从前几天就开始，就到凌晨我发现问题到写完文章，睡一觉就恢复了？？？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;再多的巧合，也解答不了这深度的迷惑，只好留下一些疑问，让过客解答&lt;/strong&gt;。。。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cyq1162/aggbug/2305933.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cyq1162/archive/2011/12/29/2305933.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
