﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园首页</title><link>http://www.cnblogs.com/</link><description>技术改变世界</description><language>zh-cn</language><lastBuildDate>Sat, 04 Jul 2009 07:07:57 GMT</lastBuildDate><pubDate>Sat, 04 Jul 2009 07:07:57 GMT</pubDate><ttl>60</ttl><item><title>GPRS管理与创建APN拨号连接</title><link>http://www.cnblogs.com/michael-zhangyu/archive/2009/07/04/1516797.html</link><dc:creator>老羽</dc:creator><author>老羽</author><pubDate>Sat, 04 Jul 2009 06:16:00 GMT</pubDate><guid>http://www.cnblogs.com/michael-zhangyu/archive/2009/07/04/1516797.html</guid><comments>http://www.cnblogs.com/michael-zhangyu/archive/2009/07/04/1516797.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/michael-zhangyu//comments/commentRss/1516797.html</wfw:commentRss><description><![CDATA[摘要: 本文主要介绍一些GPRS管理与创建APN拨号连接相关的知识点。新建拨号连接利用RAS实现，本文将详细介绍我在实现创建APN拨号连接时的一些经验，目前来说创建APN连接的资源非常少，尤其是c#实现的很少...<img src ="http://www.cnblogs.com/michael-zhangyu/aggbug/1516797.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/michael-zhangyu/archive/2009/07/04/1516797.html" target="_blank">http://www.cnblogs.com/michael-zhangyu/archive/2009/07/04/1516797.html</a><br/>作者博客: <a href="http://www.cnblogs.com/michael-zhangyu/" target="_blank">http://www.cnblogs.com/michael-zhangyu/</a> <a href="http://www.cnblogs.com/michael-zhangyu/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a>]]></description></item><item><title>九种不够面向对象的对象</title><link>http://www.cnblogs.com/DesignPatterns/archive/2009/07/04/nine-non-oo-o.html</link><dc:creator>勇敢的鸵鸟</dc:creator><author>勇敢的鸵鸟</author><pubDate>Sat, 04 Jul 2009 05:07:00 GMT</pubDate><guid>http://www.cnblogs.com/DesignPatterns/archive/2009/07/04/nine-non-oo-o.html</guid><comments>http://www.cnblogs.com/DesignPatterns/archive/2009/07/04/nine-non-oo-o.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/DesignPatterns//comments/commentRss/1516780.html</wfw:commentRss><description><![CDATA[<p><em>本文发表在《程序员》2009年第四期（总第100期）</em> </p><p>本文列出了我在平时发现和积累的在面向对象编程中一些常见的&#8220;不够面向对象&#8221;的情况。  </p><p>需要指出两点：  </p><p>1.我们虽然列出了这九种情况，但并不是说出现了下面的情况就一定有问题了；我们希望读者这可以将其作为一种信号&#8212;&#8212;仔细考虑一下是不是有更好的设计。  </p><p>2.我们这里所说的面向对象的对象特指领域对象，即对象中包含领域数据和业务逻辑。  </p><p>要确定不够面向对象的对象，首先要了解什么样的对象算是面向对象的，或者说好的面向对象的对象。关于面向对象设计的原则从不同的角度有很多种说法，我们这里采用一种比较简单的说法，即高内聚低耦合。所谓高内聚是指对象内的数据和方法是紧密相关的；所谓低耦合是指对象之间的依赖应当比较小，一个对象发生改变时不应当对不相关的对象产生影响。  </p><h3>一. 低内聚对象 </h3> <p>我们把低内聚对象分为两种：一种是应该属于该对象的行为和数据分散到了其他对象中；另一种是该对象内部的行为和数据关系不够紧密。下面的1、2是属于前一种情况，3、4、5则是属于后一种情况。 </p><h4>1.贫血对象（Anemic Object） </h4> <p>瞧，那条贫血的狗！<br />故事的发生是这样的...<br />你养了一条宠物狗，在学习了面向对象编程之后，你打算为这条狗设计一个面向对象的系统。于是，根据你在C语言编程时的开发经验，结合你对&#8220;封装&#8221;二字的理解，你设计了这样一条狗：）这条狗由四部分组成：头、身子、腿和尾巴。 </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image002_2.jpg"><img title="clip_image002" style="border: 0px none ; display: inline;" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image002_thumb.jpg" border="0" height="118" width="244" /></a> </p><p>图 1 </p><p>隔壁住着一位面向对象大师&#8212;&#8212;法号鉴摩，你拿着设计图给他看。鉴摩大师只扫了一眼便说：<br />没有行为的对象不是好对象。 </p><p>你似懂非懂地点了点头，正要往下说，大师挥了挥手说：&#8220;你明天再来罢。&#8221; </p><p>如果一个对象只有数据没有行为，它就是一个贫血对象，它只能被别人操作，或者作为某个操作的结果。对于简单的getter和setter，我们一般不将其归为领域行为。所以，上面这个对象就是一个贫血对象。这条狗还不会叫、不会跑，甚至还不会摇尾巴讨好你，真不知道你养这样一条狗干啥。 </p><p>处理贫血对象时可以考虑把操作对象数据的行为移动到这个对象里面。对数据的封装只是面向对象中&#8220;封装&#8221;这个概念的一部分，我们的对象中除了封装数据还应当封装行为。  </p><p>对于跟物理世界一一对应的对象，一般来说，我们不容易犯这样的错误。我们不妨来看一个实际工作中遇到的例子。在某个商店收银系统中，有一个对象叫做Product，它被设计成这样：  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image004_2.jpg"><img title="clip_image004" style="border: 0px none ; display: inline;" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image004_thumb.jpg" border="0" height="132" width="244" /></a> </p><p>图 2  </p><p>这个Product就是一个贫血类。单纯看这个类，是没有什么问题的。我们需要结合其他的类来观察。由于不同类型的产品打印方式不同，计税规则也不同，所以我们还有一个处理Product的类：&nbsp; </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image006_2.jpg"><img title="clip_image006" style="border: 0px none ; display: inline;" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image006_thumb.jpg" border="0" height="134" width="244" /></a> </p><p>图 3 </p><p> 我们可以明显的看出在这两个类的方法中存在非常相似的代码结构。如果Product的类型出现扩展，我们在这两个类（Product、ProductHandler）里面都需要做修改。这不符合面向对象编程中OCP原则。对于贫血对象的改进应当考虑将相关的行为移动到对象里面。&nbsp; </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image008_2.jpg"><img title="clip_image008" style="border: 0px none ; display: inline;" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image008_thumb.jpg" border="0" height="190" width="244" /></a> </p><p>图 4  </p><p>如果我们发现相关行为移动到Product中去后ProductHandler所做的事情仅仅是将调用转发给Product，可以考虑将这个类消除。这里我们没有将Product形成继承结构，有兴趣的同学可以参考《重构》一书中的&#8220;以多态取代条件式&#8221;。 </p><p>引申阅读：  </p><p>1.《重构》一书种关于&#8220;以多态取代条件式&#8221;的内容。 </p><h4>2.管理者对象（Manager Object） </h4> <p>狗摇尾巴，还是摇狗尾巴，这是个问题！ </p><p>第二天，你拿着另一个对象的类图去找鉴摩大师。你对鉴摩大师说：&#8220;我想大师昨天的意思是说我设计的Dog对象没有行为吧，其实所有的行为我都放到这个DogController对象中了。&#8221;  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image010_2.jpg"><img title="clip_image010" style="border: 0px none ; display: inline;" alt="clip_image010" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image010_thumb.jpg" border="0" height="137" width="244" /></a> </p><p>图 5 </p><p>大师看了一下你的图，说道：&#8220;到底是狗摇尾巴，还是你在摇狗尾巴？&#8221;<br />你不解道：&#8220;这样有什么不同吗？&#8221;<br />鉴摩大师闭着眼睛说道：<br />不要问我，告诉我。<br />你更加迷惑了。不过你知道&#8220;知之为知之，不知Google之&#8221;的名言，所以你用大师的话为关键字Google了一下，还真有不少内容。<br />我们经常会看到一些类命名为：XxxxManager、XxxxHandler。这样类表面上是面向对象的，但其实质往往是面向过程的，只不过在外面包了一个Class而已。管理者对象往往是跟贫血对象成对出现的，业务数据保存在贫血对象中，而业务逻辑行为（或者从数据的角度来说也可以称为&#8220;对数据的操作&#8221;）则在管理者对象中。<br />管理者对象的问题是其中的各个方法之间的关系非常不明显，它们往往只是共享一个被操作的数据对象。去掉其中的几个方法，这个对象似乎还是一个完整的对象。上例中ProductHandler就是一个管理者对象的例子。 </p><p>对于管理者对象，最基本的解决方法就是职责分组。首先创建或者从系统中找出相关的领域对象，尽量地将职责划分到多个领域对象中去。当管理者对象和贫血对象成对出现时，往往部分跟业务紧密相关的贫血对象既是领域对象。分层、数据字典都是常用的提取领域对象的方法。  </p><h4>3.储柜对象（Cabinet Object） </h4> <p>狗尾巴不见了！ </p><p>第三天，你的朋友送了一条狗给你，并告诉你是在路边捡到的。所以，你需要在你的系统中再添加一只小狗啦。根据你丰富的内存管理方面的经验，你认为在内存中保留两个实例，实在是浪费，所以你扩展了一下API。你把新的设计方案交给鉴摩大师去看。  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image012_2.jpg"><img title="clip_image012" style="border: 0px none ; display: inline;" alt="clip_image012" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image012_thumb.jpg" border="0" height="232" width="244" /></a> </p><p>图 6 </p><p>鉴摩大师冷漠地看了你一眼，仿佛看到一个陌生人似的，大师慢悠悠地说道：<br />今天的你不是昨天的你。<br />你一脸茫然地回到自己家里，突然发现狗尾巴不见了。谁调用了setTail(NULL)!  </p><p>所谓储柜对象，是指它所有的数据都是可以通过setter动态设置的。也就是说getter返回什么或者对象的行为如何表现，完全取决于当时的设置了什么。这个对象中的数据，看起来就像临时分配的一块可读写的内存。 </p><p>储柜对象的问题在于，我们编写和阅读代码的时候很难把握这种对象，因为其状态随时可能会被修改，而修改其状态的行为又分散在其他的地方。解决这个问题，可以先把储柜对象处理为Immutable Value，即在构造函数中传入必要的参数，只为那些可以动态修改的状态保留setter方法。如果有必要，还可以通过&#8220;以多态取代条件式&#8221;重构形成一个继承结构。  </p><h4>4.多管闲事的对象（Meddling Object） </h4> <p>你们家的狗会拿耗子吗？<br />你的朋友真好，第四天又送了一只猫给你。你已经开始庆幸自己学习了面向对象，这门支持&#8220;派生&#8221;的技术。你本来想直接从Dog派生一个Cat出来，觉得似乎有点问题。算了，你决定来个重新设计吧。为了用到面向对象里面最好用的技术&#8212;&#8212;继承，你决定对狗和猫进行抽象，产生一个宠物（Pet）对象。好的，狗和猫有什么共同点呢？很快，结果出来了：  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image014_2.jpg"><img title="clip_image014" style="border: 0px none ; display: inline;" alt="clip_image014" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image014_thumb.jpg" border="0" height="180" width="244" /></a> </p><p>图 7 </p><p>你甚至记得把Pet中makeSound和catchRat设计为抽象函数，让Dog和Cat分别实现。你高兴地拿给鉴摩大师去看。大师瞅了你一眼，问到：&#8220;你们家的狗会拿耗子？&#8221;<br />你狡黠一笑：&#8220;大师您看，我的catchRat是抽象函数，在Dog中实现地行为是&#8216;do nothing&#8217;。&#8221;<br />&#8220;如果你们家有一百条狗，一百只猫呢？&#8221;大师说这句话的时候甚至连看都没看你一眼。过了一会儿，大师继续说道：<br />把变化的和不变的分离开。<br />你悻悻地回到家里，陷入了沉思...<br />对于一个对象而言，多管的闲事不属于自己的业务逻辑（虽然很可能有某种联系），我们应当把相关的代码完全隔离出去或者将相关职责委托给新的对象实现。隔离和委托的区别在于原对象是否持有新对象的引用。一般来说，委托的方式使用的更多一些，而且实现上也比较直观。对于上例而言，我们可以做如下的改进：  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image016_2.jpg"><img title="clip_image016" style="border: 0px none ; display: inline;" alt="clip_image016" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image016_thumb.jpg" border="0" height="113" width="244" /></a> </p><p>图 8 </p><p>不恰当的抽象只是造成&#8220;多管闲事的对象&#8221;的原因之一。更常见的情况是，我们懒得为一个小功能创建一个新的类。比如下图就是一个实际工作中遇到的例子。  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image018_2.jpg"><img title="clip_image018" style="border: 0px none ; display: inline;" alt="clip_image018" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image018_thumb.jpg" border="0" height="92" width="244" /></a> </p><p>图 9  </p><p>在计税的时候，我们需要做一些四舍五入的工作，这些职责本应该委托给一个工具类来完成。<br />引申阅读：<br />1.爱管闲事的对象违反了单一职责原则（SRP），容易导致设计不稳定。请参考有关SRP的文章。推荐《敏捷软件开发：原则、模式与实现》第8章。<br />2.《设计模式：可复用面向对象软件的基础》中关于在实现Composite模式时，安全性和透明性之间的权衡。  </p><h4>5.工具类（Utility Class） </h4> <p>你的设计越来越完善了！<br />第五天，你开始设计一些工具方法，给狗狗洗澡、喂食，可是这些方法放到哪儿呢？既然不能违反SRP原则，你决定每个工具方法设计一个类，但是看上去这些类也太简单了。&nbsp;&nbsp; </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image020_2.jpg"><img title="clip_image020" style="border: 0px none ; display: inline;" alt="clip_image020" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image020_thumb.jpg" border="0" height="173" width="176" /></a> </p><p>图 10  </p><p>你把自己的想法和顾虑告诉鉴摩大师，大师摇了摇头，随后说道：<br />物以类聚。易懂易维护才是我们的目标。 </p><p>说工具类不够OO听上去有点奇怪，因为它根本不需要实例化，所以也不会形成真的对象。工具类的典型特征是里面的函数都是静态的。这些静态的函数之间往往没有必然的联系，甚至都不会共享数据，所以它们本质上是非内聚的。这里，并不是说不应当有工具类，而是工具类的角色很多时候都是提供一种转换或者值操作，不包含领域逻辑，因而不属于领域对象。把这些方法放到一个对象里面，就像给它们归归类而已。所以，如果一个类是工具类，就让它扮演好这个光荣的角色吧，别往里面放业务逻辑。如果有些转换明显跟业务逻辑靠得比较紧，而又不适合放到领域对象里面，可以将其单独做一个工具类，将其跟通用的、业务无关的工具类分开。  </p><p>简单工厂类是工具类的一种，所谓简单工厂是相对于抽象工厂和工厂方法来说的，它只是根据输入值返回一个领域对象。  </p><h3>二.高耦合 </h3> <p>高耦合一般表现为对其他类型的强烈依赖，一个对象发生变化会对其他对象产生剧烈的影响。我们的原则是尽量依赖于稳定的类型（或接口）。 </p><h4>6.原生类型依赖对象（Primitive Obsession Object） </h4> <p>这只狗的生日是01/02/03。<br />第六天，你决定在Pet对象中加入狗狗和猫咪的生日。这项工作对于你来说已经算不上什么难事了。  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image022_2.jpg"><img title="clip_image022" style="border: 0px none ; display: inline;" alt="clip_image022" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image022_thumb.jpg" border="0" height="147" width="192" /></a> </p><p>图 11  </p><p>你把程序交给大师去看，大师输入了一串字符串，运行的结果是：这只狗的生日是01/02/03。大师问你：&#8220;这是什么意思？01年2月3日还是03年1月2日？&#8221;<br />你满脸冒汗，因为你已经不记得自己怎么定义的了。大师微笑着说：<br />不要依赖于你自己都会忘记的事情。封装之。<br />你回到家里，百思不得其解。&#8220;难道我值得为一个生日设计一个类吗？&#8221; </p><p>有的对象强烈依赖于语言的原生类型，比如字符串、整型数字等。正常情况下，依赖于原生类型是没有危险的，因为这些类型相当稳定，向着稳定依赖正是我们的原则。但是，如果我们同时依赖于这些原生类型的表达方式，比如字符格式、用整型表达的类型，会使得我们的系统设计变得不稳定。  </p><p>我们再来看一个实际工作中的例子吧。  </p><p>我们要分析两个城市之间的路径，有的同学将从城市A经城市B到达城市C的路径用&#8220;ABC&#8221;来表示，有的同学则用&#8220;A-B-C&#8221;来表示。如果对象依赖于这样的字符串，编程中就很容易出错，而且一旦表达格式发生了变化，程序还需要作出相应的修改。  </p><p>一般来说，在系统中总是有一些对象要依赖于原生类型，但是我们应当尽量早地使用领域对象对原生类型做封装。比如，一开始的设计是这样的：  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image024_2.jpg"><img title="clip_image024" style="border: 0px none ; display: inline;" alt="clip_image024" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image024_thumb.jpg" border="0" height="81" width="220" /></a> </p><p>图 12  </p><p>我们可以对route进行封装，使其不再依赖于字符串的格式。  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image026_2.jpg"><img title="clip_image026" style="border: 0px none ; display: inline;" alt="clip_image026" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image026_thumb.jpg" border="0" height="45" width="244" /></a> </p><p>图 13  </p><p>这时候，要添加城市A只要调用Route:addCity("A")就可以了。  </p><h4>7.链式依赖对象（Message Chain Object） </h4> <p>一只狗拴一条链子就够了！<br />第七天，你的朋友跑过来说，他找到了那只路边捡到的小狗的主人，并告诉了你他的电话。你决定把这个电话记录在你的系统中。  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image028_2.jpg"><img title="clip_image028" style="border: 0px none ; display: inline;" alt="clip_image028" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image028_thumb.jpg" border="0" height="40" width="244" /></a> </p><p>图 14  </p><p>你把设计交给大师去看。大师看了看类图就去翻你的代码，然后皱了皱眉头，用手指着一行代码&#8220;dog.getOwner().getAddresss();&#8221;说道：<br />决定一个对象好坏的是它的使用者。<br />你看着那行代码，若有所思的点点头。  </p><p>且不说，这个代码违反了&#8220;Tell，Don't Ask&#8221;原则，就这种链式导航结构就会使得客户端与链条上的所有对象直接耦合。一旦对象之间的关系发生任何变化，都会引起客户端的变化，这违反了迪米特法则，又称最少知识原则。要解决这个问题可以在链条中找一个合适的对象添加一个函数。比如，上例中我们可以为Dog添加一个getOwnerAddress()函数。这样在客户端要取得主人的地址就只要依赖于Dog对象就可以了：dog.getOwnerAddress()。  </p><p>我们要特别强调，上述解决方案只是最简单的方案之一，而且不一定是最佳方案。如果链式调用出现的次数不多甚至可以不做修改。 </p><p>引申阅读：  </p><p>1.《重构》中关于Message Chains的内容。  </p><p>2.《程序员修炼之道》中关于迪米特法则的内容。 </p><h4>8.假对象（Dummy Object） </h4> <p>需要为邻居家的宠物单独设计一个类吗？<br />第八天，你的邻居看到了你设计的系统，非常感兴趣，希望你能把他们家的宠物也纳入进来。你非常高兴地答应了，因为邻居家的女主人非常热情。因为你的系统里面已经有了Owner的概念，你决定为邻居家的宠物派生一个专门的类。而且你把这个决定告诉了邻居mm，让她觉得你专门为她做了一件天大的事情。  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image030_2.jpg"><img title="clip_image030" style="border: 0px none ; display: inline;" alt="clip_image030" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image030_thumb.jpg" border="0" height="121" width="244" /></a> </p><p>图 15  </p><p>你把新的设计交给大师去看，大师瞅了一眼，说：<br />多一个类就多一份牵挂。<br />你的脸一红，因为你不知道大师是在说设计还是说你。 </p><p>系统中每增加一个类，系统的复杂性就会提高一点。每个类都是有代价的。尽管小对象往往是我们追求的目标，但是如果对象小到不仅没有专属自己的数据，也没有专属自己的行为，这样的对象还是不要的好。假对象经常出现在类的派生体系中。在倒数第二层的抽象类中已经做足了数据和方法，假对象往往只要在构造函数中填空就行了。图15正是这样的情况。  </p><p>解决这种问题的一个方法是引入合适的&#8220;工厂&#8221;模式。比如，对于这个例子，我们可以将其修改为：  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image032_2.jpg"><img title="clip_image032" style="border: 0px none ; display: inline;" alt="clip_image032" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image032_thumb.jpg" border="0" height="50" width="244" /></a> </p><p>图 16  </p><p>引申阅读：<br />1.《重构》一书中关于折叠继承体系、将类内联化的内容。 </p><h4>9.积木对象（Bricks Object） </h4> <p>创建一只狗到底要分多少步？<br />第九天，你对修改后的设计已经充满了信心。你把整个设计拿给鉴摩大师去看。鉴摩大师问到：&#8220;你怎么创建一只宠物？&#8221;<br />你说：&#8220;我先创建PetHead、PetBody、PetLegs和PetTail，然后把它们跟相应的生日和主人信息一起传入PetFactory的工厂方法中，就可以返回一只完整的宠物了。&#8221;<br />大师问：&#8220;你怎么保证别人创建宠物的时候记得这么复杂的步骤呢？&#8221;<br />你简直怀疑大师在故意为难你了：&#8220;难道我的PetFactory的参数列表不够清晰吗？你是说让我增加点注释吗？&#8221;<br />大师摇了摇头，轻轻地吐出两个字：<br />封装。<br />封装？你简直不相信自己的耳朵，难道我做了九天了，又回到了面向对象的原点？<br />当对象的创建可以分为多个步骤时，为了防止在步骤上出错，我们经常要对这些步骤进行封装。否则对象的创建将依赖于（耦合于）代码中未指明的步骤，这可不是闹着玩的。同样道理，如果某件事情要求对几个函数按照某个顺序进行调用，也需要对其进行封装。<br />封装对象创建的步骤经常采用Builder模式，当然我们也可以采用比较简单的方案，即尽量在被创建对象的内部创建自己的各个组成部分。封装对几个函数的顺序调用，为其另外提供一个函数在该函数中按照要求的顺序完成调用。图17是采用内部创建各组成部分的方式设计的对象继承结构。  </p><p><a href="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image034_2.jpg"><img title="clip_image034" style="border: 0px none ; display: inline;" alt="clip_image034" src="http://images.cnblogs.com/cnblogs_com/DesignPatterns/WindowsLiveWriter/56509d34d749_4721/clip_image034_thumb.jpg" border="0" height="127" width="244" /></a> </p><p>图 17 </p><p>引申阅读：<br />1.《重构与模式》中关于组合方法、链构造函数、用Creation Method替换构造函数、用Builder封装Composite的内容。<br />2.《设计模式：可复用软件对象的基础》种关于创建型模式的内容。<br />第十天，大师问你：&#8220;什么样的对象算是好对象呢？&#8221;<br />你说：<br />好的对象添一分则嫌多，减一分则嫌少。<br />大师笑而不语。翌日，你再去找大师，大师已经离去了。 </p><h4>结语 </h4> <p>实际上，对于如何认识和理解面向对象，业界也有很多争论，其中有代表性的是斯堪的纳维亚学派（Scandinavian school）和美国学派（American School）。前者强调对真实世界中的&#8220;对象&#8221;建模&#8212;&#8212;即类是由一组数据和支持这些数据的方法组成；后者强调行为封装&#8212;&#8212;即类是由一组方法和支持这些方法的数据组成。前者的典型代表语言是Simula，后者的典型代表语言则是Smalltalk（我并不想较真，但是较真的读者可能会看到一些说法认为Simula是Smalltalk之母的说法，恕我不擅考究）。以GoF、Martin Fowler、Robert C. Martin等人为代表的美国学派在这场争论中占有优势。实际上，本文从某种程度上也是引导读者从斯堪的纳维亚学派向美国学派靠拢。<br />面向对象技术出现的目的是让编写代码更容易，然而有意思的是，对于初学者来说面向对象语言要比面向过程语言更难理解和接受。实际上，要做出好的面向对象设计需要长时间的经验积累。我在上面列出了一些相关的书籍，除了阅读之外更重要的是要在实践中摸索和体会。掌握了基本地面向对象设计的技能之后，可以继续学习有关设计模式、重构、测试驱动开发等内容，这些对于深入理解面向对象概念有很大的帮助。<br />在面向对象编程中，考察对象设计的好坏关键是看该对象的客户端是否能够方便地使用它；它所应用的环境中是否体现出自己的价值，特别是在环境和需求变化时是否能够比较容易地适应。这句话反过来也是成立的，即我们在设计对象的时候也应当从环境和客户端的角度去思考。这种思路往往能给我们带来额外的好处，比如容易测试、容易面向接口编程、容易实现依赖倒置。这是一个更加深入的话题，希望有机会跟大家分享和交流。 </p><h4>后记 </h4> <p>当我开始写这篇文章的时候我就意识到这不是一个容易成文的话题，因为不够面向对象的情况实在是太多了，不可能用九种来概括。从某种意义上讲，Martin Fowler在《重构》一书中所列出的&#8220;坏味道&#8221;都属于不够面向对象的情况，或者至少说是&#8220;不够好的面向对象&#8221;。所以本文列出的九种情况不追求全面，更不追求正交，而是追求实用。我的目的是为刚刚接触面向对象编程的程序员&#8212;&#8212;特别是从非面向对象编程转到面向对象编程的同学&#8212;&#8212;提供一个容易比照的检查列表。<br />感谢我的同事和朋友们在本文成文过程中给予的帮助。  </p><img src ="http://www.cnblogs.com/DesignPatterns/aggbug/1516780.html?type=1" width = "1" height = "1" /><br/><br/>-------------------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/DesignPatterns/archive/2009/07/04/nine-non-oo-o.html" target="_blank">http://www.cnblogs.com/DesignPatterns/archive/2009/07/04/nine-non-oo-o.html</a><br/>作者博客: <a href="http://www.cnblogs.com/DesignPatterns/" target="_blank">http://www.cnblogs.com/DesignPatterns/</a> <a href="http://www.cnblogs.com/DesignPatterns/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</a>]]></description></item><item><title>.NET object to JSON</title><link>http://www.cnblogs.com/zhucai/archive/2009/07/04/dotnet_object_to_json.html</link><dc:creator>朱才</dc:creator><author>朱才</author><pubDate>Sat, 04 Jul 2009 05:04:00 GMT</pubDate><guid>http://www.cnblogs.com/zhucai/archive/2009/07/04/dotnet_object_to_json.html</guid><comments>http://www.cnblogs.com/zhucai/archive/2009/07/04/dotnet_object_to_json.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/zhucai//comments/commentRss/1516778.html</wfw:commentRss><description><![CDATA[<p>首先，WCF直接提供了返回JSON对象。</p><p>如果我们没有使用WCF，我们可以通过<a href="http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.json.datacontractjsonserializer.aspx" title="System.Runtime.Serialization.Json.DataContractJsonSerializer">System.Runtime.Serialization.Json.DataContractJsonSerializer</a>类(System.ServiceModel.Web.dll)或<a href="http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.aspx" title="System.Web.Script.Serialization.JavaScriptSerializer">System.Web.Script.Serialization.JavaScriptSerializer</a>类(System.Web.Extensions.dll)。<br /></p><p>昨天在使用DataContractJsonSerializer类的时候发生件奇怪的事情，同样的代码在我机子上可以运行，在另一台机子上却运行不过。抛出不可序列化的运行时异常。提示需要在序列化的类上加定制特性Serializable，或者类上加DataContract且成员加DataMember。<br />在类上使用Serializable，会序列化字段，而非属性，输出的不是我想要的(一堆小写的字段，我要的是大写的公有属性)。而使用DataContract和DataMember，则必须每个要输出的属性都加上DataMember，这也比较麻烦，不是我希望的。然后同事找到了JavaScriptSerializer类，</p><p> 经测试，不需要显式的添加定制特性，它会默认输出所有公有属性。OKay，这便是我想要的。<br /></p><img src ="http://www.cnblogs.com/zhucai/aggbug/1516778.html?type=1" width = "1" height = "1" /><br/><br/>-------------------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/zhucai/archive/2009/07/04/dotnet_object_to_json.html" target="_blank">http://www.cnblogs.com/zhucai/archive/2009/07/04/dotnet_object_to_json.html</a><br/>作者博客: <a href="http://www.cnblogs.com/zhucai/" target="_blank">http://www.cnblogs.com/zhucai/</a> <a href="http://www.cnblogs.com/zhucai/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a>]]></description></item><item><title>带智能提示的百度搜索框 —— 新：支持多种浏览器</title><link>http://www.cnblogs.com/shuziren/archive/2009/07/04/1516777.html</link><dc:creator>数字人 - 黑色风衣</dc:creator><author>数字人 - 黑色风衣</author><pubDate>Sat, 04 Jul 2009 05:03:00 GMT</pubDate><guid>http://www.cnblogs.com/shuziren/archive/2009/07/04/1516777.html</guid><comments>http://www.cnblogs.com/shuziren/archive/2009/07/04/1516777.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/shuziren//comments/commentRss/1516777.html</wfw:commentRss><description><![CDATA[<h5 class="posthead">前几天天发布一个<a href="/shuziren/archive/2009/06/06/1497590.html" id="AjaxHolder_ctl01_TitleUrl"><span style="color: #006ff7; font-size: medium;"><span style="font-size: small;"><span style="font-size: x-small;">5款超级漂亮百度及尊和搜索框代码</span></span></span></a> ，今天再发带智能提示的</h5>
<div class="postText">
<p><img src="http://pic002.cnblogs.com/img/shuziren/200906/2009060715185529.jpg" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img height="16" width="11" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_151934').style.display='none'; document.getElementById('Code_Open_Image_151934').style.display='inline'; document.getElementById('Code_Open_Text_151934').style.display='inline';" id="Code_Closed_Image_151934" style="display: none;" /><img height="16" width="11" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_151934').style.display='none'; getElementById('Code_Closed_Image_151934').style.display='inline'; getElementById('Code_Closed_Text_151934').style.display='inline';" id="Code_Open_Image_151934" /><span class="cnblogs_code_Collapse" id="Code_Closed_Text_151934">Code</span><span id="Code_Open_Text_151934"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">meta&nbsp;</span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">=Content-Type&nbsp;</span><span style="color: #ff0000;">content</span><span style="color: #0000ff;">="text/html;charset=gb2312"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">百度搜索框，带智能提示</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /><span style="color: #0000ff;">&lt;style&gt;td,a{font-family:arial}#kw{font:16px Verdana;height:1.78em;padding-top:2px}#b{height:30px;padding-top:4px}#b,#b 0 3px!important;margin:0 0 10px}#sb{height:2em;width:5.6em}#km{height:50px}#l{margin:0 0 5px 15px}#l td{padding-left:107px}p,table{width:650px;border:0}#l td,#sb,#km{font-size:14px}#l a,#l b{margin-right:1.14em}a{color:#00c}a:active{color:#f60}#hp{position:absolute;margin-left:6px}#lg{margin:-26px 0-44px}#lk{width:auto;line-height:18px;vertical-align:top}form{position:relative;z-index:9}&lt;/style&gt;</span></span><span style="color: #0000ff;"></span><span style="color: #000000;"><br />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /><br /><br /><br /><br />----把下面的代码放到需要的地方<br /><br /></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">form&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">=f&nbsp;</span><span style="color: #ff0000;">action</span><span style="color: #0000ff;">=http://www.baidu.com/s</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">=text&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">=wd&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">=kw&nbsp;</span><span style="color: #ff0000;">size</span><span style="color: #0000ff;">=35&nbsp;</span><span style="color: #ff0000;">maxlength</span><span style="color: #0000ff;">=100</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">=hidden&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">=tn&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="jqshw_pg"</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">=hidden&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">=bar&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">=""</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">=submit&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">=百度一下&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">=sb</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">form</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />----把上面的代码放到需要的地方<br /><br />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /><br /><br /><br /><br />----把下面的代码放到文件末尾<br /><br />&lt;script&gt;<br />&nbsp;var w = document.f.wd;<br />&nbsp;function s(o) {<br />&nbsp; if (w.value.length &gt; 0) {<br />&nbsp;var h = o.href;<br />&nbsp;var q = encodeURIComponent(w.value);<br />&nbsp;if (h.indexOf("q=") != -1) {<br />&nbsp; o.href = h.replace(new RegExp("q=[^&amp;$]*"), "q=" + q)<br />&nbsp;} else {<br />&nbsp; o.href += "?q=" + q<br />&nbsp;}<br />&nbsp; }<br />&nbsp;}; (function() {<br />&nbsp; if (new RegExp("q=([^&amp;]+)").test(location.search)) {<br />&nbsp;w.value = decodeURIComponent(RegExp.$1)<br />&nbsp; }<br />&nbsp;})();<br />&nbsp; document.write('&lt;script src=http://www.baidu.com/js/bdsug.js?v=1.1.0.3&gt;&lt;\/script&gt;')<br />&nbsp;window.onunload = function() {};<br />&nbsp;&lt;/script&gt;<br />&nbsp;&lt;script&gt;<br />&nbsp;w.focus()<br />&nbsp;&lt;/script&gt;<br /></span><span style="color: #0000ff;"><span style="color: #000000;"></span></span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span></span></div>
</div><img src ="http://www.cnblogs.com/shuziren/aggbug/1516777.html?type=1" width = "1" height = "1" /><br/><br/>-------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/shuziren/archive/2009/07/04/1516777.html" target="_blank">http://www.cnblogs.com/shuziren/archive/2009/07/04/1516777.html</a><br/>作者博客: <a href="http://www.cnblogs.com/shuziren/" target="_blank">http://www.cnblogs.com/shuziren/</a> <a href="http://www.cnblogs.com/shuziren/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</a>]]></description></item><item><title>C#开发WPF/Silverlight动画及游戏系列教程(Game Course)：(二十一)主位式地图移动模式</title><link>http://www.cnblogs.com/alamiye010/archive/2009/07/04/1516763.html</link><dc:creator>深蓝色右手</dc:creator><author>深蓝色右手</author><pubDate>Sat, 04 Jul 2009 04:41:00 GMT</pubDate><guid>http://www.cnblogs.com/alamiye010/archive/2009/07/04/1516763.html</guid><comments>http://www.cnblogs.com/alamiye010/archive/2009/07/04/1516763.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/alamiye010//comments/commentRss/1516763.html</wfw:commentRss><description><![CDATA[摘要: 是否期待了很久？本节就来个重量级的做为开场白吧：主位式地图移动模式。何谓主位式地图移动模式，即以主角为中心，它的移动带动着所有对象包括地图、物体对象、其他玩家、怪物等等的相对移动，这些对象的移动都是以主角为参照物的。最典型例子莫过于当前流行的MMORPG了，你控制的角色在地图中永远是处于窗口正中心的位置（除了8个角落外），这就是主位式地图移动模式（如下图）。<img src ="http://www.cnblogs.com/alamiye010/aggbug/1516763.html?type=1" width = "1" height = "1" /><br/><br/>---------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/alamiye010/archive/2009/07/04/1516763.html" target="_blank">http://www.cnblogs.com/alamiye010/archive/2009/07/04/1516763.html</a><br/>作者博客: <a href="http://www.cnblogs.com/alamiye010/" target="_blank">http://www.cnblogs.com/alamiye010/</a> <a href="http://www.cnblogs.com/alamiye010/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a>]]></description></item><item><title>一道算法引发的思考：编程之外，我们还要关注什么</title><link>http://www.cnblogs.com/winzheng/archive/2009/07/04/1516739.html</link><dc:creator>winzheng</dc:creator><author>winzheng</author><pubDate>Sat, 04 Jul 2009 03:27:00 GMT</pubDate><guid>http://www.cnblogs.com/winzheng/archive/2009/07/04/1516739.html</guid><comments>http://www.cnblogs.com/winzheng/archive/2009/07/04/1516739.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/winzheng//comments/commentRss/1516739.html</wfw:commentRss><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 早上一开机，习惯的进入博客园溜达一圈，看到&#8220;博问&#8221;上一道问题：&#8220;<a title="用java和c语言编写程序，求1到100的累加和" href="http://space.cnblogs.com/question/7895/" class="big bluebt">用java和c语言编写程序，求1到100的累加和</a>&#8221;，再也熟悉不过的题目了，大学里学汇编，C语言时无论是语法部分还是算法部分都是入门的一个经典例子，太简单了。</p><p>&nbsp; &nbsp; &nbsp; 第一个念头蹦出来，来个循环就OK了吧，但做了这么多年设计，也习惯了在思考与行动之间给自己2秒钟反思的空间，嗨，递归怎么样，是不是看起来更优雅一些，前一阵子，园子里刮起了一股优化算法的&#8220;园风&#8221;，那就考虑怎么优化吧。<br /></p><p>&nbsp; &nbsp; &nbsp; 这么简单的题目，要什么优化，要什么自行车，由于本人对算法真是没的说<img src="http://www.cnblogs.com/Emoticons/qface/055243523.gif" alt="" />，跟没学过一般一般，所以多次面试考试算法，我直接写，此题不会（貌似不会很有理由一样，也许是我面试不顺利的一个致命问题吧），不过这个题目我还是能够写出来的，不要笑我啊，但仔细想一想，一个面试官会问这些问题吗，为什么会问这些问题，考基础，考思路，绝对不会考人品(也许会吧)......</p><p>&nbsp; &nbsp; &nbsp; 带着疑问我在猜测出这道题目的初衷，对一般程序员的面试也许是考思维的严谨程度，程序的通用性、扩展性，代码的规范程度，命名是否让人看着舒服，暂不说这道题的问题：java或c语言吧，用java和C语言，咋一个应该这样出：&#8220;用你熟悉的语言编写一道程序：求1到100的累加和&#8221;，呵呵这样是否让人看了更易于发挥啊。<br /></p><p>&nbsp; &nbsp; &nbsp; 还记得小学时，老师基本上会出一道这样的题目：从１加到100，看那一个小朋友用最短的时间算出来? 呵呵，数学家高斯出现了，他是那个时候算的最快的一位，噢，面试官是不是要这个结果啊！</p>[代码]<p> </p><p>&nbsp;&nbsp;&nbsp;&nbsp; 试想，我们只关心写程序，某年某月某日，孩子问起"从１加到100"怎么算啊，我们会不会一念没想到（可能只有我吧）高斯的思维方式，而是......也许在程序人生之外有好多我们要关注的东西，不要为了买房，买车都整天扎在程序里，年迈的时候回忆这一生，回忆到的仅仅是那个程序我写的最牛，当年牛倒了其他大牛，我开发的系统曾经风靡一时，也许对着同行你可以引以自豪，如果你到了敬老院，面对一帮搞政治，经济的，是不是就憋屈了，多关心一些生活中美好的东西，多关心政治、经济、人文，多关心自己的身体。<br /></p><p>&nbsp;&nbsp;&nbsp;&nbsp; 算了，不在这里叨叨了，省得大家心烦，最近发现自己out了，发现自己身体每况日下，发现该提醒自己做点别的事情了，同学说去京东大溶洞，我在之前告诉他，我要搞Remoting，写完博文，我也去大溶洞去......<br /></p><p>&nbsp; &nbsp;&nbsp; 创造生活，享受生活，每天都快乐、健康，这是给大家的祝愿，也是给自己的祝福。 <br /></p><p>&nbsp; &nbsp;&nbsp; 周末了，努力耕耘到一线的朋友放松一下吧，每天给自己半个小时的思考时间。 <br /></p><p>&nbsp;&nbsp;&nbsp;&nbsp; By the way： 你对你的程序人生是如何规划的？<br /></p><p> </p><img src ="http://www.cnblogs.com/winzheng/aggbug/1516739.html?type=1" width = "1" height = "1" /><br/><br/>-------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/winzheng/archive/2009/07/04/1516739.html" target="_blank">http://www.cnblogs.com/winzheng/archive/2009/07/04/1516739.html</a><br/>作者博客: <a href="http://www.cnblogs.com/winzheng/" target="_blank">http://www.cnblogs.com/winzheng/</a> <a href="http://www.cnblogs.com/winzheng/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47960/" target="_blank">火狐3.5版被指推出太匆忙：存在50多个漏洞</a>]]></description></item><item><title>提供生成静态页核心代码</title><link>http://www.cnblogs.com/zhengxiqiang/archive/2009/07/04/1516720.html</link><dc:creator>郑希强</dc:creator><author>郑希强</author><pubDate>Sat, 04 Jul 2009 02:27:00 GMT</pubDate><guid>http://www.cnblogs.com/zhengxiqiang/archive/2009/07/04/1516720.html</guid><comments>http://www.cnblogs.com/zhengxiqiang/archive/2009/07/04/1516720.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/zhengxiqiang//comments/commentRss/1516720.html</wfw:commentRss><description><![CDATA[[代码]<img src ="http://www.cnblogs.com/zhengxiqiang/aggbug/1516720.html?type=1" width = "1" height = "1" /><br/><br/>-----------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/zhengxiqiang/archive/2009/07/04/1516720.html" target="_blank">http://www.cnblogs.com/zhengxiqiang/archive/2009/07/04/1516720.html</a><br/>作者博客: <a href="http://www.cnblogs.com/zhengxiqiang/" target="_blank">http://www.cnblogs.com/zhengxiqiang/</a> <a href="http://www.cnblogs.com/zhengxiqiang/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47959/" target="_blank">Google对手机搜索进行优化升级</a>]]></description></item><item><title>MDOP套装之med-v管理工具图文使用说明</title><link>http://www.cnblogs.com/ccfxny/archive/2009/07/04/1516691.html</link><dc:creator>ccfxny</dc:creator><author>ccfxny</author><pubDate>Sat, 04 Jul 2009 00:46:00 GMT</pubDate><guid>http://www.cnblogs.com/ccfxny/archive/2009/07/04/1516691.html</guid><comments>http://www.cnblogs.com/ccfxny/archive/2009/07/04/1516691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ccfxny//comments/commentRss/1516691.html</wfw:commentRss><description><![CDATA[<p>到此为止,在前面几章中med-v的安装和使用我们都基本了解了,下面就功能选项做一些说明</p>  <p>1图是单击右下角的med图标,右键出现的选项,从下往上开始数,分别是退出,停止镜像服务,重启镜像服务,锁定镜像服务,设置,工具(镜像上传和文件传送),帮助,打开med-v,图片中展示的是文件传送工具,虚拟机和主机使用该文具来传送文件,上面的是拷贝到目的地,下面的对象,注意不要选错</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-37_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-37" border="0" alt="wps_clip_image-37" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-37_thumb.png" width="505" height="484" /></a></p>  <p>这个是管理条例中第一个选项卡,主要是虚拟机的名字以及全屏模式和托盘显示设置,如图第一选上后显示托盘图标,第二个是非全屏模式,但是在虚拟机中运行的程序会以红线边框标示,单击那个颜色可以自行更改,最下面那个是全屏模式,客户端启动workspace后会启动虚拟机,并在虚拟机中运行程序.为无缝体验考虑还是第一个不显示虚拟机比较好</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-38_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-38" border="0" alt="wps_clip_image-38" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-38_thumb.png" width="644" height="405" /></a></p>  <p>这是第二个选项,选择要设置的虚拟机,然后第一选项中选中后客户端的设置会保存在虚拟机,可选项第一个是停止虚拟机当服务停止时,第二个可选项的意思锁定虚拟机当服务停止时</p>  <p>第二个大项中式设置客户端在虚拟机做了更改不会被保存.相当于还原了.下面的基本上锁定虚拟机设置等一些东西没必要更改</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-39_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-39" border="0" alt="wps_clip_image-39" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-39_thumb.png" width="644" height="405" /></a></p>  <p>这里是设置客户端在虚拟机中的权限,</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-40_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-40" border="0" alt="wps_clip_image-40" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-40_thumb.png" width="644" height="405" /></a></p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-41_2.png"><font color="#000000">这里设置</font></a>要在客户端发布的程序路径,第一个发布程序,下面那个大框的设置时发布整个开始菜单路径就写\即可上面的发布程序,需要注意的是要用双引号将路径框起来,否则会出错,因为众所周知的原因program files中间有空格,所以必须用双引号</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-41_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-41" border="0" alt="wps_clip_image-41" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-41_thumb.png" width="644" height="405" /></a></p>  <p>这个是重定向虚拟机中的web功能</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-42_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-42" border="0" alt="wps_clip_image-42" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-42_thumb.png" width="644" height="405" /></a></p>  <p>有必要使用网络的就在这里设置虚拟机的网络模式</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-43_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-43" border="0" alt="wps_clip_image-43" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-43_thumb.png" width="644" height="405" /></a></p>  <p>设置虚拟机和客户端本机所占用内存,这里面是模版</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-44_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-44" border="0" alt="wps_clip_image-44" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-44_thumb.png" width="644" height="405" /></a></p>  <p>image这个大选项是打包和上传以及测试用的</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-45_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-45" border="0" alt="wps_clip_image-45" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-45_thumb.png" width="644" height="405" /></a></p>  <p>report是用来报告虚拟机的状态等,可以自行设定</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-46_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-46" border="0" alt="wps_clip_image-46" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-46_thumb.png" width="644" height="405" /></a></p>  <p>这个选项是自动为客户端上运行的虚拟机改名,如果虚拟机有网络,但是运行到很多客户端上后,会因为都是使用的同一虚拟机而造成网络重名,所以要设置该选项,</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-47_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-47" border="0" alt="wps_clip_image-47" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-47_thumb.png" width="644" height="405" /></a></p>  <p>在第一个中的虚拟机文件,如要修改虚拟机就要打开虚拟机自行修改,或者修改前面说的一些配置文件后,都要经过下面的打包和上传过程,上传后在服务器会生成vm1-日期后缀之类的,这样客户端就会下载新的更新来使用.</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-48_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-48" border="0" alt="wps_clip_image-48" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-48_thumb.png" width="644" height="405" /></a></p>  <p>这个演示时在前面选择全屏模式后会出现这种运行模式,程序是在虚拟机中打开的</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-49_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-49" border="0" alt="wps_clip_image-49" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-49_thumb.png" width="644" height="477" /></a></p>  <p>非全屏模式就是这样的,直接在主机打开,只是有红线标记程序而已.</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-50_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wps_clip_image-50" border="0" alt="wps_clip_image-50" src="http://images.cnblogs.com/cnblogs_com/ccfxny/WindowsLiveWriter/MDOPmedv_76DC/wps_clip_image-50_thumb.png" width="613" height="484" /></a></p><img src ="http://www.cnblogs.com/ccfxny/aggbug/1516691.html?type=1" width = "1" height = "1" /><br/><br/>-----------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/ccfxny/archive/2009/07/04/1516691.html" target="_blank">http://www.cnblogs.com/ccfxny/archive/2009/07/04/1516691.html</a><br/>作者博客: <a href="http://www.cnblogs.com/ccfxny/" target="_blank">http://www.cnblogs.com/ccfxny/</a> <a href="http://www.cnblogs.com/ccfxny/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</a>]]></description></item><item><title>呼之欲出 WebMail 开发手记 （二） 数据库与软件设计分析</title><link>http://www.cnblogs.com/lyout/archive/2009/07/04/webmail2.html</link><dc:creator>里奥特</dc:creator><author>里奥特</author><pubDate>Sat, 04 Jul 2009 00:39:00 GMT</pubDate><guid>http://www.cnblogs.com/lyout/archive/2009/07/04/webmail2.html</guid><comments>http://www.cnblogs.com/lyout/archive/2009/07/04/webmail2.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/lyout//comments/commentRss/1516690.html</wfw:commentRss><description><![CDATA[<p>一、数据库</p>
<ol><li>支持多用户，需要一个角色表（MailRole）和一个用户表（MailUser）；</li><li>支持多文件夹，需要一个文件夹表（MailFolder）；</li><li>支持多邮箱设置，需要一个邮箱设置表（MailConfig）；</li><li>另外再加上一个邮件信息表（MailList）和一个邮件附件表（MailAttachment）。</li></ol>
<p>&nbsp;</p>
<p>以下附上数据库模型图：</p>
<p><img height="546" alt="" src="http://images.cnblogs.com/cnblogs_com/lyout/WebMail/database.JPG" width="636" border="0" /></p>
<p>&nbsp;</p>
<p>二、程序设计分析：</p>
<ol><li>支持多用户，需要设计登录页面，管理员管理页面（要不然怎么管理用户呀？）用户资料页面等。</li><li>支持多文件夹，需要有一个文件夹树，像163等等这些邮箱左边都有邮件夹树。</li><li>支持多邮箱设置，那肯定就需要邮箱设置页面啦，再加上邮箱设置列表页面等。</li><li>当然还离不开邮件管理页面。</li><li>既然支持多线程收发，需要设置一个邮件收发线程类，然后我们通过 WebService 来调用。</li><li>最后再整个T形框架，现在都这样就不想搞另类了。</li></ol>
<p>好，这个图就免了，其他的功能若有需要，再加了。</p>  <img src ="http://www.cnblogs.com/lyout/aggbug/1516690.html?type=1" width = "1" height = "1" /><br/><br/>-----------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/lyout/archive/2009/07/04/webmail2.html" target="_blank">http://www.cnblogs.com/lyout/archive/2009/07/04/webmail2.html</a><br/>作者博客: <a href="http://www.cnblogs.com/lyout/" target="_blank">http://www.cnblogs.com/lyout/</a> <a href="http://www.cnblogs.com/lyout/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47957/" target="_blank">乔布斯和埃利森</a>]]></description></item><item><title>.Net Validator验证框架 [ .Net | Validator Framework | Attribute ]</title><link>http://www.cnblogs.com/over140/archive/2009/07/04/1515892.html</link><dc:creator>农民伯伯</dc:creator><author>农民伯伯</author><pubDate>Fri, 03 Jul 2009 17:05:00 GMT</pubDate><guid>http://www.cnblogs.com/over140/archive/2009/07/04/1515892.html</guid><comments>http://www.cnblogs.com/over140/archive/2009/07/04/1515892.html#Feedback</comments><slash:comments>36</slash:comments><wfw:commentRss>http://www.cnblogs.com/over140//comments/commentRss/1515892.html</wfw:commentRss><description><![CDATA[<p>&nbsp;</p>
<p><strong style="font-size: 18pt; font-family: 楷体_GB2312;">前言</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 简单易用是.Net Validator验证框架努力的目标。基于Attribute验证器标识，丰富的验证返回类型，提供可扩展的验证器接口......&#8212;&#8212;又一个心愿和想法实质性的开始，开心ing&nbsp; :&nbsp; )<br />
</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 18pt; font-family: 楷体_GB2312;">正文</span></strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一、<strong>框架介绍</strong></p>
<p>　　　　本框架基于类属性(Property)的Attribute验证器标示，匹配属性(Property)名和Form、QueryString中的Key以及服务器端控件的ID名称，再根据验证器对数据进行校验。</p>
<p>　　　　验证器结构图</p>
<p>　　　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/over140/2009/7/2009-7-3_1.PNG" width="1113" height="544" />&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二、<strong>框架使用例子</strong></p>
<p>　　　　2.1　　常规验证</p>
<p>　　　　　　2.1.1　　准备Model类User，注意引用命名空间<span style="color: red;">using Lasy.Validator;</span></p>
[代码]
<p>　　　　　　2.1.2　　控制台测试类 <br />
</p>
[代码]
<p>　　　　　　2.1.3　　结果显示截图</p>
<p>　　　　　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/over140/2009/7/2009-7-3_2.PNG" width="643" height="46" />&nbsp;</p>
<p>　　　　2.2　　表单验证</p>
<p>　　　　　　2.2.1　　User类</p>
[代码]
<p>&nbsp;　　　　　　2.2.2　　测试页面</p>
<p>　　　　　　　　login.aspx</p>
[代码]
<p>&nbsp;　　　　　　　&nbsp; 按钮代码<br />
</p>
[代码]
<p>　　　　　　2.2.3　　效果</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/over140/2009/7/2009-7-3_3.PNG" width="429" height="199" />&nbsp;</p>
<p>　　三、<strong>使用建议</strong></p>
<p>　　　　3.1　　如果已经做了客户端校验，服务器端从Request中提取表单数据进行操作，可以直接使用Validator(Type type, bool checkAll, bool setDefaultValue)构造函数，然后从ValuesResult中取得已经校验完毕IDictionary&lt;string, object&gt;数据。</p>
<p>　　　　3.2　　NoValidator与ValuesResult在提取表单数据时配套使用。</p>
<p>　　　　3.3　　调试的时候注意类的Attribute是静态缓存的，需要清理或重新生成修改后的验证器标识才管用！ </p>
<p>&nbsp;</p>
<p>　　四、<strong>下载</strong></p>
<p>　　　　4.1　　源代码　　<a href="http://files.cnblogs.com/over140/2009/7/Lasy.Validator.Src.rar" title="Src">Src</a></p>
<p>　　　　4.2　　文&nbsp;&nbsp; 档　　<a href="http://files.cnblogs.com/over140/2009/7/Lasy.Validator.Doc.rar" title="Lasy.Validator.chm">Lasy.Validator.chm</a><a href="http://files.cnblogs.com/over140/2009/7/Lasy.Validator.Doc.rar" title="Lasy.Validator.chm"></a> </p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 18pt; font-family: 楷体_GB2312;">结束语</span></strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然造轮子常常是一件吃力不讨好的事情，但是怀着我觉得好用，或者想做一个好用的东东出来，推荐给朋友试试看的心情就会好很多，何况还是有许多热心人提供宝贵的建议:&nbsp; )<br />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<fieldset><legend>本博其他你可能感兴趣的文章</legend>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class="titlelink" href="http://www.cnblogs.com/over140/archive/2009/05/15/1456605.html">NOD32升级账号更新器 [ C# | NOD32 | Eset ]</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class="titlelink" href="http://www.cnblogs.com/over140/archive/2009/05/01/1447380.html">用Visual Studio 2005/2008提取EXE文件中的资源[图片|htm|光标文件]</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class="titlelink" href="http://www.cnblogs.com/over140/archive/2009/04/02/1428114.html">新浪Flash下载器 [HttpWebRequest | 新浪视频]</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class="titlelink" href="http://www.cnblogs.com/over140/archive/2008/10/31/1322786.html">笨笨图片批量下载器 V0.3 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程] new</a></p>
<p>&nbsp;</p>
</fieldset>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/over140/aggbug/1515892.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/over140/archive/2009/07/04/1515892.html" target="_blank">http://www.cnblogs.com/over140/archive/2009/07/04/1515892.html</a><br/>作者博客: <a href="http://www.cnblogs.com/over140/" target="_blank">http://www.cnblogs.com/over140/</a> <a href="http://www.cnblogs.com/over140/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47956/" target="_blank">Xbox Live将投放Silverlight广告</a>]]></description></item><item><title>QQ抢车位外挂（续）</title><link>http://www.cnblogs.com/bnjbl/archive/2009/07/04/1516650.html</link><dc:creator>磊.NET</dc:creator><author>磊.NET</author><pubDate>Fri, 03 Jul 2009 17:02:00 GMT</pubDate><guid>http://www.cnblogs.com/bnjbl/archive/2009/07/04/1516650.html</guid><comments>http://www.cnblogs.com/bnjbl/archive/2009/07/04/1516650.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/bnjbl//comments/commentRss/1516650.html</wfw:commentRss><description><![CDATA[<p>首先对不住大家了，因为最近在搬家，事情多，前几天宽带线路出了点问题，这篇文件在1周以后才发布出来。</p>
<p><a href="http://www.cnblogs.com/bnjbl/archive/2009/06/24/1509856.html"></a><a class="postTitle2" id="homepage1_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/bnjbl/archive/2009/06/24/1509856.html">QQ抢车位外挂--小研究成果展示</a><a href="http://www.cnblogs.com/bnjbl/archive/2009/06/24/1509856.html"> <br /></a>首先，我想在这里说明一下，在这里，我希望大家能通过我写的文章，学到一些外挂开发思路性的东西，至于，怎么通过JS加密腾讯要求的密码，这些细节的东西，大家可以下来去研究。<br />我今天针对上次的文章，主要针对</p>
<p>登陆后怎么获取自己的信息，好友的信息，以及如何贴条</p>
<p>我看了大家对我上篇文章的评论，有些同志有比我发出来的抓包工具更好的抓包工具，大家可以根据需要，用自己习惯的，这里我还是用上次我提供下载地址的&nbsp;<a href="http://snet1.3800hk.com/200804/080408HttpAnal.rar">HTTPAnalyzer&nbsp;</a> 工具</p>
<p><br />好了，进入正题，上篇文章我已经讲了如何正确登陆QQ空间。<br />登陆之后，会有一个返回结果，</p>
<p>结果字符串中间会包括一个字符串</p>
<p>g_iLoginUin=XX的QQ号</p>
<p>如下图：</p>
<p><br /><img height="414" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/login22.JPG" width="1010" border="0" />。。。。。。。。。。。</p>
<p>OK，现在登陆成功了<br />我提供给大家一个类&nbsp;&nbsp; 关于Post提交或者Get操作的类<br />用这个类，大家可以 保存当前的Cookie<br />这样，在下次像提交请求时，服务器就会认定为，你是登陆状态了，呵呵<br />类如下：</p>
<p><a href="http://files.cnblogs.com/bnjbl/HttpHelper.rar">HttpHelper.cs&nbsp;</a></p>
<p>在使用这个类时，要注意保存自己的Cookie</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_003109" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_003109').style.display='none'; document.getElementById('Code_Open_Image_003109').style.display='inline'; document.getElementById('Code_Open_Text_003109').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_003109" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_003109').style.display='none'; getElementById('Code_Closed_Image_003109').style.display='inline'; getElementById('Code_Closed_Text_003109').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_003109">Code</span><span id="Code_Open_Text_003109" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #008000">//</span><span style="color: #008000">切忌这个&nbsp;_cookieContainer一定要是全局的，因为如果登录成功，这个_cookieContainer保存了你的登录状态<br /></span><span style="color: #008080">2</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">并且腾讯对你登陆状态保留时间是有限的，一般1小时如操作就视为就会登陆超时</span><span style="color: #008000"><br /></span><span style="color: #008080">3</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">CookieContainer&nbsp;_cookieContainer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CookieContainer();<br /></span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">new出来一个http请求对象</span><span style="color: #008000"><br /></span><span style="color: #008080">5</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">HttpHelper&nbsp;_help&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HttpHelper(_cookieContainer);<br /></span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">模拟执行一个Get操作，过执行Post操作，请自行参阅GetHtml的方法重载</span><span style="color: #008000"><br /></span><span style="color: #008080">7</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;responseStr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_help.GetHtml(</span><span style="color: #800000">"</span><span style="color: #800000">你请求的URL</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;_cookieContainer);</span></span></div>
<p>&nbsp;好了，现在我们来获取我们自己的车辆信息，哈哈，比较兴奋啊，成功越来越近了</p>
<p>我们还是用<a href="http://snet1.3800hk.com/200804/080408HttpAnal.rar">HTTPAnalyzer&nbsp;</a>工具进行抓包</p>
<p>我们首先先拿IE进入自己的空间-》抢车位之后，点击下抢车位上的</p>
<p>&nbsp;</p>
<p><img height="80" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/carlist.jpg" width="263" border="0" />&nbsp; 上的<img height="20" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/lookInfo.JPG" width="72" border="0" />&nbsp; 按钮</p>
<p>哇塞，大家看到了吗？ 我们的抓包工具在第12行抓到了我们想要的数据啊</p>
<p><img height="375" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/dataa1.jpg" width="992" border="0" /></p>
<p>&nbsp;</p>
<p>里边有我们所有车的数据， 停在什么位置上，车的价钱，以及停车多少分钟，等等信息，稍作分析便可以使用腾讯的xml数据了</p>
<p>要注意的是这是一个Post操作，Post地址是</p>
<p><a href="http://world.show.qq.com/cgi-bin/parker_user_info?uin">http://world.show.qq.com/cgi-bin/parker_user_info?uin</a>=</p>
<p>&nbsp;</p>
<p>好了，已经获取我们的QQ抢车位所有的车辆信息了</p>
<p>我们再来测试下停车功能吧，先找个车试试 吼吼~~</p>
<p>首先我们找到一个好友，进入他的停车场，然后找个空位置，选择一个我们的车，点击停车</p>
<p>&nbsp;</p>
<p><img height="552" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/go1.jpg" width="803" border="0" /></p>
<p>点击确定，我们看看是否能再次抓到有用的数据呢？？</p>
<p><img height="361" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/gogogo.jpg" width="947" border="0" />&nbsp;</p>
<p>&nbsp;</p>
<p>我们看到，Post之后，居然又返回一个xml文件，腾讯对数据的返回大部分是xml文件</p>
<p>返回一个 此车停在XX好友车位上的标示（opuin)</p>
<p>以及&nbsp; carid(车的自编号);money(赚取的钱)等等..</p>
<p>我们来看看这个Post提交&nbsp; 究竟提交了些什么数据呢</p>
<p><img height="216" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/postDatas.jpg" width="559" border="0" /></p>
<p>我们不难发现，和上边返回的xml差不多 opuin就是当前你选择停车的好友QQ号</p>
<p>carid是车编号，parkno是你好友的停车位编号，当前我们是停在了2号车位 呵呵</p>
<p>这个停车就基本分析完了，大家按照这个思路就完全可以写自己的停车程序了</p>
<p>&nbsp;</p>
<p>这几天真的很忙，很抱歉没及时跟进文章，我的抢车位外挂应该在下周周二出一个新的版本</p>
<p>目前还在测试，就不给大家放出来新版了（别大家运行看到很多bug就不好咯）</p>
<p>好了，我先分析到这里，明天还得上班，休息了，晚安</p><img src ="http://www.cnblogs.com/bnjbl/aggbug/1516650.html?type=1" width = "1" height = "1" /><br/><br/>----------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/bnjbl/archive/2009/07/04/1516650.html" target="_blank">http://www.cnblogs.com/bnjbl/archive/2009/07/04/1516650.html</a><br/>作者博客: <a href="http://www.cnblogs.com/bnjbl/" target="_blank">http://www.cnblogs.com/bnjbl/</a> <a href="http://www.cnblogs.com/bnjbl/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47951/" target="_blank">Debian无视GNU创始人警告 接受Mono</a>]]></description></item><item><title>发一个基于jQuery的多标签浏览插件</title><link>http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Fri, 03 Jul 2009 16:39:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html</guid><comments>http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu//comments/commentRss/1516643.html</wfw:commentRss><description><![CDATA[ <style>
a:link, a:visited
{
	font: 12px "宋体";
	color: #1835d1;
	text-decoration: none;
}
a:active, a:hover
{
	color: #f30;
	text-decoration: underline;
}

