﻿<?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 11:05:26 GMT</lastBuildDate><pubDate>Sat, 04 Jul 2009 11:05:26 GMT</pubDate><ttl>60</ttl><item><title>[原创] WCF技术剖析之九：服务代理不能得到及时关闭会有什么后果?</title><link>http://www.cnblogs.com/artech/archive/2009/07/04/1516908.html</link><dc:creator>Artech</dc:creator><author>Artech</author><pubDate>Sat, 04 Jul 2009 09:58:00 GMT</pubDate><guid>http://www.cnblogs.com/artech/archive/2009/07/04/1516908.html</guid><comments>http://www.cnblogs.com/artech/archive/2009/07/04/1516908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/artech//comments/commentRss/1516908.html</wfw:commentRss><description><![CDATA[<p>我们想对WCF具有一定了解的人都会知道：在客户端通过服务调用进行服务调用过程中，服务代理应该及时关闭。但是如果服务的代理不等得到及时的关闭，到底具有怎样的后果？什么要关闭服务代理？在任何时候都需要关闭服务代理吗？是否有一些例外呢？本篇文章将会围绕着这些问题展开。</p> <p><font size="4"><strong>一、会话信道（Sessionful Channel） V.S. 数据报信道（Datagram Channel）</strong></font></p> <p>WCF通过信道栈实现了消息的编码、传输及基于某些特殊功能对消息的特殊处理，而绑定对象是信道栈的缔造者，不同的绑定类型创建出来的信道栈具有不同的特性。就对会话的支持来讲，我们可以将信道分为以下两种： </p> <ul> <li><strong>会话信道（</strong><strong>Sessionful Channel</strong><strong>）：</strong>会话信道确保客户端和服务端之间传输的消息能够相互关联，但是信道的错误（Fault）会影响后续的消息交换；  <li><strong>数据报信道（</strong><strong>Datagram Channel</strong><strong>）：</strong>即使在同一个数据报信道中，每次消息的交换都是相互独立，信道的错误也不会影响后续的消息交换。</li></ul> <p>对于绝大部分绑定类型（BasicHttpBinding除外），在默认的情况下创建的都是会话信道。对于WCF客户端来说，如果进行基于会话信道的服务调用，有一些问题需要引起足够的重视，如果使用不当，不但影响客户端本身的服务调用，还会对服务处理请求的吞吐量造成很大的影响。 </p> <p><font size="4"><strong>二、服务代理的关闭与并发会话（Concurrent Sessions）的限制</strong></font> </p> <p>基于会话信道服务调用须要注意的第一个问题和WCF流量限制有关，为了使读者对这个问题先有一个直观认识，我们照例通过一个简单的实验来重现须要解决的问题。本例使用我们熟悉的计算服务例子，在服务寄宿的时候采用WsHttpBinding，下面是客户端程序。</p><pre class="csharpcode">Binding binding = <span class="kwrd">new</span> WsHttpBinding();<br>EndpointAddress address = <span class="kwrd">new</span> EndpointAddress(<span class="str">"http://127.0.0.1:9999/calculateservice"</span>);<br>ChannelFactory&lt;ICalculator&gt; channelFactory = <span class="kwrd">new</span> ChannelFactory&lt;ICalculator&gt;(binding, address);<br><span class="kwrd">for</span> (<span class="kwrd">int</span> i = 1; i &lt;= 20; i++)<br>{<br>    <span class="kwrd">try</span>
    {
        ICalculator calculator = channelFactory.CreateChannel();
        Console.WriteLine(<span class="str">"{3}: x + y = {2} when x = {0} and y = {1}"</span>, 1, 2, calculator.Add(1, 2), i);<br>    }<br>    <span class="kwrd">catch</span> (Exception ex)<br>    {<br>        Console.WriteLine(<span class="str">"{0}t: {1}"</span>, i, ex.Message);<br>    }<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">1 ： x + y = 3 when x = 1 and y = 2<br>2 ： x + y = 3 when x = 1 and y = 2<br>......<br>10： x + y = 3 when x = 1 and y = 2<br>11： x + y = 3 when x = 1 and y = 2<br>12：请求通道在等待 00:00:59.9840000以后答复超时。增加传递给请求调用的超时值，或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能是更长超时的一部分<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>从输出的结果可以看出，虽然在代码中我们通过一个for循环进行了20次服务调用，但是真正成功执行的仅仅有11次，第12次进行服务调用的时候，抛出Timeout异常。这种情况的出现源于WCF对并发会话数量的控制。说得具体点，WCF对一个ServiceHost所能处理的并发会话作了限制，在默认的情况下，允许的最大并发会话数量为10。</p>
