<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[PaulLeder--程序部落 - .Net]]></title>
<link>http://bokee.shinylife.net/blog/</link>
<description><![CDATA[Be Your Personal Best]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[paulleder@msn.com(PaulLeder)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>PaulLeder--程序部落</title>
	<url>http://bokee.shinylife.net/blog/images/logos.gif</url>
	<link>http://bokee.shinylife.net/blog/</link>
	<description>PaulLeder--程序部落</description>
</image>

			<item>
			<link>http://bokee.shinylife.net/blog/article.asp?id=1049</link>
			<title><![CDATA[memcached相关：《memcached全面剖析》，实践（ASP.NET），chunk问题，Ja]]></title>
			<author>paulleder@msn.com(PaulLeder)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Mon,30 Aug 2010 16:18:41 +0800</pubDate>
			<guid>http://bokee.shinylife.net/blog/default.asp?id=1049</guid>
		<description><![CDATA[<p><span class="Apple-style-span" style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="line-height: 20px; font-family: Arial; color: rgb(51,51,51); font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px">
<p style="line-height: normal"><font color="#ff00ff" style="line-height: normal">【虎.无名】以前只在Ubuntu上测试过，安装使用memcached都很方便。我测试的java的API接口，只是简单定义多个host和port，然后直接轮询，似乎还没有提供对Consistent Hashing算法的支持。下面着篇《<strong style="line-height: normal">memcached全面剖析</strong>》译文，介绍得比较直白易懂，值得一看</font>。<br style="line-height: normal" />
<a href="http://tech.idv2.com/2008/08/17/memcached-pdf/" style="line-height: normal">http://tech.idv2.com/2008/08/17/memcached-pdf/</a><span class="Apple-converted-space">&nbsp;</span>memcached全面剖析&ndash;PDF总结篇 作者：长野雅广(Masahiro Nagano)，译：charlee<br style="line-height: normal" />
第1章：<a href="http://tech.idv2.com/2008/07/10/memcached-001/" style="line-height: normal">http://tech.idv2.com/2008/07/10/memcached-001/</a><span class="Apple-converted-space">&nbsp;</span>1.memcached完全剖析&ndash;1. memcached的基础<br style="line-height: normal" />
第2章：<a href="http://tech.idv2.com/2008/07/11/memcached-002/" style="line-height: normal">http://tech.idv2.com/2008/07/11/memcached-002/</a><span class="Apple-converted-space">&nbsp;</span>2.理解memcached的内存存储<br style="line-height: normal" />
第3章：<a href="http://tech.idv2.com/2008/07/16/memcached-003/" style="line-height: normal">http://tech.idv2.com/2008/07/16/memcached-003/</a><span class="Apple-converted-space">&nbsp;</span>3.memcached的删除机制和发展方向<br style="line-height: normal" />
第4章：<a href="http://tech.idv2.com/2008/07/24/memcached-004/" style="line-height: normal">http://tech.idv2.com/2008/07/24/memcached-004/</a><span class="Apple-converted-space">&nbsp;</span>4. memcached的分布式算法 （memcached的<font color="#ff0000" style="line-height: normal">分布式是由客户端函数库实现</font>，余数散列的缺点、<font color="#ff0000" style="line-height: normal">更高效率的Consistent Hashing算法</font>）<br style="line-height: normal" />
第5章：<a href="http://tech.idv2.com/2008/07/31/memcached-005/" style="line-height: normal">http://tech.idv2.com/2008/07/31/memcached-005/</a><span class="Apple-converted-space">&nbsp;</span>5. memcached的应用和兼容程序 （采用daemontools监视memcached进程并自动启动的方法，memcached的性能，兼容应用程序:持久化保存）<br style="line-height: normal" />
<font color="#ff0000" style="line-height: normal">《memcached全面剖析》(pdf下载）：</font><a href="http://tech.idv2.com/wp-content/uploads/2008/08/memcached.zip" style="line-height: normal">http://tech.idv2.com/wp-content/uploads/2008/08/memcached.zip</a><br style="line-height: normal" />
原文链接：<a href="http://gihyo.jp/dev/feature/01/memcached/0001" style="line-height: normal">http://gihyo.jp/dev/feature/01/memcached/0001</a><span class="Apple-converted-space">&nbsp;</span>作者：长野雅广(Masahiro Nagano) 2008/7/2<span class="Apple-converted-space">&nbsp;</span><br style="line-height: normal" />
<strong style="line-height: normal">memcached的特征</strong><span class="Apple-converted-space">&nbsp;</span>：协议简单（文本协议，详见<a href="http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt" style="line-height: normal">http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt</a>），基于libevent的事件处理 ，内置内存存储方式 ，<font color="#ff0000" style="line-height: normal">memcached不互相通信的分布式</font><br style="line-height: normal" />
<a href="http://www.cnblogs.com/zjneter/archive/2007/07/19/822780.html" style="line-height: normal">http://www.cnblogs.com/zjneter/archive/2007/07/19/822780.html</a><span class="Apple-converted-space">&nbsp;</span><strong style="line-height: normal">分布式缓存系统Memcached简介与实践 （ASP.NET）<br style="line-height: normal" />
</strong>一 Memcached服务器端的安装 （此处将其作为系统服务安装）<br style="line-height: normal" />
下载文件：(Dec 23, 2006)<span class="Apple-converted-space">&nbsp;</span><a href="http://jehiah.cz/projects/memcached-win32/files/memcached-1.2.1-win32.zip" style="line-height: normal">http://jehiah.cz/projects/memcached-win32/files/memcached-1.2.1-win32.zip</a><br style="line-height: normal" />
1 解压缩文件到c:\memcached<br style="line-height: normal" />
2 命令行输入 'c:\memcached\memcached.exe -d install'<br style="line-height: normal" />
3 命令行输入 'c:\memcached\memcached.exe -d start' ，该命令启动 Memcached ，默认监听端口为 11211<br style="line-height: normal" />
通过 memcached.exe -h 可以查看其帮助<br style="line-height: normal" />
二&nbsp;&nbsp; .NET memcached client library<br style="line-height: normal" />
下载文件：<a href="https://sourceforge.net/projects/memcacheddotnet/" style="line-height: normal">https://sourceforge.net/projects/memcacheddotnet/</a><br style="line-height: normal" />
里面有.net1.1 和 .net2.0的两种版本 还有一个不错的例子。<br style="line-height: normal" />
<a href="http://blog.chinaunix.net/u/26905/showart_255927.html" style="line-height: normal">http://blog.chinaunix.net/u/26905/showart_255927.html</a><span class="Apple-converted-space">&nbsp;</span><strong style="line-height: normal">关于memcached的浅见 （slab/chunk问题）<br style="line-height: normal" />
</strong>为了减少管理内存碎片的麻烦,<font color="#ff0000" style="line-height: normal">当你需要通过memcached往缓存里面保存一个数据时, memcached给这个数据提供一个固定大小的内存块(chunk),</font>比如数据的长度是100bytes,那么memcached提供一个大小为128b的chunk来存储该数据,<font color="#ff0000" style="line-height: normal">chunk块的大小可以为64B,128B,256B...1024KB.使用何种大小的chunk块是由memcache根据数据的长度来决定的。<span class="Apple-converted-space">&nbsp;</span></font><font color="#ff0000" style="line-height: normal">当你第一次往memcached存储数据时, memcached会去申请1MB的内存, 把该块内存称为一个slab, 也称为一个page</font>, 如果可以存储这个数据的最佳的chunk大小为128B,那么memcached会把刚申请的slab以128B为单位进行分割成8192块. 当这页slab的所有chunk都被用完时,并且继续有数据需要存储在128B的chunk里面时,如果已经申请的内存小于最大可申请内存10MB时,memcached继续去申请1M内存,继续以128B为单位进行分割再进行存储;如果已经无法继续申请内存,那么mamcached会先根据LRU算法把队列里面最久没有被使用到的chunk进行释放后,再将该chunk用于存储.<br style="line-height: normal" />
<strong style="line-height: normal">为了避免使用memcached时出现异常, 使用memcached的项目需要注意:<br style="line-height: normal" />
</strong><font color="#ff0000" style="line-height: normal">1. 不能往memcached存储一个大于1MB的数据.<br style="line-height: normal" />
2. 往memcached存储的所有数据,如果数据的大小分布于各种chunk大小区间,从64B到1MB都有,可能会造成内存的极大浪费以及memcached的异常.<br style="line-height: normal" />
</font>举个例子: memcached最大可申请内存为2M, 你第一次存储一个10B的数据,那么memcached会申请1MB的内存,以64B进行分割然后存储该数据, 第二次存储一个90B的数据,那么memcached会继续申请1M的内存,以128B进行分割然后存储该数据, 第三次如果你想存储一个150B的数据, 如果可以继续申请内存, memcached会申请1M内存以256B的大小进行分割,<span class="Apple-converted-space">&nbsp;</span><u style="line-height: normal">但是由于最大可申请仅仅为2MB,所以会导致该数据无法存储</u>.<br style="line-height: normal" />
<a href="http://www.example.net.cn/archives/2006/01/eoamemcachedoea.html" style="line-height: normal">http://www.example.net.cn/archives/2006/01/eoamemcachedoea.html</a><span class="Apple-converted-space">&nbsp;</span><strong style="line-height: normal">使用memcached进行内存缓存</strong><span class="Apple-converted-space">&nbsp;</span>（旧文重发 2005.8.9）</p>
<p><a href="http://www.javaeye.com/topic/154767" style="line-height: normal">http://www.javaeye.com/topic/154767</a><span class="Apple-converted-space">&nbsp;</span>关于memcached client的选择<br style="line-height: normal" />
更多相关推荐 Memcached（<a href="http://www.danga.com/memcached/" style="line-height: normal">http://www.danga.com/memcached/</a>）是被广泛使用的分布式缓存技术，javaeye也使用memcached做对象缓存。不同的语言有不同的memcached客户端程序，对于java客户端来说，memcached网站给了两个选择：<br style="line-height: normal" />
1. A Java API is maintained by Greg Whalin from Meetup.com. You can find that library here: *<span class="Apple-converted-space">&nbsp;</span><a href="http://www.whalin.com/memcached/" style="line-height: normal">http://www.whalin.com/memcached/</a><span class="Apple-converted-space">&nbsp;</span>-- Java API for memcached<br style="line-height: normal" />
2. An improved Java API maintained by Dustin Sallings is also available. Aggressively optimised, ability to run async, supports binary protocol, etc. See site for details: *<span class="Apple-converted-space">&nbsp;</span><a href="http://bleu.west.spy.net/~dustin/projects/memcached/" style="line-height: normal">http://bleu.west.spy.net/~dustin/projects/memcached/</a><span class="Apple-converted-space">&nbsp;</span>-- Improved Java API for memcached<br style="line-height: normal" />
<font color="#ff0000" style="line-height: normal">从字面上我们很容易看出第二个（net.spy.memcached）应该性能更好</font>，但是网上包括javaeye上面关于java client的讨论和使用都是基于第一个（com.danga.memcached ）的。为什么性能好的反而讨论的比较少呢？我猜测的原因在于，第一个Client出来的比较早，网上资料也比较多。有些人就没有到memched网站看client api直接使用google之类的搜索引擎搜索到第一个client就是用。<br style="line-height: normal" />
目前没有这两个client的对比数据，有没有做了，拿出来共享一下?<br style="line-height: normal" />
评论：<br style="line-height: normal" />
lizhilin 第二种可以使用异步的方式 速度上 简单的试了一下 好像确实要快一点<br style="line-height: normal" />
freeway2000 ：<span class="Apple-converted-space">&nbsp;</span><a href="http://www.whalin.com/memcached/" style="line-height: normal">http://www.whalin.com/memcached/</a>现在好像出了<font color="#ff0000" style="line-height: normal">新版本了，性能不比第二个差。我在使用net.spy.memcached有时候会出现异常。</font>感觉不太稳定。【<font color="#ff00ff" style="line-height: normal">虎.无名，后者采用了nio技术，但我感觉nio对于客户端而言，带来的性能提高并不明显，代码复杂度和稳定性反而提高了很多</font>。】<br style="line-height: normal" />
imcaptor ：两种我都用了，效率差不多，0-3毫秒<br style="line-height: normal" />
<a href="http://www.javaeye.com/topic/208981" style="line-height: normal">http://www.javaeye.com/topic/208981</a><span class="Apple-converted-space">&nbsp;</span>分布式缓存系统Memcached学习心得<br style="line-height: normal" />
&nbsp;</p>
<ul>
    <li style="line-height: normal"><a href="http://www.javaeye.com/topics/download/10e34d9b-cf5e-300a-8257-ada5bc667aba" style="line-height: normal"><font color="#006699" style="line-height: normal">memcached-1.2.1-win32-0001.rar</font></a><span class="Apple-converted-space">&nbsp;</span>(87.8 KB) 描述: memcached-1.2.1-win32 下载次数: 264<br style="line-height: normal" />
    <a href="http://www.javaeye.com/topics/download/e27dae7a-5160-3297-a780-046c98651ce1" style="line-height: normal"><font color="#006699" style="line-height: normal">java_memcached-release_2.0.1.jar</font></a><span class="Apple-converted-space">&nbsp;</span>(56.4 KB) 描述: memcached client jar 下载次数: 220<br style="line-height: normal" />
    回复：<br style="line-height: normal" />
    <strong style="line-height: normal">nowonder</strong>：之前调研memcached最大的问题是它是一个单点，是一种集中式的分布式，组成它的n台机器里只要有一个down了，整个就挂了...<br style="line-height: normal" />
    <strong style="line-height: normal">robbin</strong><span class="Apple-converted-space">&nbsp;</span>：<font color="#ff0000" style="line-height: normal">1、并不会整个挂掉，只会访问某些cache内容无法命中 2、就算全部挂掉，Cache就是减少对数据库访问的，所以无非就是对数据库压力大一些而已，能有什么影响？</font><span class="Apple-converted-space">&nbsp;</span>3、如果你希望Cache持久化，或者带有故障切换功能，可以用memcachedb。【<font color="#ff00ff" style="line-height: normal">虎.无名：常见操作，先从缓存取，没有则从数据库取，同时更新缓存。因而不会出现nowonder所说的问题。再说，可以部署多个memcached，就更不是单点了</font>。】<br style="line-height: normal" />
    <strong style="line-height: normal">edwardpro</strong><span class="Apple-converted-space">&nbsp;</span>: memcached 要求set的对象必须是可序列化对象,jboss cache等java obect cache是没有这个说法的,这是本质的不同的,但是他可以在网络上用,所以必须序列化也可理解,lz的例子比较简单还没有说明这点.<br style="line-height: normal" />
    <a href="http://www.javaeye.com/topic/225692" style="line-height: normal">http://www.javaeye.com/topic/225692</a><span class="Apple-converted-space">&nbsp;</span>潜入memcached server<br style="line-height: normal" />
    <strong style="line-height: normal">outrace</strong><span class="Apple-converted-space">&nbsp;</span>：<font color="#ff0000" style="line-height: normal">对于不能容忍丢失的情况，比如session用memcache来保存，那么建议可以使用一下解决方</font>案<br style="line-height: normal" />
    <strong style="line-height: normal">memcachedb</strong>：<a href="http://www.memcachedb.com/" style="line-height: normal">http://www.memcachedb.com</a><span class="Apple-converted-space">&nbsp;</span>使用memcache协议，bdb持久化到硬盘中<br style="line-height: normal" />
    <strong style="line-height: normal">Tokyo Tyrant</strong><span class="Apple-converted-space">&nbsp;</span>参看：<a href="http://blog.s135.com/read.php/362.htm" style="line-height: normal">http://blog.s135.com/read.php/362.htm</a><br style="line-height: normal" />
    对于可以容忍丢失的情况，那么即使memcached丢失了一些数据，应当问题也不大了</li>
</ul>
</span></span></p>]]></description>
		</item>
		
			<item>
			<link>http://bokee.shinylife.net/blog/article.asp?id=1048</link>
			<title><![CDATA[memcached缓存参考文章索引]]></title>
			<author>paulleder@msn.com(PaulLeder)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Wed,25 Aug 2010 13:37:50 +0800</pubDate>
			<guid>http://bokee.shinylife.net/blog/default.asp?id=1048</guid>
		<description><![CDATA[下载<br/><a href="http://allegiance.chi-town.com/MemCacheDManager.aspx" target="_blank" rel="external">http://allegiance.chi-town.com/MemCacheDManager.aspx</a><br/><br/>深度分析<br/><a href="http://www.yaosansi.com/post/1395.html" target="_blank" rel="external">http://www.yaosansi.com/post/1395.html</a><br/><br/>Windows下的.NET+ Memcached安装<br/><a href="http://www.cnblogs.com/luluping/archive/2009/01/14/1375453.html" target="_blank" rel="external">http://www.cnblogs.com/luluping/archive/2009/01/14/1375453.html</a><br/><br/>分布式缓存Memcached 在.NET中使用相关资料<br/><a href="http://www.xueit.com/html/2009-08/21_4277_00.html" target="_blank" rel="external">http://www.xueit.com/html/2009-08/21_4277_00.html</a><br/><br/>memcached+net缓存 <br/><a href="http://www.cnblogs.com/wyxy2005/archive/2010/08/23/1806785.html" target="_blank" rel="external">http://www.cnblogs.com/wyxy2005/archive/2010/08/23/1806785.html</a>]]></description>
		</item>
		
			<item>
			<link>http://bokee.shinylife.net/blog/article.asp?id=1047</link>
			<title><![CDATA[从MySpace基于.NET平台的六次重构经历，来感受分布式系统。]]></title>
			<author>paulleder@msn.com(PaulLeder)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Wed,04 Aug 2010 17:26:45 +0800</pubDate>
			<guid>http://bokee.shinylife.net/blog/default.asp?id=1047</guid>
		<description><![CDATA[Myspace和Facebook都是很优秀的社交类网站，它们拥有的用户和fans之多，大家都很清楚。<br/>Myspace是一个基于.NET平台的，而Facebook更多是基于LAMP的。<br/>我们来看看MySpace配合.NET+Windows Server 2003+Sql Server 2000/2005+IIS怎么创造传奇的<br/><br/>文章正文如下：<br/><br/>在每个里程碑，站点负担都会超过底层系统部分组件的最大载荷，特别是数据库和存储系统。接着，功能出现问题，用户失声尖叫。最后，技术团队必须为此修订系统策略。<br/>虽然自2005年早期，站点账户数超过7百万后，系统架构到目前为止保持了相对稳定，但MySpace仍然在为SQL Server支持的同时连接数等方面继续攻坚，Benedetto说，&#34;我们已经尽可能把事情做到最好&#34;。 <br/><br/>里程碑一：50万账户 <br/>按Benedetto 的说法，MySpace最初的系统很小，只有两台Web服务器和一个数据库服务器。那时使用的是Dell双CPU、4G内存的系统。<br/><br/>单个数据库就意味着所有数据都存储在一个地方，再由两台Web服务器分担处理用户请求的工作量。但就像MySpace后来的几次底层系统修订时的情况一样，三服务器架构很快不堪重负。此后一个时期内，MySpace基本是通过添置更多Web服务器来对付用户暴增问题的。 <br/><br/>但到在2004年早期，MySpace用户数增长到50万后，数据库服务器也已开始汗流浃背。<br/><br/>但和Web服务器不同，增加数据库可没那么简单。如果一个站点由多个数据库支持，设计者必须考虑的是，如何在保证数据一致性的前提下，让多个数据库分担压力。<br/><br/>在第二代架构中，MySpace运行在3个SQL Server数据库服务器上——一个为主，所有的新数据都向它提交，然后由它复制到其他两个；另两个全力向用户供给数据，用以在博客和个人资料栏显示。这种方式在一段时间内效果很好——只要增加数据库服务器，加大硬盘，就可以应对用户数和访问量的增加。 <br/><br/>里程碑二：1-2百万账户 <br/><br/>MySpace注册数到达1百万至2百万区间后，数据库服务器开始受制于I/O容量——即它们存取数据的速度。而当时才是2004年中，距离上次数据库系统调整不过数月。用户的提交请求被阻塞，就像千人乐迷要挤进只能容纳几百人的夜总会，站点开始遭遇&#34;主要矛盾&#34;，Benedetto说，这意味着MySpace永远都会轻度落后于用户需求。<br/><br/>&#34;有人花5分钟都无法完成留言，因此用户总是抱怨说网站已经完蛋了。&#34;他补充道。<br/><br/>这一次的数据库架构按照垂直分割模式设计，不同的数据库服务于站点的不同功能，如登录、用户资料和博客。于是，站点的扩展性问题看似又可以告一段落了，可以歇一阵子。<br/><br/>垂直分割策略利于多个数据库分担访问压力，当用户要求增加新功能时，MySpace将投入新的数据库予以支持它。账户到达2百万后，MySpace还从存储设备与数据库服务器直接交互的方式切换到SAN（Storage Area Network，存储区域网络）——用高带宽、专门设计的网络将大量磁盘存储设备连接在一起，而数据库连接到SAN。这项措施极大提升了系统性能、正常运行时间和可靠性，Benedetto说。 <br/><br/>里程碑三：3百万账户<br/><br/>当用户继续增加到3百万后，垂直分割策略也开始难以为继。尽管站点的各个应用被设计得高度独立，但有些信息必须共享。在这个架构里，每个数据库必须有各自的用户表副本——MySpace授权用户的电子花名册。这就意味着一个用户注册时，该条账户记录必须在9个不同数据库上分别创建。但在个别情况下，如果其中某台数据库服务器临时不可到达，对应事务就会失败，从而造成账户非完全创建，最终导致此用户的该项服务无效。<br/><br/>另外一个问题是，个别应用如博客增长太快，那么专门为它服务的数据库就有巨大压力。 <br/><br/>2004年中，MySpace面临Web开发者称之为&#34;向上扩展&#34;对&#34;向外扩展&#34;（译者注：Scale Up和Scale Out，也称硬件扩展和软件扩展）的抉择——要么扩展到更大更强、也更昂贵的服务器上，要么部署大量相对便宜的服务器来分担数据库压力。一般来说，大型站点倾向于向外扩展，因为这将让它们得以保留通过增加服务器以提升系统能力的后路。<br/><br/>但成功地向外扩展架构必须解决复杂的分布式计算问题，大型站点如Google、Yahoo和Amazon.com，都必须自行研发大量相关技术。以Google为例，它构建了自己的分布式文件系统。<br/><br/>另外，向外扩展策略还需要大量重写原来软件，以保证系统能在分布式服务器上运行。&#34;搞不好，开发人员的所有工作都将白费&#34;，Benedetto说。<br/><br/>因此，MySpace首先将重点放在了向上扩展上，花费了大约1个半月时间研究升级到32CPU服务器以管理更大数据库的问题。Benedetto说，&#34;那时候，这个方案看似可能解决一切问题。&#34;如稳定性，更棒的是对现有软件几乎没有改动要求。 <br/><br/>糟糕的是，高端服务器极其昂贵，是购置同样处理能力和内存速度的多台服务器总和的很多倍。而且，站点架构师预测，从长期来看，即便是巨型数据库，最后也会不堪重负，Benedetto说，&#34;换句话讲，只要增长趋势存在，我们最后无论如何都要走上向外扩展的道路。&#34;<br/><br/>因此，MySpace最终将目光移到分布式计算架构——它在物理上分布的众多服务器，整体必须逻辑上等同于单台机器。拿数据库来说，就不能再像过去那样将应用拆分，再以不同数据库分别支持，而必须将整个站点看作一个应用。现在，数据库模型里只有一个用户表，支持博客、个人资料和其他核心功能的数据都存储在相同数据库。 <br/><br/>既然所有的核心数据逻辑上都组织到一个数据库，那么MySpace必须找到新的办法以分担负荷——显然，运行在普通硬件上的单个数据库服务器是无能为力的。这次，不再按站点功能和应用分割数据库，MySpace开始将它的用户按每百万一组分割，然后将各组的全部数据分别存入独立的SQL Server实例。目前，MySpace的每台数据库服务器实际运行两个SQL Server实例，也就是说每台服务器服务大约2百万用户。Benedetto指出，以后还可以按照这种模式以更小粒度划分架构，从而优化负荷分担。 <br/><br/>当然，还是有一个特殊数据库保存了所有账户的名称和密码。用户登录后，保存了他们其他数据的数据库再接管服务。特殊数据库的用户表虽然庞大，但它只负责用户登录，功能单一，所以负荷还是比较容易控制的。<br/><br/>里程碑四：9百万到1千7百万账户<br/><br/>2005年早期，账户达到9百万后，MySpace开始用Microsoft的C#编写ASP.NET程序。C#是C语言的最新派生语言，吸收了C++和Java的优点，依托于Microsoft .NET框架（Microsoft为软件组件化和分布式计算而设计的模型架构）。ASP.NET则由编写Web站点脚本的ASP技术演化而来，是Microsoft目前主推的Web站点编程环境。<br/><br/>可以说是立竿见影， MySpace马上就发现ASP.NET程序运行更有效率，与ColdFusion相比，完成同样任务需消耗的处理器能力更小。据技术总监Whitcomb说，新代码需要150台服务器完成的工作，如果用ColdFusion则需要246台。Benedetto还指出，性能上升的另一个原因可能是在变换软件平台，并用新语言重写代码的过程中，程序员复审并优化了一些功能流程。<br/><br/>最终，MySpace开始大规模迁移到ASP.NET。即便剩余的少部分ColdFusion代码，也从Cold-Fusion服务器搬到了ASP.NET，因为他们得到了BlueDragon.NET（乔治亚州阿尔法利塔New Atlanta Communications公司的产品，它能将ColdFusion代码自动重新编译到Microsoft平台）的帮助。<br/><br/>账户达到1千万时，MySpace再次遭遇存储瓶颈问题。SAN的引入解决了早期一些性能问题，但站点目前的要求已经开始周期性超越SAN的I/O容量——即它从磁盘存储系统读写数据的极限速度。 <br/><br/>原因之一是每数据库1百万账户的分割策略，通常情况下的确可以将压力均分到各台服务器，但现实并非一成不变。比如第七台账户数据库上线后，仅仅7天就被塞满了，主要原因是佛罗里达一个乐队的歌迷疯狂注册。<br/><br/>某个数据库可能因为任何原因，在任何时候遭遇主要负荷，这时，SAN中绑定到该数据库的磁盘存储设备簇就可能过载。&#34;SAN让磁盘I/O能力大幅提升了，但将它们绑定到特定数据库的做法是错误的。&#34;Benedetto说。<br/><br/>最初，MySpace通过定期重新分配SAN中数据，以让其更为均衡的方法基本解决了这个问题，但这是一个人工过程，&#34;大概需要两个人全职工作。&#34;Benedetto说。 <br/><br/>长期解决方案是迁移到虚拟存储体系上，这样，整个SAN被当作一个巨型存储池，不再要求每个磁盘为特定应用服务。MySpace目前采用了一种新型SAN设备——来自加利福尼亚州弗里蒙特的3PARdata。<br/><br/>在3PAR的系统里，仍能在逻辑上按容量划分数据存储，但它不再被绑定到特定磁盘或磁盘簇，而是散布于大量磁盘。这就使均分数据访问负荷成为可能。当数据库需要写入一组数据时，任何空闲磁盘都可以马上完成这项工作，而不再像以前那样阻塞在可能已经过载的磁盘阵列处。而且，因为多个磁盘都有数据副本，读取数据时，也不会使SAN的任何组件过载。 <br/><br/>当2005年春天账户数达到1千7百万时，MySpace又启用了新的策略以减轻存储系统压力，即增加数据缓存层——位于Web服务器和数据库服务器之间，其唯一职能是在内存中建立被频繁请求数据对象的副本，如此一来，不访问数据库也可以向Web应用供给数据。换句话说，100个用户请求同一份资料，以前需要查询数据库100次，而现在只需1次，其余都可从缓存数据中获得。当然如果页面变化，缓存的数据必须从内存擦除，然后重新从数据库获取——但在此之前，数据库的压力已经大大减轻，整个站点的性能得到提升。 <br/><br/>缓存区还为那些不需要记入数据库的数据提供了驿站，比如为跟踪用户会话而创建的临时文件——Benedetto坦言他需要在这方面补课，&#34;我是数据库存储狂热分子，因此我总是想着将万事万物都存到数据库。&#34;但将像会话跟踪这类的数据也存到数据库，站点将陷入泥沼。<br/><br/>增加缓存服务器是&#34;一开始就应该做的事情，但我们成长太快，以致于没有时间坐下来好好研究这件事情。&#34;Benedetto补充道。<br/><br/>里程碑五：2千6百万账户<br/><br/>2005年中期，服务账户数达到2千6百万时，MySpace切换到了还处于beta测试的SQL Server 2005。转换何太急？主流看法是2005版支持64位处理器。但Benedetto说，&#34;这不是主要原因，尽管这也很重要；主要还是因为我们对内存的渴求。&#34;支持64位的数据库可以管理更多内存。<br/><br/>更多内存就意味着更高的性能和更大的容量。原来运行32位版本的SQL Server服务器，能同时使用的内存最多只有4G。切换到64位，就好像加粗了输水管的直径。升级到SQL Server 2005和64位Windows Server 2003后，MySpace每台服务器配备了32G内存，后于2006年再次将配置标准提升到64G。 <br/><br/>意外错误<br/><br/>如果没有对系统架构的历次修改与升级，MySpace根本不可能走到今天。但是，为什么系统还经常吃撑着了？很多用户抱怨的&#34;意外错误&#34;是怎么引起的呢？<br/><br/>原因之一是MySpace对Microsoft的Web技术的应用已经进入连Microsoft自己也才刚刚开始探索的领域。比如11月，超出SQL Server最大同时连接数，MySpace系统崩溃。Benedetto说，这类可能引发系统崩溃的情况大概三天才会出现一次，但仍然过于频繁了，以致惹人恼怒。一旦数据库罢工，&#34;无论这种情况什么时候发生，未缓存的数据都不能从SQL Server获得，那么你就必然看到一个&#39;意外错误&#39;提示。&#34;他解释说。 <br/><br/>去年夏天，MySpace的Windows 2003多次自动停止服务。后来发现是操作系统一个内置功能惹的祸——预防分布式拒绝服务攻击（黑客使用很多客户机向服务器发起大量连接请求，以致服务器瘫痪）。MySpace和其他很多顶级大站点一样，肯定会经常遭受攻击，但它应该从网络级而不是依靠Windows本身的功能来解决问题——否则，大量MySpace合法用户连接时也会引起服务器反击。<br/><br/>&#34;我们花了大约一个月时间寻找Windows 2003服务器自动停止的原因。&#34;Benedetto说。最后，通过Microsoft的帮助，他们才知道该怎么通知服务器：&#34;别开枪，是友军。&#34; <br/><br/>紧接着是在去年7月某个周日晚上，MySpace总部所在地洛杉矶停电，造成整个系统停运12小时。大型Web站点通常要在地理上分布配置多个数据中心以预防单点故障。本来，MySpace还有其他两个数据中心以应对突发事件，但Web服务器都依赖于部署在洛杉矶的SAN。没有洛杉矶的SAN，Web服务器除了恳求你耐心等待，不能提供任何服务。<br/><br/>Benedetto说，主数据中心的可靠性通过下列措施保证：可接入两张不同电网，另有后备电源和一台储备有30天燃料的发电机。但在这次事故中，不仅两张电网失效，而且在切换到备份电源的过程中，操作员烧掉了主动力线路。 <br/><br/>2007年中，MySpace在另两个后备站点上也建设了SAN。这对分担负荷大有帮助——正常情况下，每个SAN都能负担三分之一的数据访问量。而在紧急情况下，任何一个站点都可以独立支撑整个服务，Benedetto说。<br/><br/>MySpace仍然在为提高稳定性奋斗，虽然很多用户表示了足够信任且能原谅偶现的错误页面。<br/><br/>&#34;作为开发人员，我憎恶Bug，它太气人了。&#34;Dan Tanner这个31岁的德克萨斯软件工程师说，他通过MySpace重新联系到了高中和大学同学。&#34;不过，MySpace对我们的用处很大，因此我们可以原谅偶发的故障和错误。&#34; Tanner说，如果站点某天出现故障甚至崩溃，恢复以后他还是会继续使用。 <br/><br/>这就是为什么Drew在论坛里咆哮时，大部分用户都告诉他应该保持平静，如果等几分钟，问题就会解决的原因。Drew无法平静，他写道，&#34;我已经两次给MySpace发邮件，而它说一小时前还是正常的，现在出了点问题……完全是一堆废话。&#34;另一个用户回复说，&#34;毕竟它是免费的。&#34;Benedetto坦承100%的可靠性不是他的目标。&#34;它不是银行，而是一个免费的服务。&#34;他说。<br/><br/>换句话说，MySpace的偶发故障可能造成某人最后更新的个人资料丢失，但并不意味着网站弄丢了用户的钱财。&#34;关键是要认识到，与保证站点性能相比，丢失少许数据的故障是可接受的。&#34;Benedetto说。所以，MySpace甘冒丢失2分钟到2小时内任意点数据的危险，在SQL Server配置里延长了&#34;checkpoint&#34;操作——它将待更新数据永久记录到磁盘——的间隔时间，因为这样做可以加快数据库的运行。 <br/><br/>Benedetto说，同样，开发人员还经常在几个小时内就完成构思、编码、测试和发布全过程。这有引入Bug的风险，但这样做可以更快实现新功能。而且，因为进行大规模真实测试不具可行性，他们的测试通常是在仅以部分活跃用户为对象，且用户对软件新功能和改进不知就里的情况下进行的。因为事实上不可能做真实的加载测试，他们做的测试通常都是针对站点。<br/><br/>&#34;我们犯过大量错误，&#34;Benedetto说，&#34;但到头来，我认为我们做对的还是比做错的多。&#34; <br/><br/>MySpace Tech Roster<br/>January 16, 2007<br/>By David F. Carr <br/>------------------------------------------------<br/><br/>个人的几个观点：<br/>1，.NET平台很牛，很强大。<br/>2，对于技术而言，局限性往往存在于程序员自身。<br/>3，网站的分布式更多是为了提高性能，否则不要开始分布式。<br/>４，网站的分布式更多体现在数据库方面，和目前.NET平台主流的分布式技术有点不同。<br/>５，.NET平台企业级开发的分布式解决方案有很多，选择适合企业自身特点的才是最理想的。<br/>]]></description>
		</item>
		
			<item>
			<link>http://bokee.shinylife.net/blog/article.asp?id=1046</link>
			<title><![CDATA[aspnet_merge.exe 已退出，代码为1的错误的解决方法]]></title>
			<author>paulleder@msn.com(PaulLeder)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Wed,04 Aug 2010 14:59:12 +0800</pubDate>
			<guid>http://bokee.shinylife.net/blog/default.asp?id=1046</guid>
		<description><![CDATA[将VS的工具－选项－项目和解决方案－生成并运行，设置“MSBuild 项目生成输出详细信息”，选择“详细”。再次生成Web Deployment Projects项目，“输出”框内的信息就变得非常丰富了；这样就可以查看哪里出错了；<br/><br/>然后在“输出”里查看具体错误原因。<br/>一般造成此问题是因为类名相同造成，合并的DLL类是不会加路径的，所以只要整个项目里面有相同类名都会造成此错误。<br/>找到问题出处后修改aspx页面上的类和继承的类的类名就可以解决问题。]]></description>
		</item>
		
			<item>
			<link>http://bokee.shinylife.net/blog/article.asp?id=1045</link>
			<title><![CDATA[不爽的VS2010总有解决办法]]></title>
			<author>paulleder@msn.com(PaulLeder)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Fri,23 Jul 2010 16:46:08 +0800</pubDate>
			<guid>http://bokee.shinylife.net/blog/default.asp?id=1045</guid>
		<description><![CDATA[开始用VS2010还是挺好的，最不爽的莫过于它的项目右键菜单，正如<a href="http://www.cnblogs.com/KevinYang/archive/2010/06/02/1749671.html" target="_blank" rel="external">http://www.cnblogs.com/KevinYang/archive/2010/06/02/1749671.html</a>文章提到的。<br/>后来我在网上找了一些插件（VS2010的插件是要比VS2008丰富多了）来解决了种种问题。我推荐的VS2010插件如下：<br/>AxTools.VS10X.CodeMap ---可以在代码编辑区域右侧出现代码大纲，也很容易控制代码折叠，还有历史记录功能等等。<br/>codecompareinstall&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---代码比较工具<br/>Microsoft.VisualStudio.RegularExpression ----正则表达式帮助工具，之要你new RegExp后就会自动弹出<br/>PowerCommands ---命令增强工具，会提供文件打开工具，项目清除多余命名空间等功能，很实用<br/>ProPowerTools ----算是一个VS2010很男用UI部分的一个补救，用了就知道<br/>Sel&#101;ctionHighlight ---选择单词后会显示当前页所有此命名的变量，没有延时出现<br/>ThemeManagerPackage ---风格选择和自定义颜色工具。<br/><br/>介绍就到此，上述插件均为MS开发。地址：<br/><a href="http://visualstudiogallery.msdn.microsoft.com/zh-cn/site/search?f" target="_blank" rel="external">http://visualstudiogallery.msdn.microsoft.com/zh-cn/site/search?f</a>[0].Type=Affiliation&amp;f[0].Value=Microsoft&amp;sortBy=Popularity]]></description>
		</item>
		
			<item>
			<link>http://bokee.shinylife.net/blog/article.asp?id=1044</link>
			<title><![CDATA[检测.NET PerformanceCounterCategory数据]]></title>
			<author>paulleder@msn.com(PaulLeder)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Sun,18 Jul 2010 11:10:47 +0800</pubDate>
			<guid>http://bokee.shinylife.net/blog/default.asp?id=1044</guid>
		<description><![CDATA[<div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://bokee.shinylife.net/blog/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent">public static void GetCategoryNameList()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb = new StringBuilder();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(&#34;&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PerformanceCounterCategory[] myCat2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myCat2 = PerformanceCounterCategory.GetCategories();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; myCat2.Length; i++)<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;string categoryName = myCat2[i].CategoryName.ToString();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(&#34;------------------ Category【&#34; + categoryName + &#34;】 &#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(GetInstanceNameListANDCounterNameList(categoryName));<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;//Logger.Write(Level.Info, sb.ToString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里输出sb.ToString()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private static string GetInstanceNameListANDCounterNameList(string CategoryName)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string[] instanceNames;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList counters = new ArrayList();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb = new StringBuilder();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PerformanceCounterCategory mycat = new PerformanceCounterCategory(CategoryName);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<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;instanceNames = mycat.GetInstanceNames();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (instanceNames.Length == 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counters.AddRange(mycat.GetCounters());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; instanceNames.Length; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counters.AddRange(mycat.GetCounters(instanceNames[i]));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(&#34;---------- InstanceNames&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; instanceNames.Length; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(instanceNames[i]);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(&#34;---------- CounterNames&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (PerformanceCounter counter in counters)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(counter.CounterName);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(&#34;&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.AppendLine(&#34;&#34;);<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;catch (Exception)<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;//Console.WriteLine(&#34;Unable to list the counters for this category&#34;);<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;return sb.ToString();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div></div>]]></description>
		</item>
		
			<item>
			<link>http://bokee.shinylife.net/blog/article.asp?id=1043</link>
			<title><![CDATA[VS2010引用第三方组建错误（具有依赖关系。请删除对不在目标框架中的程序集的引用，或考虑重新确定）]]></title>
			<author>paulleder@msn.com(PaulLeder)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Sun,18 Jul 2010 09:49:34 +0800</pubDate>
			<guid>http://bokee.shinylife.net/blog/default.asp?id=1043</guid>
		<description><![CDATA[log4net has a known issue of referencing a System.Web component which is not part of the <a target="_blank" href="http://msdn.microsoft.com/en-us/library/cc656912.aspx" rel="external">.NET Framework 4 Client Profile </a>and the VS2010 by default sets project target to be the lightweighted Client Profile. The solution is to change the target to .NET Framework 4:<br/><br/>Right click project -&gt; properties -&gt; Application. Change:<br/><br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://bokee.shinylife.net/blog/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent"> .NET Framework 4 Client Profile</div></div><br/><br/>to be:<br/><br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://bokee.shinylife.net/blog/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent"> .NET Framework 4</div></div><br/><br/>... and that should work, i.e. you can use log4net again...]]></description>
		</item>
		
			<item>
			<link>http://bokee.shinylife.net/blog/article.asp?id=1042</link>
			<title><![CDATA[通过Enum.Parse转换字符串成对应的枚举类型]]></title>
			<author>paulleder@msn.com(PaulLeder)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Sun,18 Jul 2010 08:17:14 +0800</pubDate>
			<guid>http://bokee.shinylife.net/blog/default.asp?id=1042</guid>
		<description><![CDATA[<div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://bokee.shinylife.net/blog/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent">using System;<br/><br/>public class ParseTest {<br/>&nbsp;&nbsp;&nbsp;&nbsp;[FlagsAttribute]<br/>&nbsp;&nbsp;&nbsp;&nbsp;enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 };<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void Main() {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&#34;The entries of the Colors Enum are:&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach(string s in Enum.GetNames(typeof(Colors)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(s);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Colors myOrange = (Colors)Enum.Parse(typeof(Colors), &#34;Red, Yellow&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&#34;The myOrange value has the combined entries of {0}&#34;, myOrange);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}</div></div><br/><br/>这里需要注意：<br/>如果写成下面结果会不一样：<br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://bokee.shinylife.net/blog/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent">using System;<br/><br/>public class ParseTest {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 };<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void Main() {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&#34;The entries of the Colors Enum are:&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach(string s in Enum.GetNames(typeof(Colors)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(s);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Colors myOrange = (Colors)Enum.Parse(typeof(Colors), &#34;Red, Yellow&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&#34;The myOrange value has the combined entries of {0}&#34;, myOrange);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}</div></div><br/>最后的结果会输出9，而前一个则会输出Red|Yellow<br/><br/>其他语言请见:<a href="http://msdn.microsoft.com/en-us/library/aa328348" target="_blank" rel="external">http://msdn.microsoft.com/en-us/library/aa328348</a>(VS.71).aspx]]></description>
		</item>
		
			<item>
			<link>http://bokee.shinylife.net/blog/article.asp?id=1041</link>
			<title><![CDATA[How To Get Hardware Information]]></title>
			<author>paulleder@msn.com(PaulLeder)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Sat,17 Jul 2010 12:57:30 +0800</pubDate>
			<guid>http://bokee.shinylife.net/blog/default.asp?id=1041</guid>
		<description><![CDATA[<a href="http://www.codeproject.com/KB/system/GetHardwareInformation.aspx" target="_blank" rel="external">http://www.codeproject.com/KB/system/GetHardwareInformation.aspx</a><br/><br/>System.Management;<br/><br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://bokee.shinylife.net/blog/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent">Win32_1394Controller<br/>Win32_1394ControllerDevice<br/>Win32_Account<br/>Win32_AccountSID<br/>Win32_ACE<br/>Win32_ActionCheck<br/>Win32_AllocatedResource<br/>Win32_ApplicationCommandLine<br/>Win32_ApplicationService<br/>Win32_AssociatedBattery<br/>Win32_AssociatedProcessorMemory<br/>Win32_BaseBoard<br/>Win32_BaseService<br/>Win32_Battery<br/>Win32_Binary<br/>Win32_BindImageAction<br/>Win32_BIOS<br/>Win32_BootConfiguration<br/>Win32_Bus<br/>Win32_CacheMemory<br/>Win32_CDROMDrive<br/>Win32_CheckCheck<br/>Win32_CIMLogicalDeviceCIMDataFile<br/>Win32_ClassicCOMApplicationClasses<br/>Win32_ClassicCOMClass<br/>Win32_ClassicCOMClassSetting<br/>Win32_ClassicCOMClassSettings<br/>Win32_ClassInfoAction<br/>Win32_ClientApplicationSetting<br/>Win32_CodecFile<br/>Win32_COMApplication<br/>Win32_COMApplicationClasses<br/>Win32_COMApplicationSettings<br/>Win32_COMClass<br/>Win32_ComClassAutoEmulator<br/>Win32_ComClassEmulator<br/>Win32_CommandLineAccess<br/>Win32_ComponentCategory<br/>Win32_ComputerSystem<br/>Win32_ComputerSystemProcessor<br/>Win32_ComputerSystemProduct<br/>Win32_COMSetting<br/>Win32_Condition<br/>Win32_Cr&#101;ateFolderAction<br/>Win32_CurrentProbe<br/>Win32_DCOMApplication<br/>Win32_DCOMApplicationAccessAllowedSetting<br/>Win32_DCOMApplicationLaunchAllowedSetting<br/>Win32_DCOMApplicationSetting<br/>Win32_DependentService<br/>Win32_Desktop<br/>Win32_DesktopMonitor<br/>Win32_DeviceBus<br/>Win32_DeviceMemoryAddress<br/>Win32_DeviceSettings<br/>Win32_Directory<br/>Win32_DirectorySpecification<br/>Win32_DiskDrive<br/>Win32_DiskDriveToDiskPartition<br/>Win32_DiskPartition<br/>Win32_DisplayConfiguration<br/>Win32_DisplayControllerConfiguration<br/>Win32_DMAChannel<br/>Win32_DriverVXD<br/>Win32_DuplicateFileAction<br/>Win32_Environment<br/>Win32_EnvironmentSpecification<br/>Win32_ExtensionInfoAction<br/>Win32_Fan<br/>Win32_FileSpecification<br/>Win32_FloppyController<br/>Win32_FloppyDrive<br/>Win32_FontInfoAction<br/>Win32_Group<br/>Win32_GroupUser<br/>Win32_HeatPipe<br/>Win32_IDEController<br/>Win32_IDEControllerDevice<br/>Win32_ImplementedCategory<br/>Win32_InfraredDevice<br/>Win32_IniFileSpecification<br/>Win32_InstalledSoftwareElement<br/>Win32_IRQResource<br/>Win32_Keyboard<br/>Win32_LaunchCondition<br/>Win32_LoadOrderGroup<br/>Win32_LoadOrderGroupServiceDependencies<br/>Win32_LoadOrderGroupServiceMembers<br/>Win32_LogicalDisk<br/>Win32_LogicalDiskRootDirectory<br/>Win32_LogicalDiskToPartition<br/>Win32_LogicalFileAccess<br/>Win32_LogicalFileAuditing<br/>Win32_LogicalFileGroup<br/>Win32_LogicalFileOwner<br/>Win32_LogicalFileSecuritySetting<br/>Win32_LogicalMemoryConfiguration<br/>Win32_LogicalProgramGroup<br/>Win32_LogicalProgramGroupDirectory<br/>Win32_LogicalProgramGroupItem<br/>Win32_LogicalProgramGroupItemDataFile<br/>Win32_LogicalShareAccess<br/>Win32_LogicalShareAuditing<br/>Win32_LogicalShareSecuritySetting<br/>Win32_ManagedSystemElementResource<br/>Win32_MemoryArray<br/>Win32_MemoryArrayLocation<br/>Win32_MemoryDevice<br/>Win32_MemoryDeviceArray<br/>Win32_MemoryDeviceLocation<br/>Win32_MethodParameterClass<br/>Win32_MIMEInfoAction<br/>Win32_MotherboardDevice<br/>Win32_MoveFileAction<br/>Win32_MSIResource<br/>Win32_NetworkAdapter<br/>Win32_NetworkAdapterConfiguration<br/>Win32_NetworkAdapterSetting<br/>Win32_NetworkClient<br/>Win32_NetworkConnection<br/>Win32_NetworkLoginProfile<br/>Win32_NetworkProtocol<br/>Win32_NTEventlogFile<br/>Win32_NTLogEvent<br/>Win32_NTLogEventComputer<br/>Win32_NTLogEventLog<br/>Win32_NTLogEventUser<br/>Win32_ODBCAttribute<br/>Win32_ODBCDataSourceAttribute<br/>Win32_ODBCDataSourceSpecification<br/>Win32_ODBCDriverAttribute<br/>Win32_ODBCDriverSoftwareElement<br/>Win32_ODBCDriverSpecification<br/>Win32_ODBCSourceAttribute<br/>Win32_ODBCTranslatorSpecification<br/>Win32_OnBoardDevice<br/>Win32_OperatingSystem<br/>Win32_OperatingSystemQFE<br/>Win32_OSRecoveryConfiguration<br/>Win32_PageFile<br/>Win32_PageFileElementSetting<br/>Win32_PageFileSetting<br/>Win32_PageFileUsage<br/>Win32_ParallelPort<br/>Win32_Patch<br/>Win32_PatchFile<br/>Win32_PatchPackage<br/>Win32_PCMCIAController<br/>Win32_Perf<br/>Win32_PerfRawData<br/>Win32_PerfRawData_ASP_ActiveServerPages<br/>Win32_PerfRawData_ASPNET_114322_ASPNETAppsv114322<br/>Win32_PerfRawData_ASPNET_114322_ASPNETv114322<br/>Win32_PerfRawData_ASPNET_ASPNET<br/>Win32_PerfRawData_ASPNET_ASPNETApplications<br/>Win32_PerfRawData_IAS_IASAccountingClients<br/>Win32_PerfRawData_IAS_IASAccountingServer<br/>Win32_PerfRawData_IAS_IASAuthenticationClients<br/>Win32_PerfRawData_IAS_IASAuthenticationServer<br/>Win32_PerfRawData_InetInfo_InternetInformationServicesGlobal<br/>Win32_PerfRawData_MSDTC_DistributedTransactionCoordinator<br/>Win32_PerfRawData_MSFTPSVC_FTPService<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerAccessMethods<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerBackupDevice<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerBufferManager<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerBufferPartition<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerCacheManager<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerDatabases<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerGeneralStatistics<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerLatches<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerLocks<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerMemoryManager<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationAgents<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationDist<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationLogreader<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationMerge<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationSnapshot<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerSQLStatistics<br/>Win32_PerfRawData_MSSQLSERVER_SQLServerUserSettable<br/>Win32_PerfRawData_NETFramework_NETCLRExceptions<br/>Win32_PerfRawData_NETFramework_NETCLRInterop<br/>Win32_PerfRawData_NETFramework_NETCLRJit<br/>Win32_PerfRawData_NETFramework_NETCLRLoading<br/>Win32_PerfRawData_NETFramework_NETCLRLocksAndThreads<br/>Win32_PerfRawData_NETFramework_NETCLRMemory<br/>Win32_PerfRawData_NETFramework_NETCLRRemoting<br/>Win32_PerfRawData_NETFramework_NETCLRSecurity<br/>Win32_PerfRawData_Outlook_Outlook<br/>Win32_PerfRawData_PerfDisk_PhysicalDisk<br/>Win32_PerfRawData_PerfNet_Browser<br/>Win32_PerfRawData_PerfNet_Redirector<br/>Win32_PerfRawData_PerfNet_Server<br/>Win32_PerfRawData_PerfNet_ServerWorkQueues<br/>Win32_PerfRawData_PerfOS_Cache<br/>Win32_PerfRawData_PerfOS_Memory<br/>Win32_PerfRawData_PerfOS_Objects<br/>Win32_PerfRawData_PerfOS_PagingFile<br/>Win32_PerfRawData_PerfOS_Processor<br/>Win32_PerfRawData_PerfOS_System<br/>Win32_PerfRawData_PerfProc_FullImage_Costly<br/>Win32_PerfRawData_PerfProc_Image_Costly<br/>Win32_PerfRawData_PerfProc_JobObject<br/>Win32_PerfRawData_PerfProc_JobObjectDetails<br/>Win32_PerfRawData_PerfProc_Process<br/>Win32_PerfRawData_PerfProc_ProcessAddressSpace_Costly<br/>Win32_PerfRawData_PerfProc_Thread<br/>Win32_PerfRawData_PerfProc_ThreadDetails_Costly<br/>Win32_PerfRawData_RemoteAccess_RASPort<br/>Win32_PerfRawData_RemoteAccess_RASTotal<br/>Win32_PerfRawData_RSVP_ACSPerRSVPService<br/>Win32_PerfRawData_Spooler_PrintQueue<br/>Win32_PerfRawData_TapiSrv_Telephony<br/>Win32_PerfRawData_Tcpip_ICMP<br/>Win32_PerfRawData_Tcpip_IP<br/>Win32_PerfRawData_Tcpip_NBTConnection<br/>Win32_PerfRawData_Tcpip_NetworkInterface<br/>Win32_PerfRawData_Tcpip_TCP<br/>Win32_PerfRawData_Tcpip_UDP<br/>Win32_PerfRawData_W3SVC_WebService<br/>Win32_PhysicalMemory<br/>Win32_PhysicalMemoryArray<br/>Win32_PhysicalMemoryLocation<br/>Win32_PNPAllocatedResource<br/>Win32_PnPDevice<br/>Win32_PnPEntity<br/>Win32_PointingDevice<br/>Win32_PortableBattery<br/>Win32_PortConnector<br/>Win32_PortResource<br/>Win32_POTSModem<br/>Win32_POTSModemToSerialPort<br/>Win32_PowerManagementEvent<br/>Win32_Printer<br/>Win32_PrinterConfiguration<br/>Win32_PrinterController<br/>Win32_PrinterDriverDll<br/>Win32_PrinterSetting<br/>Win32_PrinterShare<br/>Win32_PrintJob<br/>Win32_PrivilegesStatus<br/>Win32_Process<br/>Win32_Processor<br/>Win32_ProcessStartup<br/>Win32_Product<br/>Win32_ProductCheck<br/>Win32_ProductResource<br/>Win32_ProductSoftwareFeatures<br/>Win32_ProgIDSpecification<br/>Win32_ProgramGroup<br/>Win32_ProgramGroupContents<br/>Win32_ProgramGroupOrItem<br/>Win32_Property<br/>Win32_ProtocolBinding<br/>Win32_PublishComponentAction<br/>Win32_QuickFixEngineering<br/>Win32_Refrigeration<br/>Win32_Registry<br/>Win32_RegistryAction<br/>Win32_RemoveFileAction<br/>Win32_RemoveIniAction<br/>Win32_ReserveCost<br/>Win32_ScheduledJob<br/>Win32_SCSIController<br/>Win32_SCSIControllerDevice<br/>Win32_SecurityDescriptor<br/>Win32_SecuritySetting<br/>Win32_SecuritySettingAccess<br/>Win32_SecuritySettingAuditing<br/>Win32_SecuritySettingGroup<br/>Win32_SecuritySettingOfLogicalFile<br/>Win32_SecuritySettingOfLogicalShare<br/>Win32_SecuritySettingOfObject<br/>Win32_SecuritySettingOwner<br/>Win32_SelfRegModuleAction<br/>Win32_SerialPort<br/>Win32_SerialPortConfiguration<br/>Win32_SerialPortSetting<br/>Win32_Service<br/>Win32_ServiceControl<br/>Win32_ServiceSpecification<br/>Win32_ServiceSpecificationService<br/>Win32_SettingCheck<br/>Win32_Share<br/>Win32_ShareToDirectory<br/>Win32_ShortcutAction<br/>Win32_ShortcutFile<br/>Win32_ShortcutSAP<br/>Win32_SID<br/>Win32_SMBIOSMemory<br/>Win32_SoftwareElement<br/>Win32_SoftwareElementAction<br/>Win32_SoftwareElementCheck<br/>Win32_SoftwareElementCondition<br/>Win32_SoftwareElementResource<br/>Win32_SoftwareFeature<br/>Win32_SoftwareFeatureAction<br/>Win32_SoftwareFeatureCheck<br/>Win32_SoftwareFeatureParent<br/>Win32_SoftwareFeatureSoftwareElements<br/>Win32_SoundDevice<br/>Win32_StartupCommand<br/>Win32_SubDirectory<br/>Win32_SystemAccount<br/>Win32_SystemBIOS<br/>Win32_SystemBootConfiguration<br/>Win32_SystemDesktop<br/>Win32_SystemDevices<br/>Win32_SystemDriver<br/>Win32_SystemDriverPNPEntity<br/>Win32_SystemEnclosure<br/>Win32_SystemLoadOrderGroups<br/>Win32_SystemLogicalMemoryConfiguration<br/>Win32_SystemMemoryResource<br/>Win32_SystemNetworkConnections<br/>Win32_SystemOperatingSystem<br/>Win32_SystemPartitions<br/>Win32_SystemProcesses<br/>Win32_SystemProgramGroups<br/>Win32_SystemResources<br/>Win32_SystemServices<br/>Win32_SystemSetting<br/>Win32_SystemSlot<br/>Win32_SystemSystemDriver<br/>Win32_SystemTimeZone<br/>Win32_SystemUsers<br/>Win32_TapeDrive<br/>Win32_TemperatureProbe<br/>Win32_Thread<br/>Win32_TimeZone<br/>Win32_Trustee<br/>Win32_TypeLibraryAction<br/>Win32_UninterruptiblePowerSupply<br/>Win32_USBController<br/>Win32_USBControllerDevice<br/>Win32_UserAccount<br/>Win32_UserDesktop<br/>Win32_VideoConfiguration<br/>Win32_VideoController<br/>Win32_VideoSettings<br/>Win32_VoltageProbe<br/>Win32_WMIElementSetting<br/>Win32_WMISetting</div></div>]]></description>
		</item>
		
			<item>
			<link>http://bokee.shinylife.net/blog/article.asp?id=1040</link>
			<title><![CDATA[C#开发彩信帮助利器（MMS、SDP）]]></title>
			<author>paulleder@msn.com(PaulLeder)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Wed,07 Jul 2010 16:46:42 +0800</pubDate>
			<guid>http://bokee.shinylife.net/blog/default.asp?id=1040</guid>
		<description><![CDATA[开发彩信（MM7或基于MM7的SDP）均采用带附件的SOAP方式传输。问题难就难在传输的SOAP还要带附件。<br/>在网上看到很多人把SOAP报文搞得很神秘，现在想回去，这些人应该是没有拿到移动运营商的协议资料才这样的。<br/>但是即使你知道了带附件的SOAP也未必能下手处理彩信分包。这是个最关键的问题。<br/>之前我用过<a target="_blank" href="http://anmar.eu.org/projects/sharpmimetools/" rel="external">SharpMIMETools</a>,是一个不错的工具，但是因为他并不支持内嵌式的分块，所以我选择了放弃，也许它本身是支持的，只是我没有发现而已。<br/>后来我找到了<a target="_blank" href="http://www.codeproject.com/KB/cs/MIME_De_Encode_in_C_.aspx" rel="external">A C# Implementation of Mime De/encode</a>解决了这样的问题，个人觉得A C# Implementation of Mime De/encode更加方便使用，当然，需要做一些简单的扩展。<br/>比如我的例子，此例子是在原DEMO的基础上修改的。需要修改DEMO里面的MIME类。<br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://bokee.shinylife.net/blog/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent">MimeMessage mail = new MimeMessage();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mail.Setversion();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mail.SetContentType(&#34;multipart/related; type=\&#34;text/xml\&#34;; start=\&#34;&lt;rootpart@soapui.org&gt;\&#34;&#34;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mail.SetBoundary(null);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Add a text body part<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// default Content-Type is &#34;text/plain&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// default Content-Transfer-Encoding is &#34;7bit&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MimeBody mBody = mail.Cr&#101;atePart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//mBody.SetContentType(&#34;text/xml; charset=UTF-8&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody.SetTransferEncoding(&#34;8bit&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody.SetContentID(&#34;rootpart@soapui.org&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Text.StringBuilder sb1 = new StringBuilder();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.AppendLine(&#34;&lt;soapenv:Envelope xmlns:soapenv=\&#34;<a href="http://schemas.xmlsoap.org/soap/envelope/" target="_blank" rel="external">http://schemas.xmlsoap.org/soap/envelope/</a>\&#34; xmlns:loc=\&#34;<a href="http://www.csapi.org/schema/parlayx/multimedia_messaging/send/v2_4/local" target="_blank" rel="external">http://www.csapi.org/schema/parlayx/multimedia_messaging/send/v2_4/local</a>\&#34;&gt;&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.AppendLine(&#34;&lt;soapenv:Header/&gt;&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.AppendLine(&#34; &lt;soapenv:Body&gt;&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.AppendLine(&#34; &lt;/soapenv:Body&gt;&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.AppendLine(&#34;&lt;/soapenv:Envelope&gt;&#34;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody.SetText(sb1.ToString());<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody = mail.Cr&#101;atePart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody.SetTransferEncoding(&#34;base64&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody.SetContentType(&#34;images/jpg&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody.ReadFromFile(&#34;00.jpg&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody.SetContentID(&#34;001.jpg&#34;);<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Add an embeded multipart<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody = mail.Cr&#101;atePart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody.SetContentType(&#34;multipart/mixed&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBody.SetBoundary(null);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MimeBody mBodyChild = mBody.Cr&#101;atePart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBodyChild.SetContentID(&#34;Part 1.txt&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBodyChild.ReadFromFile(&#34;a.txt&#34;);<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;mBodyChild = mBody.Cr&#101;atePart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBodyChild.SetContentID(&#34;Part 2.txt&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBodyChild.SetText(&#34;Content of Part 2\r\n&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//store content to a string buffer<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb = new StringBuilder();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mail.StoreBody(sb);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamWriter sw = new StreamWriter(&#34;aaa2.txt&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sw.Write(sb.ToString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sw.Close();<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamReader sr = new StreamReader(&#34;aaa2.txt&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string message = sr.ReadToEnd();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MimeMessage aMimeMessage = new MimeMessage();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aMimeMessage.LoadBody(message);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList bodylist = new ArrayList();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aMimeMessage.GetBodyPartList(bodylist);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; bodylist.Count; i++)<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;MimeBody ab = (MimeBody)bodylist[i];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ab.IsText())<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string m = ab.GetText();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Windows.Forms.MessageBox.Show(m);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (ab.IsAttachment())<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ab.WriteToFile(&#34;new&#34; + ab.GetContentID());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><br/><br/>例子中需要一张命名为00.jpg的图片，不然会报错的，需要扩展Content_ID等。在原DEMO上是会出错的。<br/>最后的结果是：<br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://bokee.shinylife.net/blog/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent">MIME-Version: 1.0<br/>Content-Type: multipart/related;<br/>&#160;&#160;&#160;&#160; type=&#34;text/xml&#34;;<br/>&#160;&#160;&#160;&#160; start=&#34;&lt;rootpart@soapui.org&gt;&#34;;<br/>&#160;&#160;&#160;&#160;boundary=&#34;__=_Part_Boundary_930842489_308062783&#34;<br/><br/>--__=_Part_Boundary_930842489_308062783<br/>Content-Transfer-Encoding: 8bit<br/>Content-ID: &lt;rootpart@soapui.org&gt;<br/>Content-Type: text/plain;<br/>&#160;&#160;&#160;&#160;charset=&#34;gb2312&#34;<br/><br/>&lt;soapenv:Envelope xmlns:soapenv=&#34;<a href="http://schemas.xmlsoap.org/soap/envelope/" target="_blank" rel="external">http://schemas.xmlsoap.org/soap/envelope/</a>&#34; xmlns:loc=&#34;<a href="http://www.csapi.org/schema/parlayx/multimedia_messaging/send/v2_4/local" target="_blank" rel="external">http://www.csapi.org/schema/parlayx/multimedia_messaging/send/v2_4/local</a>&#34;&gt;<br/>&lt;soapenv:Header/&gt;<br/> &lt;soapenv:Body&gt;<br/> &lt;/soapenv:Body&gt;<br/>&lt;/soapenv:Envelope&gt;<br/><br/>--__=_Part_Boundary_930842489_308062783<br/>Content-Transfer-Encoding: base64<br/>Content-Type: images/jpg<br/>Content-ID: &lt;001.jpg&gt;<br/><br/>图片的BASE64编码<br/>--__=_Part_Boundary_930842489_308062783<br/>Content-Type: multipart/mixed;<br/>&#160;&#160;&#160;&#160;boundary=&#34;__=_Part_Boundary_1945173545_95082901&#34;<br/><br/>--__=_Part_Boundary_1945173545_95082901<br/>Content-ID: &lt;Part 1.txt&gt;<br/>Content-Transfer-Encoding: base64<br/><br/>ZmRhc2ZhZHNmYQ0KZmRzYWYNCmRzZmRzYWZkc7eiyfq087f5tdi3vbCitPTJs7eiw7vBy7XEt6LJ<br/>1bX6DQq3osn6tPO3+WRzZmRhc2bKv7Tzt/K12Le9<br/>--__=_Part_Boundary_1945173545_95082901<br/>Content-ID: &lt;Part 2.txt&gt;<br/>Content-Transfer-Encoding: 7bit<br/>Content-Type: text/plain;<br/>&#160;&#160;&#160;&#160;charset=&#34;gb2312&#34;<br/><br/>Content of Part 2<br/><br/>--__=_Part_Boundary_1945173545_95082901--<br/>--__=_Part_Boundary_930842489_308062783--</div></div>]]></description>
		</item>
		
</channel>
</rss>