form, ul, li, dl, dt, dd
{
	padding: 0px;
	margin: 0px;
}
ul
{
	list-style-type: none;
}

/*FrameTabs*/
#frametabs{ background:url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401063697.gif) top repeat-x #d4e4f6; /*border-bottom:1px solid #f0f5fa;*/  padding:2px 0 1px;height:25px;*height:28px!important; position:relative;}
#frametabs ul{display:block; /*border-bottom:1px solid #99bbe8;*/ height:24px; padding:0 4px;}
ul.tab-strip{display:block;zoom:1;}
ul.tab-strip-top{}
.tab-left{background:transparent url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401061296.gif) no-repeat -18px 0;width:18px; height:23px;position:absolute;left:0;top:0;z-index:10;cursor:pointer; display:none;}
.tab-left-over{background-position:0 0;}
.tab-disabled{background-position:-36px 0;cursor:default;}
.tab-right{ float:right;background:transparent url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401061923.gif) no-repeat 0 0;width:18px; height:23px;position:absolute;right:0;top:0;z-index:10;cursor:pointer;display:none;}
.tab-right-over{background-position:-18px 0;}
/*.tab-right-disabled{background-position:-36px 0;cursor:default;}*/
.tab-strip-wrap{width:100%;overflow:hidden;position:relative;zoom:1;}
.tab-strip-margin{margin-left:18px;margin-right:18px;}
#frametabs li{ float:left;background:url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401063074.gif) left -201px repeat-x; height:21px; line-height:21px; margin-right:2px;}
#frametabs li a{display:block; float:left; background:url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401063074.gif) left -51px no-repeat;height:21px; line-height:21px; color:#416aa3;  font-size:12px;text-decoration:none;padding-left:8px;}
#frametabs li a.closetab{ background:url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401063074.gif) right -351px no-repeat; padding:4px 6px 6px 5px; height:11px; cursor:pointer;}
#frametabs li.frametabs_hover{ background-position:left -251px;}
#frametabs li.frametabs_hover a{ background-position: left -101px;}
#frametabs li.frametabs_hover a.closetab{ background-position: right -401px;}
#frametabs li.current{ background-position:left -151px; height:24px ; line-height:24px;}
#frametabs li.current a{ background-position: left 0px; font-weight:bold;}
#frametabs li.current a.closetab{ background-position: right -301px;}
#frametabs  li#newframetab{background:none; padding-top:4px; height:15px; padding-left:2px;}
#frametabs  li#newframetab a{background:url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401060456.gif) left top no-repeat; width:15px; height:15px;}
#frametabs  li#newframetab a:hover{ background-position:0 -15px;}
</style>  <p>本文地址: <a href="http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html" target="_blank">发一个基于jQuery的多标签浏览插件</a>  <p>本文作者：<a href="http://QLeelulu.cnblogs.com/">QLeelulu</a>  <p>转载请标明出处，首发于博客园！  <p>&nbsp; <p>注：该插件提取于<a href="http://demo.powereasy.net/" target="_blank">动易CMS系统</a>管理后台。  <p>该插件适用于使用框架页的管理系统后台。</p> <p>该插件只能应用于同域的URL，跨域的URL由于Javascript的安全限制，会出错。</p> <p>不说废话，先看Demo，点击下面的链接将在下面的iFrame中打开（指定了target="main_right"）：</p> <p><a href="http://www.cnblogs.com/QLeelulu/archive/2008/04/21/1163021.html" target="main_right">jQuery Ajax 全解析</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cnblogs.com/QLeelulu/archive/2008/10/05/1303997.html" target="main_right">ASP.NET MVC 入门系列教程</a><br><a onclick="PE_FrameTab.AddNew(this.href);return false;" href="http://www.cnblogs.com/" target="main_right">博客园(在新标签中打开)</a> </p> <div id="FrameTabs" style="overflow: hidden; width: 680px"> <div class="tab-right tab-right-disabled" onmouseover="this.className='tab-right tab-right-over'" onmouseout="this.className='tab-right tab-right-disabled'"></div> <div class="tab-left" onmouseover="this.className='tab-left tab-left-over'" onmouseout="this.className='tab-left tab-left-disabled'"></div> <div class="tab-strip-wrap" style="width: 8000px"> <ul class="tab-strip" style="float: left"> <li class="current" id="iFrameTab1"><a href="javascript:"><span id="frameTabTitle" title="(无标题)">(无标题)</span></a><a class="closeTab"><img src="http://pic002.cnblogs.com/img/qleelulu/200907/2009070401062427.gif" border="0"></a></a>  <li id="newFrameTab"><a title="新建标签页" href="javascript:"></a></li></ul></div></div> <div id="main_right_frame"></div> <div id="iframeMainTemplate" style="display: none"></div> <p></p> <p>&nbsp;</p> <p>下面是代码，有注释，就不多说了。</p><pre class="code"><span style="color: green">/*  
*
* 该插件只能应用于同域的URL，跨域的URL由于Javascript的安全限制，会出错。
*
* 新建一个标签：PE_FrameTab.AddNew(url)
; 如果url为空则是新开一个空白的标签页。
* 关闭当前标签：PE_FrameTab.CloseCurrentTab()
* 从当前标签切换到其他标签时触发：BeforeSwitch(); 如果该函数存在并返回false则不切换标签.该函数直接写在当前页面中.
* 从其他标签切换到当前标签时触发：SwitchInto(); 如果该函数存在则执行.该函数直接写在要切换到的页面.
* 在关闭当前标签页的时候触发：OnCloseTab(); 如果该函数存在存在则执行.该函数直接写在当前页面中.
*/
</span><span style="color: blue">var </span>lastFrameTabId = 1; <span style="color: green">//最后新建的FrameTabId，用于新建FrameTab
</span><span style="color: blue">var </span>currentFrameTabId = 1; <span style="color: green">//当前显示的FrameTab
</span><span style="color: blue">var </span>frameTabCount = 1;
<span style="color: blue">var </span>StyleSheetPath =<span style="color: #a31515">""</span>;