<p>那么细心的读者马上会问一个问题，既然默认的并发会话数量为10，为什么上面的例子中，会有11次成功的并发服务调用呢？这是因为，服务端的信道监听器允许一个额外的会话信道。在很多情况下，11个并发会话肯定是不能满足具体的需求的，那么是否可通过相应的配置根据具体的需求灵活指定一个合适的最大并发会话数量呢？答案是肯定的，服务允许的最大并发会话可以通过ServiceThrottlingBehavior服务行为的MaxConcurrentSessions属性进行配置。在下面的配置中，将该值设为了20。</p><pre class="csharpcode"><span class="kwrd">&lt;?</span><span class="html">xml</span> <span class="attr">version</span><span class="kwrd">="1.0"</span> <span class="attr">encoding</span><span class="kwrd">="utf-8"</span> ?<span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">configuration</span><span class="kwrd">&gt;</span>  <br>    <span class="kwrd">&lt;</span><span class="html">system.serviceModel</span><span class="kwrd">&gt;</span>       <br>        <span class="kwrd">&lt;</span><span class="html">behaviors</span><span class="kwrd">&gt;</span>
            <span class="kwrd">&lt;</span><span class="html">serviceBehaviors</span><span class="kwrd">&gt;</span>
                <span class="kwrd">&lt;</span><span class="html">behavior</span> <span class="attr">name</span><span class="kwrd">="highConcurrencyBehavior"</span><span class="kwrd">&gt;</span>
                    <span class="kwrd">&lt;</span><span class="html">serviceThrottling</span> <span class="attr">maxConcurrentSessions</span><span class="kwrd">="20"</span> <span class="kwrd">/&gt;</span>
                <span class="kwrd">&lt;/</span><span class="html">behavior</span><span class="kwrd">&gt;</span>
            <span class="kwrd">&lt;/</span><span class="html">serviceBehaviors</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;/</span><span class="html">behaviors</span><span class="kwrd">&gt;</span>
         ... ...
    <span class="kwrd">&lt;/</span><span class="html">system.serviceModel</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">configuration</span><span class="kwrd">&gt;</span>