<span style="color: blue">var </span>PE_FrameTab = {
    <span style="color: green">//新建一个标签
    </span>AddNew: <span style="color: blue">function</span>(url) {
        AddNewFrameTab(url);
    },
    <span style="color: green">//关闭当前标签
    </span>CloseCurrentTab: <span style="color: blue">function</span>(){
        jQuery(<span style="color: #a31515">"#iFrameTab" </span>+ currentFrameTabId).find(<span style="color: #a31515">".closeTab"</span>).click();
   }
};

<span style="color: green">///给tab标签注册切换和关闭tab事件
</span>jQuery.fn.iFrameTab = <span style="color: blue">function</span>() {
    jQuery(<span style="color: blue">this</span>).each(<span style="color: blue">function</span>() {
        <span style="color: blue">var </span>cr = jQuery(<span style="color: blue">this</span>);
        <span style="color: blue">var </span>tabId = cr.attr(<span style="color: #a31515">"id"</span>).replace(<span style="color: #a31515">"iFrameTab"</span>, <span style="color: #a31515">""</span>);
        cr.click(<span style="color: blue">function</span>() {<span style="color: green">//切换FrameTab
            </span>SwitchIframe(<span style="color: blue">this</span>);
        }).find(<span style="color: #a31515">".closeTab"</span>).click(<span style="color: blue">function</span>() {<span style="color: green">//关闭FrameTab
            </span><span style="color: blue">if </span>(frameTabCount &gt; 1) {
                <span style="color: blue">var </span>mainRightFrame = jQuery(<span style="color: #a31515">"#main_right_frame iframe[tabid='" </span>+ tabId + <span style="color: #a31515">"']"</span>);
                <span style="color: blue">var </span>bClose = mainRightFrame[0].contentWindow.OnCloseTab ? mainRightFrame[0].contentWindow.OnCloseTab() : <span style="color: blue">true</span>;
                <span style="color: blue">if </span>(bClose) {
                    <span style="color: blue">if </span>(cr.attr(<span style="color: #a31515">"class"</span>) == <span style="color: #a31515">"current"</span>) {<span style="color: green">//如果关闭的标签是当前标签，则切换到前一标签，如果前一标签不存在，则切换到后一标签
                        </span><span style="color: blue">var </span>nextIframe = cr.prev(<span style="color: #a31515">"li[id^='iFrameTab']"</span>);
                        <span style="color: blue">if </span>(nextIframe.length &lt;= 0) { nextIframe = cr.next(<span style="color: #a31515">"li[id^='iFrameTab']"</span>); }
                        SwitchIframe(nextIframe[0]);
                    }
                    <span style="color: green">//清理
                    </span>cr.remove();
                    jQuery(<span style="color: #a31515">"#frmTitle iframe[tabid='" </span>+ tabId + <span style="color: #a31515">"']"</span>).remove();
                    mainRightFrame.remove();
                    frameTabCount--;
                    CheckFramesScroll();
                }
            }
        }).end().dblclick(<span style="color: blue">function</span>() {
            jQuery(<span style="color: blue">this</span>).find(<span style="color: #a31515">".closeTab"</span>).click();
        });
    });
    <span style="color: blue">return </span>jQuery(<span style="color: blue">this</span>);
}


<span style="color: green">///切换tab
</span><span style="color: blue">function </span>SwitchIframe(iFrameTab) {
    <span style="color: blue">var </span>tabId = jQuery(iFrameTab).attr(<span style="color: #a31515">"id"</span>).replace(<span style="color: #a31515">"iFrameTab"</span>, <span style="color: #a31515">""</span>);  <span style="color: green">//鼠标点击的tab的id
    </span><span style="color: blue">if </span>(currentFrameTabId == tabId) { <span style="color: blue">return false</span>; }
    <span style="color: green">//判断是否允许切换Tab
    </span><span style="color: blue">var </span>switchFunc = jQuery(<span style="color: #a31515">"#main_right"</span>)[0].contentWindow.window.BeforeSwitch;
    <span style="color: blue">var </span>bSwitch = (switchFunc) ? switchFunc() : <span style="color: blue">true</span>;
    <span style="color: blue">if </span>(!bSwitch) { <span style="color: blue">return false</span>; }

    <span style="color: blue">var </span>currentGuideSrc = jQuery(<span style="color: #a31515">"#frmTitle iframe[tabid='" </span>+ currentFrameTabId + <span style="color: #a31515">"']"</span>).attr(<span style="color: #a31515">"src"</span>);
    SetCurrentFrameTab(iFrameTab);

    <span style="color: blue">var </span>mainFrames = jQuery(<span style="color: #a31515">"#main_right_frame &gt; iframe"</span>).hide().attr({ <span style="color: #a31515">"id"</span>: <span style="color: #a31515">""</span>, <span style="color: #a31515">"name"</span>: <span style="color: #a31515">"" </span>});
    <span style="color: blue">var </span>newMainFrame = jQuery(<span style="color: #a31515">"#main_right_frame iframe[tabid='" </span>+ tabId + <span style="color: #a31515">"']"</span>);
    <span style="color: green">//将iframe的window.name设为空，使&lt;a target="main_right" /&gt;只对当前iframe有效
    </span>mainFrames.each(<span style="color: blue">function</span>() { <span style="color: blue">this</span>.contentWindow.window.name = <span style="color: #a31515">""</span>; }); 
    
    <span style="color: blue">if </span>(newMainFrame.length &lt;= 0) {<span style="color: green">//是否新建标签
        </span>newMainFrame = jQuery(<span style="color: #a31515">"#main_right_frame"</span>).prepend(jQuery(<span style="color: #a31515">"#iframeMainTemplate"</span>).html())
                .find(<span style="color: #a31515">"[tabid=0]"</span>).attr({ <span style="color: #a31515">"tabid"</span>: tabId, <span style="color: #a31515">"src"</span>: <span style="color: #a31515">"about:blank"</span>, <span style="color: #a31515">"id"</span>: <span style="color: #a31515">"main_right"</span>, <span style="color: #a31515">"name"</span>: <span style="color: #a31515">"main_right" </span>})
                .css(<span style="color: #a31515">"display"</span>, <span style="color: #a31515">"block"</span>);
    } <span style="color: blue">else </span>{
        newMainFrame = jQuery(<span style="color: #a31515">"#main_right_frame iframe[tabid='" </span>+ tabId + <span style="color: #a31515">"']"</span>)
            .attr(<span style="color: #a31515">"id"</span>, <span style="color: #a31515">"main_right"</span>).attr(<span style="color: #a31515">"name"</span>, <span style="color: #a31515">"main_right"</span>).show();
    }
    <span style="color: green">//指定iframe的window.name，使&lt;a target="main_right" /&gt;有效
    </span>newMainFrame[0].contentWindow.window.name = <span style="color: #a31515">"main_right"</span>;
    frames[<span style="color: #a31515">"main_right"</span>] = newMainFrame[0].contentWindow.window;

    currentFrameTabId = tabId;

    <span style="color: blue">var </span>switchInto = jQuery(<span style="color: #a31515">"#main_right"</span>)[0].contentWindow.window.SwitchInto;
    <span style="color: blue">if</span>(switchInto){ switchInto(); }
}