</pre>
<p>&nbsp;</p>
<p>WCF对服务的并发会话的限制给WCF客户端提出了一个要求，那就是在服务代理不再使用的情况下，应该及时将其关闭。基于服务代理对象的会话会随着服务代理的关闭而关闭。服务端在处理客户端请求的时候，如果当前并发的会话数量超过了所允许的范围，后续的请求将会被放入等待队列，以等待现有会话的结束。对于客户端来说，服务调用在允许的超时时限（默认1分钟）内还未接收到回复，则会抛出一个TimeoutException异常，如例子所表现的一样。如果能够及时地关闭服务代理对象，即使是2000次调用都没有问题，如下所示：</p><pre class="csharpcode">Binding binding = <span class="kwrd">new</span> WSHttpBinding();<br>EndpointAddress address = <span class="kwrd">new</span> EndpointAddress(<span class="str">"http://127.0.0.1:9999/calculateservice"</span>);<br>ChannelFactory&lt;ICalculator&gt; channelFactory = <span class="kwrd">new</span> ChannelFactory&lt;ICalculator&gt;(binding, address);<br><span class="kwrd">for</span> (<span class="kwrd">int</span> i = 1; i &lt;= 2000; i++)<br>{<br>    ICalculator calculator = channelFactory.CreateChannel();<br>    Console.WriteLine(<span class="str">"{3}: x + y = {2} when x = {0} and y = {1}"</span>, 1, 2, calculator.Add(1, 2), i);<br>     (calculator <span class="kwrd">as</span> ICommunicationObject).Close();<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">1 ： x + y = 3 when x = 1 and y = 2<br>2 ： x + y = 3 when x = 1 and y = 2<br>......<br>1999： x + y = 3 when x = 1 and y = 2<br>2000： x + y = 3 when x = 1 and y = 2<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><font size="4"><strong>三、服务代理的关闭与否对数据报信道没有影响</strong></font></p>
<p>上面讲的是对最大会话的限制，实际也可以说成是对最大会话信道的限制，那么对于非会话信道是否也有此限制呢？实践出真知，照例通过具体的例子来说明问题。我们知道绑定是信道的创建者，信道的特性通过组成绑定的元素（绑定元素）决定，所以信道对会话支持的特性也不例外。以上面例子使用的WsHttpBinding为例，只有WsHttpBinding的安全（Security）或可靠会话（Reliable Session）开启的情况下，创建的信道才具有会话的特性，否则创建出来的信道是不能支持信道的。在默认的情况下，WsHttpBinding的安全模式（SecurityMode）为基于消息的安全，所以创建出来的信道自动被赋予了会话的特性。 </p>
<p>为了验证在非会话信道的情况下，WCF最大并发会话限制是否存在，我们对上面的代码稍加修改，在创建WsHttpBinding的时候，将安全模式设为SecurityMode.None（当然，在进行服务寄宿的时候，WsHttpBinding也须要进行相同的设置）。通过最终输出结果可以看出，MaxConcurrentSessions的限制不适合非会话邦定。</p><pre class="csharpcode">Binding binding = <span class="kwrd">new</span> WSHttpBinding(SecurityMode.None);<br>EndpointAddress address = <span class="kwrd">new</span> EndpointAddress(<span class="str">"http://127.0.0.1:9999/calculateservice"</span>);<br>ChannelFactory&lt;ICalculator&gt; channelFactory = <span class="kwrd">new</span> ChannelFactory&lt;ICalculator&gt;(binding, address);<br><span class="kwrd">for</span> (<span class="kwrd">int</span> i = 1; i &lt;= 2000; i++)<br>{<br>    ICalculator calculator = channelFactory.CreateChannel();<br>    Console.WriteLine(<span class="str">"{3}: x + y = {2} when x = {0} and y = {1}"</span>, 1, 2, calculator.Add(1, 2), i);<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">1 ： x + y = 3 when x = 1 and y = 2<br>2 ： x + y = 3 when x = 1 and y = 2<br>......<br>1999： x + y = 3 when x = 1 and y = 2<br>2000： x + y = 3 when x = 1 and y = 2</pre>
<p>&nbsp;</p>
<p><strong>P.S. 部分内容节选自《WCF技术剖析（卷1）》第八章</strong></p>
<p>&nbsp;</p>
<p><strong>WCF技术剖析系列：</strong></p>
<p><a href="http://www.cnblogs.com/artech/archive/2009/06/18/1506163.html"><font size="2">WCF技术剖析之一：通过一个ASP.NET程序模拟WCF基础架构</font></a><br><a href="http://www.cnblogs.com/artech/archive/2009/06/20/1507165.html"><font size="2">WCF技术剖析之二：再谈IIS与ASP.NET管道</font></a><br><a href="http://www.cnblogs.com/artech/archive/2009/06/21/1507945.html"><font size="2">WCF技术剖析之三：如何进行基于非HTTP的IIS服务寄宿</font></a><br><a href="http://www.cnblogs.com/artech/archive/2009/06/24/1510497.html"><font size="2">WCF技术剖析之四：基于IIS的WCF服务寄宿（Hosting）实现揭秘</font></a><br><a href="http://www.cnblogs.com/artech/archive/2009/06/25/1511165.html"><font size="2">WCF技术剖析之五：利用ASP.NET兼容模式创建支持会话（Session）的WCF服务</font></a><br><a href="http://www.cnblogs.com/artech/archive/2009/06/26/1511916.html"><font size="2">WCF技术剖析之六：为什么在基于ASP.NET应用寄宿（Hosting）下配置的BaseAddress无效</font></a><br><a href="http://www.cnblogs.com/artech/archive/2009/06/29/1513317.html"><font size="2">WCF技术剖析之七：如何实现WCF与EnterLib PIAB、Unity之间的集成</font></a><br><a href="http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html"><font size="2">WCF技术剖析之八：ClientBase&lt;T&gt;中对ChannelFactory&lt;T&gt;的缓存机制</font></a><br><a href="http://www.cnblogs.com/artech/archive/2009/07/04/1516908.html"><font size="2">WCF技术剖析之九：服务代理不能得到及时关闭会有什么后果?</font></a></p><img src ="http://www.cnblogs.com/artech/aggbug/1516908.html?type=1" width = "1" height = "1" /><br/><br/>-----------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/artech/archive/2009/07/04/1516908.html" target="_blank">http://www.cnblogs.com/artech/archive/2009/07/04/1516908.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/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a>]]></description></item><item><title>大专歧视是一种阑尾炎</title><link>http://www.cnblogs.com/lizhuan/archive/2009/07/04/1516906.html</link><dc:creator>ASP.NET爱好</dc:creator><author>ASP.NET爱好</author><pubDate>Sat, 04 Jul 2009 09:55:00 GMT</pubDate><guid>http://www.cnblogs.com/lizhuan/archive/2009/07/04/1516906.html</guid><comments>http://www.cnblogs.com/lizhuan/archive/2009/07/04/1516906.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/lizhuan//comments/commentRss/1516906.html</wfw:commentRss><description><![CDATA[<div class="articleTitle">
<div style="display: inline"><span class="time"></span></div></div>
<div class="articleTag"></div>
<div id="articleBody" class="articleContent">
<h1><font style="font-size: 18px"></font>&nbsp;</h1>
<div>
<p>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>回过头来，我又仔细地看了一遍，有些话还是想说出来。</p>
<p>&nbsp;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 在我准备升本考试之前，已经看过了徐老师的《图穷对话录》、《黄金是怎样炼成的》、《骑驴找马》，我也了解到徐老师对专升本现象的看法，当时我也犹豫过是考还是不考，但是我分析了自己当时的具体情况，觉得考上本科以后对自己的人生会有很大的益处。于是通过自己的努力，我最终考上了，成了一名全国重点大学的学生，和许多各省的高考前三名成为了同学。我以为他们还很优秀，但是事实并不非如此，经过我的努力我在学校里自认为还是优秀的，对有些问题的看法比他们要深刻，以此我找到了自信，认为专科生出身的我是很优秀的。这点和您的观点是相同的，我想说专升本的好与不好是不能一概而论的，只要自己有不断的更高的追求，找到人生的方向才是最重要的。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 徐老师，考上了本科我有幸在学校的一次讲座中见到了您，那天您发着高烧，刚刚打完点滴，披着大棉袄，站在台上，用您那特有的嘶哑的声音给我们讲您重复了无数遍的真理，我在下面听得津津有味，因为我明白您的良苦用心，我相信您也一定看见我了：）。我深深地体会到了您的敬业。您觉得我的升本是不是值得呢？呵呵&#8230;&#8230;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 正因为我在学校里找到了自信，于是我又面临着是考研还是不考的问题，我用您的理论又分析了自己的情况以后，决定了不考研。今天我知道我的决定是正确。</p>
<p>我要谢谢徐老师，是您给我的学业和人生指明了大方向（可不是给您戴高帽子）。我现在都可以用您的理论给我身边的高考前三名答疑解惑了，您说厉害不厉害。</p>
<p>不知不觉写了这么多，只是想表达对徐老师的谢意，也要说考与不考是要充分考虑自己的实际情况的，不要盲目，要对自己的每一个决定负责任。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 我的希望能够与大家交流，当然还有徐老师：）</p>
<p>徐小平回复：</p>
<p>&nbsp;<wbr> 你的专升本也许是成功的。我祝贺你。</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>作为中国最大教育机构的创始人之一，我从来没有反对过留学、反对考研、反对专升本，我只反对盲目的学位至上论。（大家都不读书了，新东方怎么办？）</p>
<p>读书的目的是为社会所用。如果不能为社会所用，为什么要读？或者如果不读已经能够为社会所用，为什么不用？</p>
<p>驱动青年专升本的主要问题有几个：</p>
<p>&nbsp;<wbr>&nbsp;<wbr> 1.&#8220;万般皆下品，惟有读书高&#8221;的阑尾炎现象。说它是阑尾炎，因为这个观念已经落后于现代社会的现状。比尔&#183;盖茨也是大专。李嘉诚没有上过什么学。尽管在一个理想社会中，人人都应该接受高等教育。但现实是：即使在教育最发达、教育机会最普及、最平等的美国，其高中生的大学入学率虽然达到了百分之百，即每个高中毕业生都可以上大学，包括社区大学即大专，但美国总人口中拥有高等教育学位的人，依然只有百分之三十几。并非所有人都能上大学，并非所有人都想上大学、也并非所有人都有必要上大学。</p>
<p>&nbsp;<wbr>&nbsp;<wbr> 2.上述学历阑尾炎现象导致的大专歧视。大专歧视，这是中国社会价值观里面种种恶心现象之中最恶心的现象之一。中国这个依然非常贫穷的社会，其实穷就穷在观念上。谁不想先富起来？但如果不是邓小平说了一句：让一部分人先富起来，全党全军全国人民，都可能把那个先富起来的人，千刀万剐整死&#8212;&#8212;这就是观念决定贫富强弱的一个最大例子。在可见的未来，能够直接升大学的青年人，只能占同龄人口总数的百分之二三十，其余上千万青年人怎么办？等待着接受歧视吗&#8212;&#8212;他妈的这种观念太恶心了！教育者有责任把学位崇拜，变成成功崇拜，就业崇拜，市场崇拜，金钱崇拜&#8212;&#8212;是骡子是马，拉到职场上遛遛，这才是一个健康的社会应该有的价值观、人才观、成功观啊！</p>
<p>&nbsp;<wbr>&nbsp;<wbr> 3.中国的大专，与社会需求也有严重脱节现象。课程设置落后，不实用，导致学生前途无望&#8212;&#8212;既然大专找不到工作，那么就读一个也找不到工作的本科吧！</p>
<p>那些正在专升本、已经专升本，或者希望专升本的朋友们，我爱你们，鼓励你们的学习和奋斗精神，但我以全部智慧（假如有的话）和爱（很多很多），要求你们思考几个问题：</p>
<p>1.这个专业毕业后的就业前景如何？</p>
<p>2.以往这个专业毕业后的学生就业前景如何？行业分布如何？</p>
<p>3.如果不升本，我是否可以获得同样的就业机会？</p>
<div>
<p>4.升本所需要的人力物力财力心力（心力非常重要啊）和青春力（时间成本），如果花在就业场上，是否能够获得更高的成功？</p>
<p>5.脱产升本与兼职升本，是否可以协调起来？边工作，边学习，读书是学习，使用也是学习嘛（毛主席说的）。</p>
<p>大量专升本的同学，企图通过专升本找到自信心，这个自信心，是虚妄的自信心，因为它不是建立在&#8220;自信&#8221;的基础上，而是建立在&#8220;他信&#8221;的基础上。不要随波逐流，不要人云亦云，而要知道自己要什么？自己要什么&#8212;&#8212;要学以致用的能力，要为社会服务的技能，要就业竞争力，要就业之后积累的行业竞争力，要挣钱的机会和能力，要养活自己、养活爸爸妈妈岳父岳母（或公公婆婆）的光荣与梦想！</p>
<p>还要考研吗？上述观点，适用于此一问题，并本书中的另外一篇文章：考研一定要有明确的职业目标。</p>
<p>我爱你们，我的大专生朋友们！</p>
<p>本文不代表我思想是转载新浪博客上的一篇文章和大家一起分享一下。</p></div></div></div><img src ="http://www.cnblogs.com/lizhuan/aggbug/1516906.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/lizhuan/archive/2009/07/04/1516906.html" target="_blank">http://www.cnblogs.com/lizhuan/archive/2009/07/04/1516906.html</a><br/>作者博客: <a href="http://www.cnblogs.com/lizhuan/" target="_blank">http://www.cnblogs.com/lizhuan/</a> <a href="http://www.cnblogs.com/lizhuan/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>WCF安全之自定义用户名密码验证方式</title><link>http://www.cnblogs.com/viter/archive/2009/07/04/wcf_usernamepassword.html</link><dc:creator>veter</dc:creator><author>veter</author><pubDate>Sat, 04 Jul 2009 09:21:00 GMT</pubDate><guid>http://www.cnblogs.com/viter/archive/2009/07/04/wcf_usernamepassword.html</guid><comments>http://www.cnblogs.com/viter/archive/2009/07/04/wcf_usernamepassword.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/viter//comments/commentRss/1516893.html</wfw:commentRss><description><![CDATA[<h2><strong style="font-size: 24pt;"></strong>　　<strong style="font-size: 14pt;">概述</strong><span style="font-size: 24pt;"></span></h2><p>　 　Windows Communication Foundation (WCF) 是 Microsoft 为构建面向服务的应用程序而提供的统一编程模型（摘自MSDN），在分布式环境下的安全问题尤为重要，如果你觉得使用了WCF默认的安全措施可以让你高枕 无忧，那明天你可就以回家种田了，当然，对于学习来说，足够了~，但我们讲的是真正的项目应用，WCF在各种协议下的安全提供和保证是不尽相同的。</p><p>　　<strong><span style="font-size: 14pt;">背景</span></strong><br /></p><p>　　<span style="color: #000000;">在上一篇X509证书介绍后，相信大家对怎么使用X509证书在WCF的安全策略中有一定的了解，本章主要讲述在WCF的消息安全模式下的服务器对客户端基于自定义用户名和密码的身份验证模式。当所有内置 UserNamePassword 验证模式均不符合应用程序的要求时，你可以能过继承 </span><mshelp:link style="color: #000000;" tabindex="0" keywords="N:System.IdentityModel.Selectors"><span style="color: #008000;">System.IdentityModel.Selectors</span></mshelp:link><span style="color: #008000;">.</span><span style="color: #008000;" class="identifier">UserNamePasswordValidator</span><span style="color: #008000;"><span style="color: #000000;"> 抽象类，并重写其</span></span><span style="color: #000000;">Validate方法来实现自己的用户名密码验证程序，实际上，内置的用户名密码验证方式比自定义的用户名密码验证方式要可靠得多，因为自定义的用户名密码验证程序任何人都可以构造，但是标准的用户名密码验证方式刚是将用户提供的用户名密码映射到windows账户，所以，如果映射失败，意味着验证不通过，以下示例在服务器端启用自定义的用户名密码验证程序，客户端在调用服务前需要提供访问服务所需要的用户名密码，并在EndpointIdenty中向服务器标识自己是合法用户，具体标识参见本系列第二章：<strong><a title="WCF安全之EndPointIdentity" href="http://www.cnblogs.com/viter/archive/2009/07/01/endpointidentity.html">WCF安全之EndPointIdentity</a></strong>。如果服务器验证通过，将向客户端返回一个从数据库查询到的xml列(xElement对象），并将内容打印到控制台。</span><span style="color: #008000;"></span><span style="color: #000000;" class="identifier"></span><a href="http://www.cnblogs.com/viter/admin/128aab66-c60c-d329-bb20-7158ac18040b.htm"><span class="identifier"></span></a></p><p>　　<strong style="font-size: 14pt;">开始吧</strong><span style="font-size: 14pt;"> </span><br style="font-size: 14pt;" /></p><p><span style="color: #ff0000;">&nbsp;</span><strong style="color: #ff0000;">1、实现自定义用户名密码方式有哪些要求？</strong></p><p>如上面的所讲，首先，我们需要建立一个类，来继承自<mshelp:link style="color: #000000;" tabindex="0" keywords="N:System.IdentityModel.Selectors"><span style="color: #008000;">System.IdentityModel.Selectors</span></mshelp:link><span style="color: #008000;">.</span><span style="color: #008000;" class="identifier">UserNamePasswordValidator</span><span style="color: #008000;"><span style="color: #000000;"></span></span>抽象类，并重其validate方法，代码比较简单，当然，这只是用于演示作用，如果是在实际的项目中，你完全可以将用户名密码存储在持久化介质上，请看实现：<br /></p><div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CustomUserPassword&nbsp;:&nbsp;UserNamePasswordValidator<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">override</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Validate(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;userName,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;password)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(userName&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">admin</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;password&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">admin</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SecurityNegotiationException(</span><span style="color: #800000;">"</span><span style="color: #800000;">验证用户名和密码时，未通过检测<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}</span></div><p>&nbsp;</p><p><strong style="color: #ff0000;">&nbsp;2、配置安全策略和模式</strong></p><p>你可以在代码或者在配置文件中完成此安全策略实现过程，但是如果你是以代码方式实现，做之前请参考Artech的文章：<a title="[原创]WCF技术剖析之八：ClientBase&lt;T&gt;中对ChannelFactory&lt;T&gt;的缓存机制" href="http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html">[原创]WCF技术剖析之八：ClientBase<t>中对ChannelFactory<t>的缓存机制</t></t></a></p><p>&nbsp;（请原谅我引用），配置文件实现如下：</p><br /><div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000;">//</span><span style="color: #008000;">绑定配置</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&lt;</span><span style="color: #000000;">binding&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">EndpointBinding</span><span style="color: #800000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">security&nbsp;mode</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Message</span><span style="color: #800000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">transport&nbsp;clientCredentialType</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Windows</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;protectionLevel</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">EncryptAndSign</span><span style="color: #800000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">message&nbsp;clientCredentialType</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">UserName</span><span style="color: #800000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">security</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">binding</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">服务配置</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&lt;</span><span style="color: #000000;">serviceCredentials</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">serviceCertificate&nbsp;findValue</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">192168168151service</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x509FindType</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">FindBySubjectName</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storeLocation</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">LocalMachine</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storeName</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">My</span><span style="color: #800000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">userNameAuthentication&nbsp;&nbsp;customUserNamePasswordValidatorType</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">UserDataServcie.CustomUserPassword,UserDataServcie</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;userNamePasswordValidationMode</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Custom</span><span style="color: #800000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br /></span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">serviceCredentials</span><span style="color: #000000;">&gt;</span></div><p>&nbsp;</p><p>在上面的过程中，我们的绑定配置中的安全策略必须是消息级别的安全，因为在传输级别中，是不提供用户名密码验证方式的。两种级别的的选择比较主要体现在安全和效率上,如果你的传输效率上没有什么问题，建议你选择第四种安全策略<span class="selflink">:TransportWithMessageCredential</span>，<span class="selflink">TransportWithMessageCredential</span>的好处是既提供安全传输，又保证消息加密，多好！相对来说还是比较简单的吧<br /></p><p><strong style="color: #ff0000;">3、证书的配置</strong></p><p>启用消息安全策略必须配置x509证书，如果你不配置，服务启动将会收到一个异常：未提供安全证书。从上一章后，你也会觉得证书的配置都是比较简单的吧。所以这里也不用过多的费话了。<br /></p><p><strong style="color: #ff0000;">4、客户端调用服务 </strong><br style="color: #ff0000;" /></p><p>客户端在调用服务前设置一个用户名密码(此用户名密码你可动态配置，具体怎么动态你随意，可以是从持久介质上提取，也可以是用户输入），如下：</p><p>&nbsp;</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;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserDataClient&nbsp;client&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UserDataClient();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.ClientCredentials.UserName.UserName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">admin</span><span style="color: #800000;">"</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.ClientCredentials.UserName.Password&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">admin</span><span style="color: #800000;">"</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserExtension&nbsp;usereE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;client.GetUserExtension();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XElement&nbsp;xe&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;client.GetUserExtensionXElement(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">调用成功，开始打印消息<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />.</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ForegroundColor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ConsoleColor.Red;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">==================================</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(xe.Value);</span></div><p>&nbsp;</p><p><strong style="color: #ff0000;">5、<span>调用成功，控制台输出调用信息</span></strong><span style="color: #ff0000;"> </span><br style="color: #ff0000;" /></p><p><img alt="" src="http://images.cnblogs.com/cnblogs_com/viter/usernamepasswordConsole.jpg" height="208" width="455" />&nbsp;</p><p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p><p><strong>后话：</strong>总体来说，自定义的用户名密码验证程序还是比较简单的，只是在效率上会有点问题。</p><p>&nbsp;欢迎转载，但请注明出处－－梁规晓博客（<a href="http://www.cnblogs.com/viter/">http://www.cnblogs.com/viter/</a>）！<br /> </p>说得不对的地方，欢迎拍砖！<p>&nbsp;</p><p>&nbsp;</p><img src ="http://www.cnblogs.com/viter/aggbug/1516893.html?type=1" width = "1" height = "1" /><br/><br/>-----------------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/viter/archive/2009/07/04/wcf_usernamepassword.html" target="_blank">http://www.cnblogs.com/viter/archive/2009/07/04/wcf_usernamepassword.html</a><br/>作者博客: <a href="http://www.cnblogs.com/viter/" target="_blank">http://www.cnblogs.com/viter/</a> <a href="http://www.cnblogs.com/viter/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>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>6</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/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</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>16</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/47961/" target="_blank">微软新推社交网站Windows Live Planet</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/47960/" target="_blank">火狐3.5版被指推出太匆忙：存在50多个漏洞</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>3</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/47959/" target="_blank">Google对手机搜索进行优化升级</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/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</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>14</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/47957/" target="_blank">乔布斯和埃利森</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>26</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/47956/" target="_blank">Xbox Live将投放Silverlight广告</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/47951/" target="_blank">Debian无视GNU创始人警告 接受Mono</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>3</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/47950/" target="_blank">iPhone 3GS首发日创AT&amp;T多项纪录</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/47949/" target="_blank">Silverlight开发大赛奖金高达10000美元</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>17</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/47947/" target="_blank">微软告攒机商第一案胜诉</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>27</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/47946/" target="_blank">Mono这只猴子招惹了谁？</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>1</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/47945/" target="_blank">Firefox 3.5本月晚些时候即首次升级</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/47944/" target="_blank">Google App Engine出现故障宕机6小时</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>11</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/47943/" target="_blank">消息称Facebook今年营收将达5.5亿美元</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/47937/" target="_blank">微软8月25日开始通过WSUS推送IE8</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/47935/" target="_blank">暴风称新旧版更换完毕 总计超4000万用户换装</a>]]></description></item></channel></rss>