<span style="color: green">///初始化新建标签按钮
</span><span style="color: blue">function </span>InitNewFrameTab() {
    jQuery(<span style="color: #a31515">"#newFrameTab"</span>).click(<span style="color: blue">function</span>(url) {
        AddNewFrameTab(url);
    });
}

<span style="color: blue">function </span>AddNewFrameTab(url){
    <span style="color: green">//jQuery("#FrameTabs .current").removeClass("current");
    </span><span style="color: blue">var </span>btn=jQuery(<span style="color: #a31515">"#newFrameTab"</span>);
    jQuery(<span style="color: #a31515">'&lt;li id="iFrameTab' </span>+ (++lastFrameTabId) + <span style="color: #a31515">'" &gt;&lt;a href="javascript:"&gt;&lt;span id="frameTabTitle"&gt;(无标题)&lt;/span&gt;&lt;a class="closeTab"&gt;&lt;img border="0" src="' </span>+ StyleSheetPath + <span style="color: #a31515">'images/tab-close.gif"/&gt;&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;'</span>)
            .insertBefore(btn).iFrameTab();
      frameTabCount++;
      SwitchIframe(jQuery(<span style="color: #a31515">"#iFrameTab" </span>+ lastFrameTabId)[0]);
       jQuery(<span style="color: #a31515">"#main_right"</span>).attr(<span style="color: #a31515">"src"</span>,url);
      <span style="color: blue">if </span>(CheckFramesScroll()) { jQuery(<span style="color: #a31515">"#FrameTabs ul:eq(0)"</span>).css(<span style="color: #a31515">"margin-left"</span>, cW - fW - 40); }
}

<span style="color: blue">function </span>SetCurrentFrameTab(selector) {
    jQuery(<span style="color: #a31515">"#FrameTabs .current"</span>).removeClass(<span style="color: #a31515">"current"</span>);
    jQuery(selector).addClass(<span style="color: #a31515">"current"</span>);
}
<span style="color: green">///检查是否需要滚动
</span><span style="color: blue">function </span>CheckFramesScroll() {
    <span style="color: blue">var </span>ft = jQuery(<span style="color: #a31515">"#FrameTabs"</span>);
    window.cW = ft.width(); <span style="color: green">//包含Tabs的容器宽度
    </span>window.fW = ft.find(<span style="color: #a31515">"ul:eq(0)"</span>).width();
    ft.unbind(<span style="color: #a31515">"DOMMouseScroll"</span>).unbind(<span style="color: #a31515">"mousewheel"</span>);
    <span style="color: blue">if </span>(fW &gt; cW) {
        <span style="color: blue">if </span>(jQuery.browser.mozilla) {
            ft.bind(<span style="color: #a31515">"DOMMouseScroll"</span>, <span style="color: blue">function</span>(e) {
                ScrollFrames(cW, fW, e);
            });
        } <span style="color: blue">else </span>{
            ft.bind(<span style="color: #a31515">"mousewheel"</span>, <span style="color: blue">function</span>(e) {
                ScrollFrames(cW, fW, e);
            });
        }
        jQuery(<span style="color: #a31515">"#FrameTabs .tab-strip-wrap"</span>).addClass(<span style="color: #a31515">"tab-strip-margin"</span>);
        jQuery(<span style="color: #a31515">"#FrameTabs .tab-right, #FrameTabs .tab-left"</span>).css(<span style="color: #a31515">"display"</span>, <span style="color: #a31515">"block"</span>);
        <span style="color: blue">return true</span>;
    } <span style="color: blue">else </span>{
        jQuery(<span style="color: #a31515">"#FrameTabs ul:eq(0)"</span>).css(<span style="color: #a31515">"margin-left"</span>, 0);
        jQuery(<span style="color: #a31515">"#FrameTabs .tab-right, #FrameTabs .tab-left"</span>).css(<span style="color: #a31515">"display"</span>, <span style="color: #a31515">"none"</span>);
        jQuery(<span style="color: #a31515">"#FrameTabs .tab-strip-wrap"</span>).removeClass(<span style="color: #a31515">"tab-strip-margin"</span>);
        <span style="color: blue">return false</span>;
    }
}
<span style="color: green">///Tab滚动。
///cW为包含Tabs的容器宽度；fW为全部Tabs的宽度；y为指定的位移，如果不指定y，则使用event中的位移。
</span><span style="color: blue">function </span>ScrollFrames(cW, fW, event, y) {
    <span style="color: blue">if </span>(!y) {
        <span style="color: blue">if </span>(event.wheelDelta) {
            y = event.wheelDelta / 5;
        } <span style="color: blue">else if </span>(event.detail) {
            y = -event.detail * 8;
        }
    }
    <span style="color: blue">var </span>jList = jQuery(<span style="color: #a31515">"#FrameTabs ul:eq(0)"</span>);
    <span style="color: blue">var </span>ml = jList.css(<span style="color: #a31515">"margin-left"</span>);
    ml = Number(ml.toLowerCase().replace(<span style="color: #a31515">"px"</span>, <span style="color: #a31515">""</span>));
    <span style="color: blue">if </span>((ml &lt; 0 &amp;&amp; y &gt; 0) || (ml - cW &gt; -fW - 40) &amp;&amp; y &lt; 0) {
        ml = ml + y;
        <span style="color: blue">if </span>(ml &gt;= 0) { ml = 0; }
        <span style="color: blue">if </span>(ml - cW &lt;= -fW - 40) { ml = cW - fW - 40;}
        jList.css(<span style="color: #a31515">"margin-left"</span>, ml);
    }
}
<span style="color: green">//注册Tab超出范围时左移、右移事件
</span><span style="color: blue">function </span>RegScrollFramesBtn() {
    jQuery(<span style="color: #a31515">"#FrameTabs .tab-right"</span>).click(<span style="color: blue">function</span>() { 
        ScrollFrames(window.cW,window.fW,<span style="color: blue">null</span>,-50);
    });
    jQuery(<span style="color: #a31515">"#FrameTabs .tab-left"</span>).click(<span style="color: blue">function</span>() { 
        ScrollFrames(window.cW,window.fW,<span style="color: blue">null</span>,50);
    });
}

<span style="color: green">//设置标签的标题
//tarFrame参数为目标iframe
</span><span style="color: blue">function </span>SetTabTitle(tarFrame) {
    <span style="color: blue">var </span>title = <span style="color: #a31515">""</span>;
    <span style="color: blue">try </span>{ title = tarFrame.contentWindow.document.title; } <span style="color: blue">catch </span>(e) { }
    <span style="color: blue">var </span>subTitle = title = title || <span style="color: #a31515">"(无标题)"</span>;
    <span style="color: blue">if </span>(title.length &gt; 6) { subTitle = title.substr(0, 5) + <span style="color: #a31515">".." </span>}
    jQuery(<span style="color: #a31515">"#iFrameTab" </span>+ jQuery(tarFrame).attr(<span style="color: #a31515">"tabid"</span>)).find(<span style="color: #a31515">"#frameTabTitle"</span>).html(subTitle).attr(<span style="color: #a31515">"title"</span>, title);
}

<span style="color: green">//初始化
</span>jQuery(<span style="color: blue">function</span>() {
    jQuery(<span style="color: #a31515">"#FrameTabs li[id^='iFrameTab']"</span>).iFrameTab();
    InitNewFrameTab(); <span style="color: green">//初始化新建标签页按钮
    </span>RegScrollFramesBtn();
});

</pre><a href="http://11011.net/software/vspaste"></a>
<p>Enjoy!! By Q.Lee.lulu。</p>
<p>最后给出代码打包下载：<a href="http://files.cnblogs.com/QLeelulu/FrameTab.rar" target="_blank">FrameTab.rar</a></p><img src ="http://www.cnblogs.com/QLeelulu/aggbug/1516643.html?type=1" width = "1" height = "1" /><br/><br/>-------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html" target="_blank">http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html</a><br/>作者博客: <a href="http://www.cnblogs.com/QLeelulu/" target="_blank">http://www.cnblogs.com/QLeelulu/</a> <a href="http://www.cnblogs.com/QLeelulu/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47950/" target="_blank">iPhone 3GS首发日创AT&amp;T多项纪录</a>]]></description></item><item><title>总结开发Silverlight项目准则</title><link>http://www.cnblogs.com/jv9/archive/2009/07/04/1516637.html</link><dc:creator>jv9</dc:creator><author>jv9</author><pubDate>Fri, 03 Jul 2009 16:16:00 GMT</pubDate><guid>http://www.cnblogs.com/jv9/archive/2009/07/04/1516637.html</guid><comments>http://www.cnblogs.com/jv9/archive/2009/07/04/1516637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jv9//comments/commentRss/1516637.html</wfw:commentRss><description><![CDATA[<p>加拿大国庆节国庆节刚刚过去，昨天Team开会，对前期Silverlight项目进行了总结，根据自己的开发经验列出一些开发Silverlight项目的基本原则，供大家参考。 </p><p>&nbsp;</p><ol><li>尽量使用代码控制；</li><li>尽可能早的计划好所有的用户控件；这样可以提前预期控件之间相互运作情况，便于整合项目；</li><li>尝试分割不同功能到不同的用户控件； 现在无论国内国外，开发队伍通常来说都是3个人以上，分割不同功能到不同的用户控件，可以减少相互之间的冲突和影响； 另外，在测试的时候发现问题，对于不同的小功能区域，方便Bug定位；另外也方便功能模块的再利用。 这个是现在Web项目开发的一个常用规则。</li><li>尽量少用Loaded事件； <br /></li><li>初始化的问题； 在每个用户控件中，需要创建Initialize和Deinitialize公共方法。&nbsp; 在实际项目中，你可以把Event Handlers或者必须要运行一次的代码，添加到Initialize方法中； 另外，也可以不用添加新的构造函数，直接传递参数到Initialize方法，通过New MyUserControl()使用这些参数； 最后，你可以使用Deinitialize方法清空控件，如果你调用了需要自定义的控件，使用Deinitialize方法是非常必要的；</li><li>不要在XAML添加Event Handles； 因为XAML是属于前台设计人员，而Event Handling属于开发人员，所以，Event Handler非常容易使用代码进行添加；另外一个原因，如果你使用代码添加了一个Event Handler，当该事件的控件名称改变或者该控件被删除，编译器会提出错误说明； 但是如果把Event Handler放在XMAL，当该事件的控件名称改变或者该控件被删除，项目将返回一个常规异常，没有详细错误信息提示；</li><li>认真设计项目布局； 我项目起步时，浪费了许多时间，在项目布局上，如果，布局合理，一定能节省很多开发时间；这样就需要开发人员对Grid，StackPanel，Canvas，Border，Popup，ScrollViewer，DockPanel等布局控件有深刻的了解；通常，你会发现，Grid非常适合做Header，Footer，Sidebar等等； 而复杂的布局结构，建议使用Canvas，需要注意的是，如果Canvas的高和宽是固定的，这样就很容易造成布局混乱，这点一定要注意；如果需要调整子控件的布局，推荐使用StackPanel；设计Silverlight项目布局，通常我们习惯使用Expression Blend，但是，强烈建议你，在使用Blend后，需要在VS下对XAML代码进行一次核查，这样可以确认各个控件的参数正确，同时也可以删除Blend自动产生的多余代码；</li><li>尽量避免使用固定的高度值和宽度值；在不设置固定的高度和宽度时候，Silverlight会根据你的解析度自适应浏览器界面，同时，各个控件将会自动缩放，以及排列位置； 另外，尽量不要使用负值的Margin，防止样式变形；</li><li>不要将机密信息放在代码中； 众所周知，Silverlight是一个客户端技术；用户在使用的同时，将会下载XAP文件到本地，这样非常容易被反编译； 所以，一定不要把敏感的机密数据放在代码中；</li><li>不要使用Image作为按钮控件； 在Silverlight1.1中没有Button控件，所以我们使用Image作为按钮； 但是在Silverlight2或者3中，已经提供了Button控件，我们需要尽量使用Button控件； 这个原则也适合其他控件，尽量使用Silverlight提供的控件，方便状态管理和事件管理；<br /></li><li>在项目性能上，尽量减少XAP的尺寸，提高加载项目速度，另外，减少各个用户控件的载入时间； 避免使用Windowless=True;&nbsp;</li><li>使用Web Service进行服务器数据存取； 因为Silverlight是运行在用户主机的，所以不能直接和服务器或者数据库进行通讯，当前有很多种方式可以存取服务器信息和数据库，但是推荐使用Web Service（WCF），个人认为这个方法是最简单，最快捷的；</li><li>小心使用Isolated Storage; 一定不要把机密信息放在Isolated Storage;</li></ol>以后想起来，再继续补充吧。<img src ="http://www.cnblogs.com/jv9/aggbug/1516637.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/jv9/archive/2009/07/04/1516637.html" target="_blank">http://www.cnblogs.com/jv9/archive/2009/07/04/1516637.html</a><br/>作者博客: <a href="http://www.cnblogs.com/jv9/" target="_blank">http://www.cnblogs.com/jv9/</a> <a href="http://www.cnblogs.com/jv9/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47949/" target="_blank">Silverlight开发大赛奖金高达10000美元</a>]]></description></item><item><title>解决IE8下无法播放rm的视频网站内容</title><link>http://www.cnblogs.com/liubiqu/archive/2009/07/04/1516636.html</link><dc:creator>小草</dc:creator><author>小草</author><pubDate>Fri, 03 Jul 2009 16:05:00 GMT</pubDate><guid>http://www.cnblogs.com/liubiqu/archive/2009/07/04/1516636.html</guid><comments>http://www.cnblogs.com/liubiqu/archive/2009/07/04/1516636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/liubiqu//comments/commentRss/1516636.html</wfw:commentRss><description><![CDATA[<p>今天在研究网站播放rm视频的问题时碰到的问题。我的机器是vista sp2+IE8 + realplayer11 后来在同事的机器上运行就正常。</p>
<p><span style="color: red">解决办法：</span></p>
<p>1、如果在 Windows Vista Service Pack 1 或 Windows Server 2008 上同时使用 Real Networks RealPlayer 11 和 Internet Explorer 8，会出现已知的程序兼容性问题。若要解决此问题，请安装修补程序 957055。安装 Internet Explorer 8 时，系统将自动接收此更新。</p>
<p>有关详细信息，请参阅 Microsoft 知识库中的以下文章：<a href="http://support.microsoft.com/kb/957055/">http://support.microsoft.com/kb/957055/</a>&nbsp;&nbsp; Vista SP2包含该更新包，但还是会有问题，建议删除IE8,恢复到IE7就正常了。我就是使用这个OK。如何删除IE8请查看<a id="homepage1_HomePageDays_DaysList_ctl03_DayItem_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/liubiqu/archive/2009/02/23/1396271.html">如何删除IE8</a></p>
<p>2、要同时安装Internet Explorer 8 和RealPlayer 11 ，必须先安装RealPlayer 11 ，才能安装Internet Explorer 8 。</p>
<p>3、如果安装Internet Explorer 8 后再安装RealPlayer 11 ，可能会遇到某些程序兼容性问题。要解决这些问题，请卸载Internet Explorer 8 ，然后再将它重新安装。<br /></p>
<p>另：</p>
<p>rm播放控件的详细的API接口说明：（非常的全面）但目前还没有找到mediaplayer的详细API，唉！遗憾&#8230;&#8230;</p>
<p><a href="http://service.real.com/help/library/guides/extend/embed.htm">http://service.real.com/help/library/guides/extend/embed.htm</a></p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/liubiqu/aggbug/1516636.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/liubiqu/archive/2009/07/04/1516636.html" target="_blank">http://www.cnblogs.com/liubiqu/archive/2009/07/04/1516636.html</a><br/>作者博客: <a href="http://www.cnblogs.com/liubiqu/" target="_blank">http://www.cnblogs.com/liubiqu/</a> <a href="http://www.cnblogs.com/liubiqu/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47947/" target="_blank">微软告攒机商第一案胜诉</a>]]></description></item><item><title>ASP.NET应用程序删除文件问题解决方法</title><link>http://www.cnblogs.com/richardtsuei/archive/2009/07/03/1516617.html</link><dc:creator>Richard Tsuei</dc:creator><author>Richard Tsuei</author><pubDate>Fri, 03 Jul 2009 15:03:00 GMT</pubDate><guid>http://www.cnblogs.com/richardtsuei/archive/2009/07/03/1516617.html</guid><comments>http://www.cnblogs.com/richardtsuei/archive/2009/07/03/1516617.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/richardtsuei//comments/commentRss/1516617.html</wfw:commentRss><description><![CDATA[<p>自从ASP.NET 2.0诞生就给我们项目带了一个很严重的问题，删除文件和目录会触发ASP.NET应用程序重新启动。直到ASP.NET 3.5一直认为微软会解决这个问题，解决发现还是没什么希望。ASP.NET 3.5只是采用了新的机制让在处理的线程不会中止，但下一个新的请求将会创建一个新的应用程序域，现有的应用程序域将维持到现在和在队列中排队的请求处理后再销毁。变相解决了应用程序重新启动给客户端带来的不快，但是也没有解决会话状态变量丢失的问题。<br /><br />在进行ASP.NET 2.0应用程序开发的时候，项目组采取的不办法如下：<br />在Web应用程序目录外创建临时文件夹；<br />在IIS中将临时文件夹创建为虚拟目录；<br />在Web应用程序中添加虚拟目录指向临时文件夹的物理地址。<br />这样做有一个缺点，就是需要在配置文件中记录临时文件夹的应用程序路径（～/Temp）和物理路径（c:\temp）；因为文件读写需要物理路径，而文件在IE中直接表示需要应用程序路径转换为相对URL路径。还有，这个解决方法因为没有在系统级别解决问题，所以在我们使用VS2005宿主应用程序时就无法进行调试。<br /><br />今天看了老外一篇文章，发现Windows Resource Kit中居然有命令行工具可以解决这个问题，此工具名为linkd使用方法如下：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">linkd&nbsp;c:</span><span style="color: #000000">\</span><span style="color: #000000">temp&nbsp;c:</span><span style="color: #000000">\</span><span style="color: #000000">wwwroot</span><span style="color: #000000">\</span><span style="color: #000000">webapp</span><span style="color: #000000">\</span><span style="color: #000000">temp</span></div>
<p>这样当你访问c:\wwwroot\webapp\temp或进行读写的时候，直接反映到c:\temp目录中，而且因为系统监视程序监视的实际物理路径而不是映射路径所以不会引起ASP.NET应用程序重新启动。<br /><br />这样就可以解决在VS宿主下的调试问题。</p><img src ="http://www.cnblogs.com/richardtsuei/aggbug/1516617.html?type=1" width = "1" height = "1" /><br/><br/>-----------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/richardtsuei/archive/2009/07/03/1516617.html" target="_blank">http://www.cnblogs.com/richardtsuei/archive/2009/07/03/1516617.html</a><br/>作者博客: <a href="http://www.cnblogs.com/richardtsuei/" target="_blank">http://www.cnblogs.com/richardtsuei/</a> <a href="http://www.cnblogs.com/richardtsuei/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47946/" target="_blank">Mono这只猴子招惹了谁？</a>]]></description></item><item><title>启用IIS的Gzip压缩</title><link>http://www.cnblogs.com/sojastudio/archive/2009/07/03/jerry.html</link><dc:creator>jerry liu</dc:creator><author>jerry liu</author><pubDate>Fri, 03 Jul 2009 14:57:00 GMT</pubDate><guid>http://www.cnblogs.com/sojastudio/archive/2009/07/03/jerry.html</guid><comments>http://www.cnblogs.com/sojastudio/archive/2009/07/03/jerry.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/sojastudio//comments/commentRss/1516614.html</wfw:commentRss><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现代的浏览器</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">IE6</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">Firefox</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都支持客户端</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">Gzip</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，也就是说，在服务器上的网页，传输之前，先使用</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">Gzip</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">压缩再传</span><span style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"> </font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输给客户端，客户端接收之后由浏览器解压显示，这样虽然稍微占用了一些服务器和客户端的</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">CPU</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但是换来的是更高的带宽利用率。对于纯文本来讲，压缩率是</span><span style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"> </font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相当可观的。如果每个用户节约</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">50%</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的带宽，那么你租用来的那点带宽就可以服务多一倍的客户了。二此功能在</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">IIS6.0</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得到了集成，但是并没有提供一个很</span><span style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"> </font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好的接口来操作。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<p><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">首先，如果你需要压缩静态文件（</span>HTML<span style="font-family: 宋体">），需要在硬盘上建一个目录，并给它&#8220;</span>IUSR_<span style="font-family: 宋体">机器名&#8221;这个用户的写权限。如果压缩动态文件</span> <span style="font-family: 宋体">（</span>PHP<span style="font-family: 宋体">，</span>asp<span style="font-family: 宋体">，</span>aspx<span style="font-family: 宋体">）就不需要了，因为它的页面是每次都动态生成的，压缩完就放弃。</span></p>
<p></span>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; <img height="107" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/1.gif" width="316" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; <img height="402" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/2.gif" width="265" border="0" /></p>
<p>&nbsp;&nbsp; <img height="387" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/3.gif" width="345" border="0" /></p>
<p>&nbsp;&nbsp; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">添加</span>Gzip<span style="font-family: 宋体">的</span>Web<span style="font-family: 宋体">服务扩展并设置为有效</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;&nbsp;<img height="253" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/4.gif" width="423" border="0" /></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;&nbsp; <img height="253" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/5.gif" width="423" border="0" /></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; <img height="319" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/6.gif" width="384" border="0" />&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;&nbsp; </span><span style="font-family: 宋体"><img height="144" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/7.gif" width="554" border="0" />&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt left 176.25pt; mso-list: l0 level1 lfo1"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置网站压缩有效</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp; </span><img height="333" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/8.gif" width="284" border="0" />&nbsp; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp;</p>
<p><span style="font-family: 宋体">&nbsp; 进入&#8220;服务&#8221;标签，选上启用动态内容压缩，静态内容压缩。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp;&nbsp; <img height="259" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/9.gif" width="436" border="0" /></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体">此时重启</span>IIS<span style="font-family: 宋体">，压缩就生效了。但是默认设置压缩的文件格式太少，可以进一步设置。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">修改</span> MetaBase.xml<span style="font-family: 宋体">，建议先备份。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp; </span><img height="188" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/10.gif" width="275" border="0" />&nbsp; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp; </p>
<p><span style="font-family: 宋体">&nbsp; 可以用记事本打开，找到</span> IIsCompressionScheme<span style="font-family: 宋体">，有三个相同名字的段，分别是</span>deflate,gzip,Parameters<span style="font-family: 宋体">，第三段不用管它，前两段有基本</span> <span style="font-family: 宋体">相同的参数</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;</span><span style="font-family: 宋体"><img height="494" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/11.gif" width="518" border="0" />&nbsp;</span></p>
<p><span style="font-family: 宋体">&nbsp;</span>HcDynamicCompressionLevel <span style="font-family: 宋体">，设置压缩率，取值</span>0~10<span style="font-family: 宋体">，</span>0<span style="font-family: 宋体">不压缩，</span>10<span style="font-family: 宋体">最高压缩率，这里设置成</span>9<span style="font-family: 宋体">，</span>9<span style="font-family: 宋体">是性价比最高的一个。</span></p>
<p>&nbsp; HcFileExtensions<span style="font-family: 宋体">，需要压缩的静态文件扩展名，默认只有</span>htm<span style="font-family: 宋体">，</span>html<span style="font-family: 宋体">，</span>txt<span style="font-family: 宋体">，可以把</span>js<span style="font-family: 宋体">，</span>css<span style="font-family: 宋体">添加进去。建议按原来的格式，用换行作为分隔。</span>&nbsp;&nbsp;&nbsp; HcScriptFileExtensions<span style="font-family: 宋体">，需要压缩的动态文件扩展名，这里添加</span>aspx<span style="font-family: 宋体">。</span></p>
<p>&nbsp; Location ="/LM/W3SVC/Filters/Compression/deflate"<span style="font-family: 宋体">设置如图：</span></p>
<p><span style="font-family: 宋体">&nbsp; </span></p>
<p><span style="font-family: 宋体"><img height="297" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/12.gif" width="530" border="0" />&nbsp; </span></p>
<p><span style="font-family: 宋体"></span>&nbsp;</p>
<p><span style="font-family: 宋体">&nbsp; </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">&nbsp;&nbsp; Location ="/LM/W3SVC/Filters/Compression/gzip"</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置如图：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp; </span></span><img height="307" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/13.gif" width="498" border="0" />&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp; &nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>iisreset -stop <span style="font-family: 宋体">停止</span>IIS<span style="font-family: 宋体">，保存</span>MetaBase.xml</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp;&nbsp; <img height="123" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/14.gif" width="271" border="0" /></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp;&nbsp; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>iisreset -start <span style="font-family: 宋体">启动</span>IIS</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp; ok,that's over,上传图片太累了，本文为原创，如转载，请注明原处！</p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/sojastudio/aggbug/1516614.html?type=1" width = "1" height = "1" /><br/><br/>-------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/sojastudio/archive/2009/07/03/jerry.html" target="_blank">http://www.cnblogs.com/sojastudio/archive/2009/07/03/jerry.html</a><br/>作者博客: <a href="http://www.cnblogs.com/sojastudio/" target="_blank">http://www.cnblogs.com/sojastudio/</a> <a href="http://www.cnblogs.com/sojastudio/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47945/" target="_blank">Firefox 3.5本月晚些时候即首次升级</a>]]></description></item><item><title>实战网络编程系列-网络编程基础（一）</title><link>http://www.cnblogs.com/wildman/archive/2009/07/03/1516604.html</link><dc:creator>野男人</dc:creator><author>野男人</author><pubDate>Fri, 03 Jul 2009 14:16:00 GMT</pubDate><guid>http://www.cnblogs.com/wildman/archive/2009/07/03/1516604.html</guid><comments>http://www.cnblogs.com/wildman/archive/2009/07/03/1516604.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/wildman//comments/commentRss/1516604.html</wfw:commentRss><description><![CDATA[摘要: 很多人天天上网，可能从来没去琢磨上网的过程是怎么样的，因为这已成为生活的一部分，是想当然的事情。如果您能从技术角度分析上网的过程，就大致明白网络通信是怎么回事，而了解了通信原理以后，再去做网站、WEB应用开发就能很快上手了<img src ="http://www.cnblogs.com/wildman/aggbug/1516604.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/wildman/archive/2009/07/03/1516604.html" target="_blank">http://www.cnblogs.com/wildman/archive/2009/07/03/1516604.html</a><br/>作者博客: <a href="http://www.cnblogs.com/wildman/" target="_blank">http://www.cnblogs.com/wildman/</a> <a href="http://www.cnblogs.com/wildman/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47944/" target="_blank">Google App Engine出现故障宕机6小时</a>]]></description></item><item><title>try...catch...finally中的finally一定会执行吗？（二，完结篇）</title><link>http://www.cnblogs.com/diggingdeeply/archive/2009/07/03/1516583.html</link><dc:creator>DiggingDeeply</dc:creator><author>DiggingDeeply</author><pubDate>Fri, 03 Jul 2009 13:15:00 GMT</pubDate><guid>http://www.cnblogs.com/diggingdeeply/archive/2009/07/03/1516583.html</guid><comments>http://www.cnblogs.com/diggingdeeply/archive/2009/07/03/1516583.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/diggingdeeply//comments/commentRss/1516583.html</wfw:commentRss><description><![CDATA[<p>今天早上匆匆写了篇文章，上班时间也找了找资料，也没找到任何有效性的说明，所以还得自己来。</p>
<p>还是先上一段测试代码：</p>
[代码]
<p>比较简单，就是在不同的时候打印几个字符串。</p>
<p>我看了看IL，在Foo 的代码里发现了一个特殊的指令，用ILDASM dump出IL：</p>
<p>&nbsp;</p>
[代码]
<p>&nbsp;</p>
<p>leave.s IL_0028,这个指令是什么意思呢？查了查msdn：</p>
<p>&nbsp;</p>
[代码]
<p>&nbsp;</p>
<p>看了看，也不是很明白，到底是怎么执行呢？我想到了一个Tool，sharpdevelop，一个开源的IDE，记得好像能调式IL，</p>
<p>下了一个安装，安下断点，调式发现leave.s实际上执行finally里的代码，然后再到IL_0028；我试着将IL_0028改为</p>
<p>IL_0029，结果同样执行完finally之后则跳到了IL_0029.</p>
<p>将IL_0028改为IL_000d，则没有执行finally里的代码，在IL_000d和IL_0018之间形成了死循环，不停的打印字符串&#8220;enter Foo try&#8221;。</p>
<p>将IL_0028改为IL_0030，则报错。</p>
<p>这时候大家可能就明白了，leave.s target其实就是执行其后的finally代码块然后跳到target处。</p>
<p><u><img alt="" src="http://www.cnblogs.com/Emoticons/qface/055243621.gif" /></u></p>
<p><strong></strong></p>
<p><strong>能保证finally一定执行的秘诀就在LEAVE指令。</strong></p>
<p><strong>
<hr />
</strong>
<p>&nbsp;</p>
<p>在这里再补充一点吧。免得大家看了没什么收获，其实方法都告诉大家了，可以自己去尝试啊，自己动手才能记得牢啊。</p>
<p>代码改为：</p>
<p>&nbsp;</p>
[代码]
<p>大家能看出打印结果是什么吗？（leave写错了，大家请忽略）</p>
<p><img height="193" alt="" src="http://images.cnblogs.com/cnblogs_com/diggingdeeply/try-catch-fianlly.jpg" width="315" border="0" /></p>
<p>看到了leave语句一个没有执行，但是嵌套的finally都执行了，这是为什么呢？</p>
<p>看Foo的IL：</p>
<p>&nbsp;</p>
[代码]
<p>&nbsp;</p>
<p>在try1里引发了异常，其实有没有catch都一样，经IL的 leave.s指令执行finally，但是可以看到，不仅执行里面的finally1，而且连外面的finally也执行了。</p>
<p>我在&lt;&lt;CLR via C#&gt;&gt;里看到这方面的内容，原意大概是：</p>
<p>&nbsp;</p>
[代码]
<p>&nbsp;</p>
<p>这样看来其实可以理解：leave指令会执行其后有层次关系finally，然后跳至函数的末尾，这点MSDN说的很含糊。</p> <img src ="http://www.cnblogs.com/diggingdeeply/aggbug/1516583.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/diggingdeeply/archive/2009/07/03/1516583.html" target="_blank">http://www.cnblogs.com/diggingdeeply/archive/2009/07/03/1516583.html</a><br/>作者博客: <a href="http://www.cnblogs.com/diggingdeeply/" target="_blank">http://www.cnblogs.com/diggingdeeply/</a> <a href="http://www.cnblogs.com/diggingdeeply/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47943/" target="_blank">消息称Facebook今年营收将达5.5亿美元</a>]]></description></item><item><title>收藏系列文章索引</title><link>http://www.cnblogs.com/peterzb/archive/2009/07/03/1516581.html</link><dc:creator>peterzb</dc:creator><author>peterzb</author><pubDate>Fri, 03 Jul 2009 13:11:00 GMT</pubDate><guid>http://www.cnblogs.com/peterzb/archive/2009/07/03/1516581.html</guid><comments>http://www.cnblogs.com/peterzb/archive/2009/07/03/1516581.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/peterzb//comments/commentRss/1516581.html</wfw:commentRss><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 分类整理了这么多文章收藏, 也到该做个总索引的时候了, 包含.Net技术, 移动应用开发, 安防监控/多媒体/流媒体专题开发, 数据库技术.</p>
<p>&nbsp;</p>
<p style="font-weight: bold; text-align: center">.Net开发 </p><br />
<div class="post">
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl14_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/05/24/1488497.html">.Net学习资料</a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 博客系列文章(设计模式,.net 2.0, ADO.NET, Report/Chart)及站点资源介绍&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/05/24/1488497.html">阅读全文</a></div>
<div class="postbody">&nbsp;</div>
<div class="postbody">
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl09_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/14/1502918.html"><font color="#223355">C# WinForm开发系列 - 文章索引</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 该系列主要整理收集在使用C#开发WinForm应用文章, 平时看到大家主要使用C#来开发Asp.Net应用,这方面的文章也特别多,而关于WinForm的文章相对少很多,而自己对WinForm一直比较感兴趣,这几年积累收藏了不少文章,现在整理一下分类推荐给大家,避免大家浪费大把的时间去找这方面的资料,因为找资料也是一件很累的事情,Google,Baidu一下,不断的点击,不断翻阅大量的博客文章,查找自己所需的.这个系列初步打算分入门介绍(开发环境搭建,.net基础概念), DataGrid/DataGridView, TreeView,ADO.Net(DataTable/DataSet/SQL Server),GDI+(图表ZedGraph/OWC等使用,图像处理,控件自定义绘制),打印,多线程(委托, 事件, 线程, BackgroundWorker), XML, 报表(RDLC,Excel,PDF,Word),File,Socket/WCF/Rometing/Web Services, 正则表达式以及其它方面.文章及相关代码搜集自网络,版权属于原作者! &nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/14/1502918.html"><font color="#1d58d1">阅读全文</font></a></div></div>
<div class="postbody">&nbsp;</div></div><br />
<p style="font-weight: bold; text-align: center">移动应用开发 </p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl43_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/05/12/1455256.html"><font color="#223355">Windows Mobile入门</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Windows Mobile开发入门篇,相关资源集锦(WM菜单使用,模拟器网络设置等),开发资源.&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/05/12/1455256.html"><font color="#1d58d1">阅读全文</font></a></div>
<p>&nbsp;</p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl10_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/13/1502771.html"><font color="#223355">Windows Mobile开发文章收藏</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 整理了一些Windows Mobile开发文章,包括园友们的入门精品文章, UI开发(窗体背景, 图像处理, 菜单, 全屏显示), 网络通信(GPRS开发, 拨号, TCP/UDP), .NET Compact Framework, 开发环境搭建, 模拟器的使用, Windows Mobile/WINCE 开发工具和资源, 具体应用开发(操作XML/INI文件, 手机通讯录, 手机视频流媒体应用)等; 希望对Windows Mobile初学者有用, 不必再去花时间找这类资料. &nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/13/1502771.html"><font color="#1d58d1">阅读全文</font></a></div>
<p>&nbsp;</p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl08_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/07/02/1515114.html"><font color="#223355">Windows Mobile 开发系列文章收藏 - 开篇</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近2个月来从事Windows Mobile下应用开发, 看了大量的文章资料; DEVDIV.NET论坛的Windows Mobile应用开发版的1600多篇的帖子大致都浏览了一下, 能够回答的也尽量积极解答, CSDN的Windows Mobile版最近几个月的帖子也差不多看了, 有时间要看看以前的一些帖子, 说不定有一些精华贴; 当然少不了博客园MVP们的博客如黎波, Freesc Huang , 施炯, 被遗弃的小指, 葛涵涛/JerryGe, AppleSeeker, 还有很多很多人的博客, 就不一一列举了, 大家可以看博客园 - Windows Mobile 应用开发团队, 博客园自己天天会上来浏览3-5次, 当然不止关注Windows Mobile开发方面,如C#,C++,数据库技术. 博客及论坛社区对自己提高帮助确实很非常大. 虽然公司就我一个人从事手机应用开发, 并且自己以前也不做这方面, 但我感觉自己不是一个人在战斗, 因为网络上及QQ群中实在有太多的热心人, 无私的分享技术, 帮助别人, 非常感谢博客园, DEVDIV,CSDN等技术社区, 感谢这么多从事移&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/07/02/1515114.html"><font color="#1d58d1">阅读全文</font></a></div>
<p>&nbsp;</p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl12_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/12/1501921.html"><font color="#223355">Symbian开发系列 - 入门篇</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要开始我的Symbian开发之旅了, 先收集一些相关资料,如Symbian概述, 开发平台搭建, 参考书籍与网络资源.&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/12/1501921.html"><font color="#1d58d1">阅读全文</font></a></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl04_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/25/1510814.html"><font color="#223355">移动开发资源集锦</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近开始进入移动应用开发方面, 从事在Windows Mobile, Symbian等平台下开发, 使用C++, C#, J2ME, 现收集整理一些相关开发资源, 以便后续查找.&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/25/1510814.html"><font color="#1d58d1">阅读全文</font></a></div>
<p><br />&nbsp;</p>
<p style="font-weight: bold; text-align: center">数据库技术 </p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl35_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/09/1499999.html"><font color="#223355">Oracle开发与使用文章收藏</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ORACLE EXP-IMP 参数详解,ORACLE中日期和时间函数汇总,Oracle中常用的to_Char用法详解（有FMT的详细列表）,SQLServer和Oracle常用函数对比,将公司系统从SqlServer 2K移植到Oracle 10g中的简要总结等内容&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/09/1499999.html"><font color="#1d58d1">阅读全文</font></a></div><br />
<p style="font-weight: bold; text-align: center">安防监控/多媒体/流媒体专题开发 </p>
<p>&nbsp;</p>
<h2><a id="ArchiveMonth1_Days_Entries_ctl11_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/13/1502497.html"><font color="#223355">视频监控相关文章</font></a> <br /></h2>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl01_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/29/1513002.html"><font color="#223355">手机视频监控系统开发系列文章</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 记录手机视频监控系统开发过程, 前期准备, 开发总结, 后续及其它相关技术如视频编解码/流媒体等.&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/29/1513002.html"><font color="#1d58d1">阅读全文</font></a></div>
<p>&nbsp;</p>
<p><a id="ArchiveMonth1_Days_Entries_ctl36_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/05/16/1458085.html"><font color="#223355">流媒体与视频监控开发相关博客文章系列收集</font></a> <br /></p><img src ="http://www.cnblogs.com/peterzb/aggbug/1516581.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/peterzb/archive/2009/07/03/1516581.html" target="_blank">http://www.cnblogs.com/peterzb/archive/2009/07/03/1516581.html</a><br/>作者博客: <a href="http://www.cnblogs.com/peterzb/" target="_blank">http://www.cnblogs.com/peterzb/</a> <a href="http://www.cnblogs.com/peterzb/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47937/" target="_blank">微软8月25日开始通过WSUS推送IE8</a>]]></description></item><item><title>[原创]WCF技术剖析之八：ClientBase&amp;lt;T&amp;gt;中对ChannelFactory&amp;lt;T&amp;gt;的缓存机制</title><link>http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html</link><dc:creator>Artech</dc:creator><author>Artech</author><pubDate>Fri, 03 Jul 2009 12:36:00 GMT</pubDate><guid>http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html</guid><comments>http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/artech//comments/commentRss/1516573.html</wfw:commentRss><description><![CDATA[<p>和传统的分布式远程调用一样，WCF的服务调用借助于服务代理（Service Proxy）。而ChannelFactory&lt;T&gt;则是服务代理的创建者。WCF采用基于终结点（Endpoint）服务消费方式：WCF服务通过一个或者多个终结点暴露给潜在的服务消费者，服务的消费中通过与之匹配的终结点与之交互。在客户端，我们具有两种典型的服务代理创建方式，其一是通过诸如SvcUtil.exe这样的工具导入服务的元数据生成相应的服务代理（一个继承自ClientBase&lt;T&gt;的类型）代码和相关配置；其二是直接通过相应的终结点信息（通过代码指定或者配置）创建ChannelFactory&lt;T&gt;对象，并借助该对象直接进行服务代理的创建。 </p> <p>实际上，即使通过ClientBase&lt;T&gt;对象进行服务调用，其内部也是调用ChannelFactory&lt;T&gt;创建的服务代理。整个ChannelFactory&lt;T&gt;的创建是一项相对复杂并且费时的工作，会涉及很多诸如反射、配置文件的读取等操作。为了提高服务调用的性能，在.NET 3.5中，WCF在ClientBase&lt;T&gt;中引入了ChannelFactory&lt;T&gt;的缓存机制。 </p> <p><font size="4"><strong>一、如何实现对ChannelFactory&lt;T&gt;的缓存</strong></font></p> <p>为了让读者对ChannelFactory&lt;T&gt;的缓存机制有一个直观的认识，我们来做一个简单的实验：在一个Console应用中执行如下的代码，其中CalculatorClient可以看成是本节开篇时自定义的服务代理类。在本例中，先后以相同的方式（调用相同的构造函数，传入相同的参数）创建并开启了两个CalculatorClient对象，然后检验它们的ChannelFactory是否是相同的对象。</p><pre class="csharpcode">CalculatorClient proxy1 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>);<br>proxy1.Open();<br>CalculatorClient proxy2 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>);<br>proxy2.Open();<br>Console.WriteLine(<span class="str">"object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = {0}"</span>, </pre><pre class="csharpcode"><span class="kwrd">object</span>.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory));<br></pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p>&nbsp; </p>
<p>输出结果：</p><pre class="csharpcode">object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = True</pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>从输出的结果，可以看出两个不同的ClientBase&lt;T&gt;对象使用了相同的ChannelFactory&lt;T&gt;对象。这得益于在.NET 3.5中新加入的ChannelFactory&lt;T&gt;的缓存机制。那么，在WCF客户端框架内部对ChannelFactory&lt;T&gt;的缓存是如何实现的呢？</p>
<p>实际上，ChannelFactory&lt;T&gt;的缓存实现很简单，被创建出来的ChannelFactory&lt;T&gt;集合通过ClientBase&lt;T&gt;的一个静态变量保存起来。我们可以将这个ChannelFactory&lt;T&gt;集合看成是一个字典，字典的值就是ChannelFactory&lt;T&gt;，而键则通过下面三个对象派生： </p>
<ul>
<li><strong>CallbackInstance</strong>：以InstanceContext对象表示的对回调对象的封装； 
<li><strong>EndpointConfigurationName</strong>：终结点在配制文件中的名称； 
<li><strong>RemoteAddress</strong>：终结点的远程地址，类型为EndpointAddress。</li></ul>
<p>它们分别与ClienBase&lt;T&gt;构造函数中相应的参数相匹配。当调用某个构造函数创建对象的时候，WCF将传入的三个参数作为Key（如果再构造函数中并未指定相应的参数，会使用默认值，EndpointConfigurationName、CallbackInstance和RemoteAddress的默认值分别为*、null和null），从缓存（静态变量）中去找匹配的ChannelFactory&lt;T&gt;对象，如果成功找到，则直接返回，否则重新创建，在返回之前将其放入缓存中。 </p>
<p>从这个意义上讲，多个ClienBase&lt;T&gt;对象能够重用相同的ChannelFactory&lt;T&gt;对象的前提是它们使用相同的构造函数，并传入相同的参数被创建。为了验证这一点，再来做一个实验，只须要将上面的例子稍加修改，通过另一个重载构造函数来创建CalculatorClient对象。</p><pre class="csharpcode">CalculatorClient proxy1 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>，<span class="kwrd">new</span> EndpointAddress(<span class="str">"http://127.0.0.1:9999/calculateservice"</span>);<br>proxy1.Open();<br><br>CalculatorClient proxy2 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>);<br>proxy2.Open();<br>Console.WriteLine(<span class="str">"object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = {0}"</span>, </pre><pre class="csharpcode"><span class="kwrd">object</span>.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory));<br></pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>输出结果：</p><pre class="csharpcode">object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = False</pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>实际上，proxy1和proxy2最终使用的终结点地址是相同的（<em><a href="http://127.0.0.1:9999/">http://127.0.0.1:9999/</a> calculatorservice</em>），只不过一个是通过代码指定的，另一个则是通过配置文件配置的。但是，就是因为创建ClienBase&lt;T&gt;时使用了不同的构造函数重载，导致不能重用同一个ChannelFactory&lt;T&gt;对象。</p>
<p>ChannelFactory&lt;T&gt;的重用避免了频繁地常见ChannelFactory&lt;T&gt;对象，从而获得更好的性能。在具体的应用中，我们应该尽可能地利用这样的机制。但是，由于编程人员对ChannelFactory&lt;T&gt;的缓存机制不了解，不知不觉就会使这个缓存机制失效。接下来就来讨论这个问题。 </p>
<p><strong><font size="4">二、ChannelFactory&lt;T&gt;缓存机制的失效</font></strong></p>
<p>总体来讲，下面的两种情况会引起ChannelFactory&lt;T&gt;缓存机制失效。 </p>
<ul>
<li>在构造函数中传入绑定对象构建ClientBase&lt;T&gt;； 
<li>在ClientBase&lt;T&gt;开启（调用Open方法）之前，访问如下三个只读属性：ChannelFactory、Endpoint和ClientCredential。</li></ul>
<p>为了加深读者的理解，我们通过实验的方式来证实上面的两种说法。为了验证在构造函数中传入绑定对象对ChannelFactory&lt;T&gt;缓存机制的影响，写了如下的代码：通过Binding和EndpointAddress对象创建ClienBase&lt;T&gt;对象。</p><pre class="csharpcode">Binding binding = <span class="kwrd">new</span> BasicHttpBinding();<br>EndpointAddress address = <span class="kwrd">new</span> EndpointAddress(<span class="str">"http://127.0.0.1:9999/calculateservice"</span>);<br>CalculatorClient proxy1 = <span class="kwrd">new</span> CalculatorClient(binding,address);<br>proxy1.Open();<br>CalculatorClient proxy2 = <span class="kwrd">new</span> CalculatorClient(binding, address);<br>proxy2.Open();<br>Console.WriteLine(<span class="str">"object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = {0}"</span>, </pre><pre class="csharpcode"><span class="kwrd">object</span>.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory));<br></pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>输出结果：</p><pre class="csharpcode">object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = False</pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>接下来，再通过实验整个在ClientBase&lt;T&gt;开启（调用Open方法）之前访问ChannelFactory、Endpoint和ClientCredential三个只读属性对ChannelFactory&lt;T&gt;缓存机制的影响。在这里，以访问ChannelFactory属性为例</p><pre class="csharpcode">CalculatorClient proxy1 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>);<br>ChannelFactory&lt;ICalculator&gt; factory = proxy1.ChannelFactory;<br>proxy1.Open();<br>CalculatorClient proxy2 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>);<br>proxy2.Open();<br>Console.WriteLine(<span class="str">"object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = {0}"</span>, </pre><pre class="csharpcode"><span class="kwrd">object</span>.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory));<br></pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>输出结果：</p><pre class="csharpcode">object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = False</pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>在上面的例子中，在Proxy1的Open方法调用之前，调用了只读属性ChannelFactory，并将其赋值到一个临时变量中，中间根本没有对ChannelFactory&lt;T&gt;作任何修改，仅仅一次我们认为微不足道的对只读属性的访问就破坏了WCF客户端框架对ChannelFactory&lt;T&gt;的缓存机制。</p>
<p><strong><font size="4">三、如何有效利用ChannelFactory&lt;T&gt;的缓存机制</font></strong></p>
<p>为了能够充分利用ChannelFactory&lt;T&gt;的缓存机制，获得更好的服务调用性能，我们可以得出以下两个最佳实践： </p>
<ul>
<li>避免通过人为指定绑定对象创建ClientBase&lt;T&gt;对象，应该尽可能使用配置的绑定信息； 
<li>避免在ClientBase&lt;T&gt;开启之前读取ChannelFactory、Endpoint和ClientCredential三个属性，或者在创建ClientBase&lt;T&gt;之后显式调用Open方法开启ClientBase&lt;T&gt;对象。</li></ul>
<p><strong>P.S.</strong> 以上内容部分节选自《WCF技术剖析（卷1）》第八章。</p><img src ="http://www.cnblogs.com/artech/aggbug/1516573.html?type=1" width = "1" height = "1" /><br/><br/>-----------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html" target="_blank">http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html</a><br/>作者博客: <a href="http://www.cnblogs.com/artech/" target="_blank">http://www.cnblogs.com/artech/</a> <a href="http://www.cnblogs.com/artech/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47935/" target="_blank">暴风称新旧版更换完毕 总计超4000万用户换装</a>]]></description></item></channel></rss>