<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_赏梅斋</title><subtitle type="text">关注微软技术</subtitle><id>http://feed.cnblogs.com/blog/u/5165/rss</id><updated>2011-12-01T09:45:01Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/5165/rss"/><entry><id>http://www.cnblogs.com/shangmeizhai/archive/2011/12/01/2270978.html</id><title type="text">安装Lync Server前端必备组件Wmf2008R2时失败的问题</title><summary type="text">当我安装Lync进行到安装前端必备组件步骤时，出现了Wmf2008R2错误。如图：查了一下资料，原来引起这个问题的原因是：在Windows2008 R2上安装Lync时，安装程序会自动安装组件Windows-Media-Format，然后再安装Lync程序。但我的系统是Windows2008 R2 SP1，Windows2008 R2升级到R2 SP1后，Windows-Media-Format的版本从6.1.7600.16385变成了6.1.7601.17514，而Lync安装程序里面的调用命令写死是：Executing external command: C:\Windows\system</summary><published>2011-12-01T09:45:00Z</published><updated>2011-12-01T09:45:00Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shangmeizhai/archive/2011/12/01/2270978.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/archive/2011/12/01/2270978.html"/><content type="html">&lt;p&gt;当我安装Lync进行到安装前端必备组件步骤时，出现了&lt;span  style="color: #2c2c2c; font-family: 微软雅黑; line-height: 28px; background-color: #ffffff; "&gt;Wmf2008R2错误。如图：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shangmeizhai/Capture.PNG" border="0" alt="" width="509" height="262" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;查了一下资料，原来引起这个问题的原因是：&lt;/p&gt;&lt;div&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 15px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #2c2c2c; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "&gt;在Windows2008 R2上安装Lync时，安装程序会自动安装组件Windows-Media-Format，然后再安装Lync程序。&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 15px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #2c2c2c; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "&gt;但我的系统是Windows2008 R2 SP1，Windows2008 R2升级到R2 SP1后，Windows-Media-Format的版本从&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;6.1.7600.16385&lt;/strong&gt;变成了&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;6.1.7601.17514&lt;/strong&gt;，而Lync安装程序里面的调用命令写死是：Executing external command: C:\Windows\system32\dism.exe /online /norestart /add-package&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 15px; padding-left: 0px; color: #2c2c2c; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; "&gt;/packagepath:C:\Windows\servicing\Packages\Microsoft-Windows-Media-Format-&amp;nbsp;&lt;br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /&gt;Package~31bf3856ad364e35~amd64~~&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;6.1.7600.16385&lt;/strong&gt;.mum /ignorecheck&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #2c2c2c; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; "&gt;这样，就会因为找不到组件而安装失败。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一个简单的解决办法：&lt;/p&gt;&lt;p&gt;&lt;span  style="color: #2c2c2c; font-family: 微软雅黑; line-height: 28px; background-color: #ffffff; "&gt;直接在&amp;#8220;服务管理器&amp;#8221;-&amp;#8220;功能&amp;#8221;中添加&amp;#8220;桌面体验&amp;#8221;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="color: #2c2c2c; font-family: 微软雅黑; line-height: 28px; background-color: #ffffff; "&gt;添加这个功能是因为这个功能会安装我们需要的Windows Media Format Runtime这个组件。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/shangmeizhai/Capture1.PNG" border="0" alt="" width="615" height="404" /&gt;&lt;/p&gt;&lt;p&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #2c2c2c; font-family: 微软雅黑; line-height: 28px; background-color: #ffffff; "&gt;安装完成需要重启计算机才能够继续安装。 &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;虽然这个方法比较简单，但如果你不想因为一个组件去安装不相关的功能，则还有一个方法。&lt;/p&gt;&lt;p&gt;&lt;span  style="color: #2c2c2c; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "&gt;运行PowerShell，并在其中执行：&lt;/span&gt;&lt;/p&gt;&lt;div&gt;dism.exe /online /norestart /add-package /packagepath:C:\Windows\servicing\Package&amp;nbsp;&lt;br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /&gt;\Microsoft-Windows-Media-Format-Package~31bf3856ad364e35~amd64~~&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;6.1.7601.17514&lt;/strong&gt;.mum /ignorecheck&lt;/div&gt;&lt;p&gt;运行完后要重启计算机，然后再继续安装就OK了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/shangmeizhai/aggbug/2270978.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shangmeizhai/archive/2011/12/01/2270978.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shangmeizhai/archive/2011/12/01/2270922.html</id><title type="text">域环境安装SQLServer时出现“帐户名与安全标识之间无任何映射”的问题</title><summary type="text">为了安装Lync演示环境，我安装了DC、前端、后端三台虚机。当在后端安装SQLServer的时候，我试着给所有服务使用相同的账号设置时，每当选择之前在DC上建好的”Atosdemo\SQLService&amp;quot;账号时，显示在账号文本框上的账号前总会变成“S-1-5-21-2000478354-688789844-839522115\SQLService”样子，本应是域名的地方变成了一长串字符。并提示“帐户名与安全标识之间无任何映射”。根据经验，前面的这个长字符串应该是Windows的SID。这让我想到了，很有可能是因为Windows之间的SID重复了。我的三个虚机是通过一个Windows母</summary><published>2011-12-01T09:10:00Z</published><updated>2011-12-01T09:10:00Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shangmeizhai/archive/2011/12/01/2270922.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/archive/2011/12/01/2270922.html"/><content type="html">&lt;p&gt;为了安装Lync演示环境，我安装了DC、前端、后端三台虚机。&lt;/p&gt;&lt;p&gt;当在后端安装SQLServer的时候，我试着给所有服务使用相同的账号设置时，每当选择之前在DC上建好的&amp;#8221;Atosdemo\SQLService"账号时，显示在账号文本框上的账号前总会变成&amp;#8220;&lt;span  style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 18px; background-color: #ffffff; "&gt;S-1-5-21-2000478354-688789844-839522115\SQLService&lt;/span&gt;&amp;#8221;样子，本应是域名的地方变成了一长串字符。并提示&amp;#8220;&lt;span  style="font-size: 16px; font-weight: bold; line-height: 24px; "&gt;帐户名与安全标识之间无任何映射&amp;#8221;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;根据经验，前面的这个长字符串应该是Windows的SID。这让我想到了，很有可能是因为Windows之间的SID重复了。&lt;/p&gt;&lt;p&gt;我的三个虚机是通过一个Windows母盘Clone的。&amp;nbsp;&lt;/p&gt;&lt;p&gt;于是我在前端与后端两台虚机上执行 了sysprep命令，重新安装SQLServer，问题就解决了。事实证明我的判断是正确的。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;：），教训是：玩多个虚机的时候一定要记得Sysprep啊...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shangmeizhai/aggbug/2270922.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shangmeizhai/archive/2011/12/01/2270922.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shangmeizhai/archive/2011/11/30/2269045.html</id><title type="text">网络发现不能启用的问题</title><summary type="text">今天在安装虚机的时候，本想映射本机的一个共享目录，但设置过程中，Windows提示网络发现未启用。然后去设置网络发现，但设置总是不能被修改。后来发现原来要启动如下三个服务才行：Function Discovery Resource PublicationSSDP DiscoveryUPnP Device Host</summary><published>2011-11-30T06:22:00Z</published><updated>2011-11-30T06:22:00Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shangmeizhai/archive/2011/11/30/2269045.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/archive/2011/11/30/2269045.html"/><content type="html">&lt;p&gt;今天在安装虚机的时候，本想映射本机的一个共享目录，但设置过程中，Windows提示网络发现未启用。&lt;/p&gt;&lt;p&gt;然后去设置网络发现，但设置总是不能被修改。&lt;/p&gt;&lt;p&gt;后来发现原来要启动如下三个服务才行：&lt;/p&gt;&lt;div&gt;&lt;table cellspacing="0" cellpadding="0" style="word-wrap: break-word; empty-cells: show; border-collapse: collapse; table-layout: fixed; width: 762px; color: #444444; font-family: 'Lucida Grande', 'Microsoft Yahei', Arial, Calibri, 'Trebuchet MS', Helvetica, Hiragino, STHeiti, 'Microsoft Jhenghei', sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; "&gt;&lt;tbody style="word-wrap: break-word; "&gt;&lt;tr style="word-wrap: break-word; "&gt;&lt;td id="postmessage_14132291" style="word-wrap: break-word; font-size: 14px; "&gt;Function Discovery Resource Publication&lt;br style="word-wrap: break-word; " /&gt;SSDP Discovery&lt;br style="word-wrap: break-word; " /&gt;UPnP Device Host&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shangmeizhai/aggbug/2269045.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shangmeizhai/archive/2011/11/30/2269045.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shangmeizhai/archive/2011/11/16/2251295.html</id><title type="text">sharepoint 2010 与sqlserver denali的支持性安装测试</title><summary type="text">今天做了个测试，把sharepoint2010安装在sqlserver denali CTP3上。结果安装最终以失败告终。我把数据库sqlserver denali安装在A服务器上，也是AD。把sharepoint2010安装在B服务器上，域成员。分别安装都是成功的。但当运行sharepoint2010的配置向导时，在指定数据库服务器的画面中是连接不到A服务器上的数据库的。它会报“cannot connect to database master at XXX&amp;quot;的错误。一般遇到这个错误可能是用户权限与服务器防火墙的问题。可参考Blog文章http://blogs.technet.co</summary><published>2011-11-16T07:21:00Z</published><updated>2011-11-16T07:21:00Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shangmeizhai/archive/2011/11/16/2251295.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/archive/2011/11/16/2251295.html"/><content type="html">&lt;p&gt;今天做了个测试，把sharepoint2010安装在sqlserver denali CTP3上。&lt;/p&gt;&lt;p&gt;结果安装最终以失败告终。&lt;/p&gt;&lt;p&gt;我把数据库sqlserver denali安装在A服务器上，也是AD。把sharepoint2010安装在B服务器上，域成员。分别安装都是成功的。&lt;/p&gt;&lt;p&gt;但当运行sharepoint2010的配置向导时，在指定数据库服务器的画面中是连接不到A服务器上的数据库的。它会报&amp;#8220;cannot connect to database master at XXX"的错误。一般遇到这个错误可能是用户权限与服务器防火墙的问题。可参考Blog文章&lt;a href="http://blogs.technet.com/b/tothesharepoint/archive/2011/01/12/troubleshooting-sharepoint-configuration-error-cannot-connect-to-database-master-at-server-name.aspx"&gt;http://blogs.technet.com/b/tothesharepoint/archive/2011/01/12/troubleshooting-sharepoint-configuration-error-cannot-connect-to-database-master-at-server-name.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我对用户权限与服务器防火墙进行了检查，但却排除了这两个可能。&amp;nbsp;&lt;/p&gt;&lt;p&gt;于是我又尝试在A服务器上直接安装Sharepoint2010.在安装的过程中我注意到平时不太注意的安装过程，在其过程中会自动安装&amp;#8221;sql server 2008 native client"。&amp;nbsp;&lt;/p&gt;&lt;p&gt;我猜测可能是因为sharepoint2010利用2008的native client从而无法连到denali。&lt;/p&gt;&lt;p&gt;当我把SharePoint2010安装在A服务器上后（即把SharePoint2010和SQLserver denali放在了同一台机器上），再运行sharepoint2010的配置向导，则在指定数据库服务器的画面顺利通过，但接下来的运行马上进入了配置失败的画面。其提示找不到指定的一个存储过程。&lt;/p&gt;&lt;p&gt;到这儿，我只能相信我的猜测了，暂时好像还无法利用sqlserver denali来做sharepoint的后端了.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shangmeizhai/aggbug/2251295.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shangmeizhai/archive/2011/11/16/2251295.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shangmeizhai/archive/2011/05/06/2038856.html</id><title type="text">SPES2011开始注册了！</title><summary type="text">座位有限，礼品有限，所以大家快些去注册吧！ 注册地址：http://www.msiw.net/Pages/EliteSummit2011.aspx</summary><published>2011-05-06T05:43:00Z</published><updated>2011-05-06T05:43:00Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shangmeizhai/archive/2011/05/06/2038856.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/archive/2011/05/06/2038856.html"/><content type="html">&lt;p&gt;座位有限，礼品有限，所以大家快些去注册吧！ 注册地址：&lt;a href="http://www.msiw.net/Pages/EliteSummit2011.aspx"&gt;http://www.msiw.net/Pages/EliteSummit2011.aspx&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/shangmeizhai/RegisterforSPES2011today.png" width="680" height="1314" /&gt;&lt;/p&gt;  &lt;img src="http://www.cnblogs.com/shangmeizhai/aggbug/2038856.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shangmeizhai/archive/2011/05/06/2038856.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shangmeizhai/archive/2011/04/25/2026796.html</id><title type="text">K2 Blackpearl 4.5 怎样配置SQLUM</title><summary type="text">K2 Blackpearl 4.5和以前的版本一样，除了支持AD用户外，也支持SQL用户。配置其实很简单，只要执行一下如下的一段SQL就可以了。INSERTINTO[K2HostServer].[dbo].[SecurityLabels]([SecurityLabelID],[SecurityLabelName],[AuthSecurityProviderID],[AuthInit],[RoleSecurityProviderID],[RoleInit],[DefaultLabel])VALUES(&amp;#39;8e8d5221-ee89-4cd7-99da-fcfcdf64abdb&amp;#39;,&amp;</summary><published>2011-04-25T02:23:00Z</published><updated>2011-04-25T02:23:00Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shangmeizhai/archive/2011/04/25/2026796.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/archive/2011/04/25/2026796.html"/><content type="html">&lt;p align="left"&gt;K2 Blackpearl 4.5和以前的版本一样，除了支持AD用户外，也支持SQL用户。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;配置其实很简单，只要执行一下如下的一段SQL就可以了。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;INSERT&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;INTO&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;K2HostServer&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;SecurityLabels&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;SecurityLabelID&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;SecurityLabelName&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;AuthSecurityProviderID&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;AuthInit&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;RoleSecurityProviderID&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;RoleInit&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000"&gt;DefaultLabel&lt;/span&gt;&lt;span style="color: #ff0000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;VALUES&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;8e8d5221-ee89-4cd7-99da-fcfcdf64abdb&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;K2SQL&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;fc1848e6-23f5-49d8-8c48-9f7b197c80b7&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;lt;AuthInit&amp;gt;&amp;lt;init&amp;gt;k2-demo,K2SQLUM&amp;lt;/init&amp;gt;&amp;lt;login/&amp;gt;&amp;lt;implementation&amp;nbsp;assembly="SQLUM,&amp;nbsp;Version=4.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=16a2c5aaaa1b130d"&lt;br /&gt;type="SQLUM.K2UserManager"/&amp;gt;&amp;lt;/AuthInit&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;fc1848e6-23f5-49d8-8c48-9f7b197c80b7&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;lt;roleprovider&amp;gt;&amp;lt;init&amp;gt;k2-demo,&amp;nbsp;K2SQLUM&amp;lt;/init&amp;gt;&amp;lt;login/&amp;gt;&amp;lt;implementation&amp;nbsp;assembly&amp;nbsp;="SQLUM,&amp;nbsp;Version=4.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=16a2c5aaaa1b130d"&amp;nbsp;type&amp;nbsp;="SQLUM.K2UserManager"/&amp;gt;&amp;lt;/roleprovider&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000"&gt;0&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p align="left"&gt;其中，k2-demo是服务器名称。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;这段SQL实际上就是在K2 Host Server数据库中SecurityLabels表中添加了两条记录。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;配好这个后，我们就可以在SQL Management Studio中添加用户了，我们只需要执行K2SQLUM数据库下的存储过程&amp;#8220;CreateUser&amp;#8221;即可。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;添加好用户后，就可以在WorkSpace中在Server rights下把新添加的用户授权了。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shangmeizhai/aggbug/2026796.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shangmeizhai/archive/2011/04/25/2026796.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951574.html</id><title type="text">SharePoint2010企业开发最佳实践（九）---- 事件接收器的最佳做法</title><summary type="text">在事件接收器中使用对象不要在事件接收器内实例化 SPWeb、SPSite、SPList 或 SPListItem 对象。实例化这些对象而非使用通过事件属性传递的实例的事件接收器可能会导致以下问题： 大量额外的数据库往返（一次写入操作会导致在每个事件接收器中出现多达 5 次的额外往返）。 对这些实例调用 Update 方法会导致在其他注册的事件接收器中的后续 Update 调用失败。 不良的编码实践 在事件接收器内安装一个 SPSite 对象 public override void ItemDeleting(SPItemEventProperties properties){ using (S</summary><published>2011-02-11T10:21:00Z</published><updated>2011-02-11T10:21:00Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951574.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951574.html"/><content type="html">&lt;p&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#3f529c" size="5"&gt;在事件接收器中使用对象&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;不要在事件接收器内实例化 &lt;span &gt;SPWeb&lt;/span&gt;、&lt;span &gt;SPSite&lt;/span&gt;、&lt;span &gt;SPList&lt;/span&gt; 或 &lt;span &gt;SPListItem&lt;/span&gt; 对象。实例化这些对象而非使用通过事件属性传递的实例的事件接收器可能会导致以下问题： &lt;/p&gt;&#xD;
&lt;ul xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;li&gt;&#xD;
&lt;p&gt;大量额外的数据库往返（一次写入操作会导致在每个事件接收器中出现多达 5 次的额外往返）。 &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;对这些实例调用 &lt;span &gt;Update&lt;/span&gt; 方法会导致在其他注册的事件接收器中的后续 &lt;span &gt;Update&lt;/span&gt; 调用失败。 &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;strong&gt;不良的编码实践&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;em&gt;在事件接收器内安装一个 SPSite 对象&lt;/em&gt; &lt;/p&gt;&#xD;
&lt;p&gt;public override void ItemDeleting(SPItemEventProperties properties)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite site = new SPSite(properties.WebUrl))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = site.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPList list = web.Lists[properties.ListId];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPListItem item = list.GetItemByUniqueId(properties.ListItemId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Operate on an item.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;strong&gt;良好的编码实践&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;em&gt;使用 SPItemEventProperties&lt;/em&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;// Retrieve SPWeb and SPListItem from SPItemEventProperties instead of&lt;br /&gt;// from a new instance of SPSite.&lt;br /&gt;SPWeb web = properties.OpenWeb();&lt;br /&gt;// Operate on the SPWeb object.&lt;br /&gt;SPListItem item = properties.ListItem;&lt;br /&gt;// Operate on an item.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;如果不从 &lt;span &gt;SPItemEventProperties&lt;/span&gt; 中检索 &lt;span &gt;SPWeb&lt;/span&gt;、&lt;span &gt;SPSite&lt;/span&gt;、&lt;span &gt;SPList&lt;/span&gt; 或 &lt;span &gt;SPListItem&lt;/span&gt; 对象，而是在一个事件接收器中实例化这些对象，当对这些新实例调用 &lt;span &gt;Update&lt;/span&gt; 时，则必须使用 &lt;span &gt;SPEventPropertiesBase&lt;/span&gt; 的适当子类（例如 &lt;span &gt;SPItemEventProperties.InvalidateListItem&lt;/span&gt; 或 &lt;span &gt;SPItemEventProperties.InvalidateWeb&lt;/span&gt;）中的 &lt;span &gt;Invalidate&lt;/span&gt; 方法清除它。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shangmeizhai/aggbug/1951574.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951574.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951570.html</id><title type="text">SharePoint2010企业开发最佳实践（八）---- SPWeb 对象</title><summary type="text">SPWeb.ParentWeb 属性释放清理是由 SharePoint Foundation 和 SharePoint Server 自动处理的。良好的编码实践using (SPSite site = new SPSite(&amp;quot;http://www.msiw.net/&amp;quot;)) { using (SPWeb web = site.OpenWeb()) { SPList list = web.Lists[&amp;quot;Announcements&amp;quot;]; SPWeb parentWeb = list.ParentWeb; //No explicit dispose requir</summary><published>2011-02-11T10:12:00Z</published><updated>2011-02-11T10:12:00Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951570.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951570.html"/><content type="html">&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;SPWeb.ParentWeb 属性&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;p&gt;释放清理是由 SharePoint Foundation 和 SharePoint Server 自动处理的。&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;良好的编码实践&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p  xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;using (SPSite site = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;")) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = site.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPList list = web.Lists["Announcements"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWeb parentWeb = list.ParentWeb; //No explicit dispose required.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;SPWeb.Webs 属性&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;h4 &gt;SPWeb.Webs&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;span &gt;SPWeb.Webs&lt;/span&gt; 属性将返回 &lt;span &gt;SPWebCollection&lt;/span&gt; 对象。必须释放此集合中的 &lt;span &gt;SPWeb&lt;/span&gt; 对象。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;h4 &gt;不良的编码实践&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;void WebsLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb outerWeb = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (SPWeb innerWeb in outerWeb.Webs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SPWeb innerWeb leak.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object outerWeb.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called. &lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;h4 &gt;良好的编码实践&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;void WebsNoLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb outerWeb = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (SPWeb innerWeb in outerWeb.Webs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try // Should be first statement after foreach.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(innerWeb != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; innerWeb.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object outerWeb.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called. &lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;h4 &gt;SPWeb.Webs.Add&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;span &gt;SPWeb.Webs.Add&lt;/span&gt; 方法（或 &lt;span &gt;SPWebCollection.Add&lt;/span&gt;）会创建并返回新的 &lt;span &gt;SPWeb&lt;/span&gt; 对象。应该释放从此方法调用中返回的任何 &lt;span &gt;SPWeb&lt;/span&gt; 对象。 &lt;/p&gt;&lt;/div&gt;&#xD;
&lt;h4 &gt;不良的编码实践&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;void WebsAddLeak(string strWebUrl)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWeb addedWeb = web.Webs.Add(strWebUrl);&amp;nbsp;&amp;nbsp; // Will leak.&lt;/p&gt;&#xD;
&lt;p&gt;} // SPWeb object web.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called.&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;h4 &gt;良好的编码实践&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;void WebsAddNoLeak(string strWebUrl)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb addedWeb = web.Webs.Add(strWebUrl))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //..&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&#xD;
&lt;p&gt;} // SPWeb object web.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called.&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;h4 &gt;SPWeb.Webs[] 索引运算符&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;span &gt;SPWeb.Webs[]&lt;/span&gt; 索引运算符会针对每次访问返回一个新的 &lt;span &gt;SPWeb&lt;/span&gt; 对象。将会通过调用 &lt;span &gt;OpenWeb&lt;/span&gt; 方法来创建 &lt;span &gt;SPWeb&lt;/span&gt;，即使已经访问了该对象也不例外。以下代码示例会导致在 .NET Framework 使用的内存中长期保留这些对象。&lt;/p&gt;&#xD;
&lt;h4 &gt;不良的编码实践 #1&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;em&gt;使用 &lt;span &gt;For&lt;/span&gt; 循环&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;int i;&lt;/p&gt;&#xD;
&lt;p&gt;SPWeb oSPWeb, oSPWeb2;&lt;br /&gt;SPSite oSPSite = SPControl.GetContextSite(Context);&lt;/p&gt;&#xD;
&lt;p&gt;oSPWeb = oSPSite.OpenWeb();&lt;/p&gt;&#xD;
&lt;p&gt;for(i = 0;i &amp;lt; oSPWeb.Webs.Count;i++)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; oSPWeb2 = oSPWeb.Webs[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp; BuildTableRow(oDisplayTable, "Web", oSPWeb2.Title);&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;h4 &gt;不良的编码实践 #2&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;em&gt;使用 &lt;span &gt;foreach&lt;/span&gt; 循环&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;SPWeb oSPWeb, oSPWeb2;&lt;br /&gt;SPSite oSPSite = SPControl.GetContextSite(Context);&lt;/p&gt;&#xD;
&lt;p&gt;oSPWeb = oSPSite.OpenWeb();&lt;/p&gt;&#xD;
&lt;p&gt;foreach(SPWeb oSPWeb2 in oSPWebe.Webs)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; BuildTableRow(oDisplayTable, "Web", oSPWeb2.Title);&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;建议的修复方法是在每次循环结束后进行释放。&lt;/p&gt;&#xD;
&lt;h4 &gt;良好的编码实践 #1&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;em&gt;使用 &lt;span &gt;For&lt;/span&gt; 循环&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;int i;&lt;/p&gt;&#xD;
&lt;p&gt;SPWeb oSPWeb, oSPWeb2;&lt;br /&gt;SPSite oSPSite = SPControl.GetContextSite(Context);&lt;/p&gt;&#xD;
&lt;p&gt;oSPWeb = oSPSite.OpenWeb();&lt;/p&gt;&#xD;
&lt;p&gt;for(i = 0;i &amp;lt; oSPWeb.Webs.Count;i++)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; oSPWeb2 = oSPWeb.Webs[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp; BuildTableRow(oDisplayTable, "Web", oSPWeb2.Title);&lt;br /&gt;&amp;nbsp;&amp;nbsp; oSPWeb2.Dispose();&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;oSPWeb.Dispose();&lt;/p&gt;&#xD;
&lt;h4 &gt;良好的编码实践 #2&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;em&gt;使用 &lt;span &gt;foreach&lt;/span&gt; 循环&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;SPWeb oSPWeb, oSPWeb2;&lt;br /&gt;SPSite oSPSite = SPControl.GetContextSite(Context);&lt;/p&gt;&#xD;
&lt;p&gt;oSPWeb = oSPSite.OpenWeb();&lt;/p&gt;&#xD;
&lt;p&gt;foreach(SPWeb oSPWeb2 in oSPWeb.Webs)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; BuildTableRow(oDisplayTable, "Web", oSPWeb2.Title);&lt;br /&gt;&amp;nbsp;&amp;nbsp; oSPWeb2.Dispose();&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;oSPWeb.Dispose();&lt;/p&gt;&#xD;
&lt;h4 &gt;良好的编码实践 #3&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;em&gt;将 &lt;span &gt;for&lt;/span&gt; 循环与自动释放结合使用&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;int i;&lt;/p&gt;&#xD;
&lt;p&gt;SPWeb oSPWeb, oSPWeb2;&lt;br /&gt;SPSite oSPSite = SPControl.GetContextSite(Context);&lt;/p&gt;&#xD;
&lt;p&gt;using(oSPWeb = oSPSite.OpenWeb())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; for(i = 0;i &amp;lt; oSPWeb.Webs.Count;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Using(oSPWeb2 = oSPWeb.Webs[i])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BuildTableRow(oDisplayTable, "Web", oSPWeb2.Title);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shangmeizhai/aggbug/1951570.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951570.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951561.html</id><title type="text">SharePoint2010企业开发最佳实践（七）---- SPSite 对象</title><summary type="text">通常，调用应用程序无论何时使用新 SPSite 构造函数（任何签名），都应该在用完对象之后调用 Dispose() 方法。如果 SPSite 对象是从 GetContextSite() 中获得的，则该调用应用程序不 应该释放对象。因为 SPWeb 和 SPSite 对象会保留通过此方式派生的内部列表，所以释放对象可能会导致 SharePoint 对象模型行为无法预料。SharePoint Foundation 在页面完成之后会在内部枚举此列表以正确释放对象。SPSiteCollection 类SPSiteCollection.Add 方法SPSiteCollection.Add 方法将创建并返</summary><published>2011-02-11T10:04:00Z</published><updated>2011-02-11T10:04:00Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951561.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951561.html"/><content type="html">&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;通常，调用应用程序无论何时使用新 &lt;span &gt;SPSite&lt;/span&gt; 构造函数（任何签名），都应该在用完对象之后调用 &lt;span&gt;&lt;font color="#1364c4"&gt;Dispose&lt;span xmlns=""&gt;()&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; 方法。如果 &lt;span &gt;SPSite&lt;/span&gt; 对象是从 &lt;span &gt;GetContextSite&lt;span xmlns=""&gt;()&lt;/span&gt;&lt;/span&gt; 中获得的，则该调用应用程序&lt;em&gt;不&lt;/em&gt; 应该释放对象。因为 &lt;span &gt;SPWeb&lt;/span&gt; 和 &lt;span &gt;SPSite&lt;/span&gt; 对象会保留通过此方式派生的内部列表，所以释放对象可能会导致 SharePoint 对象模型行为无法预料。SharePoint Foundation 在页面完成之后会在内部枚举此列表以正确释放对象。&lt;/p&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;SPSiteCollection 类&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;h4 &gt;SPSiteCollection.Add 方法&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;span &gt;SPSiteCollection.Add&lt;/span&gt; 方法将创建并返回新的 &lt;span &gt;SPSite&lt;/span&gt; 对象。应该释放从 &lt;span &gt;SPSiteCollection.Add&lt;/span&gt; 方法中返回的任何 &lt;span &gt;SPSite&lt;/span&gt; 对象。 &lt;/p&gt;&#xD;
&lt;h4 &gt;不良的编码实践&lt;/strong&gt;&lt;/p&gt;void SPSiteCollectionAddLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWebApplication webApp = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSiteCollection siteCollections = webApp.Sites;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSite siteCollection = siteCollections.Add("sites/myNewSiteCollection", "DOMAIN\\User", &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&lt;a href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#115;&amp;#112;&amp;#105;&amp;#114;&amp;#105;&amp;#116;&amp;#64;&amp;#109;&amp;#115;&amp;#105;&amp;#119;&amp;#46;&amp;#110;&amp;#101;&amp;#116;"&gt;spirit@msiw.net&lt;/a&gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SPSite siteCollection leak.&lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;良好的编码实践&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;void SPSiteCollectionAddNoLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWebApplication webApp = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSiteCollection siteCollections = webApp.Sites;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = siteCollections.Add("sites/myNewSiteCollection", "DOMAIN\\User", &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&lt;a href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#115;&amp;#112;&amp;#105;&amp;#114;&amp;#105;&amp;#116;&amp;#64;&amp;#109;&amp;#115;&amp;#105;&amp;#119;&amp;#46;&amp;#110;&amp;#101;&amp;#116;"&gt;spirit@msiw.net&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPSite object siteCollection.Dispose() automatically called.&lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;SPSiteCollection [ ] 索引运算符&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;span &gt;SPSiteCollection []&lt;/span&gt; 索引运算符会针对每次访问返回一个新的 &lt;span &gt;SPSite&lt;/span&gt; 对象。将会创建 &lt;span &gt;SPSite&lt;/span&gt; 实例，即使已经访问了该对象也不例外。以下代码示例演示了 &lt;span &gt;SPSite&lt;/span&gt; 对象的不正确释放过程。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;不良的编码实践 #1&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;void SPSiteCollectionIndexerLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollectionOuter = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWebApplication webApp = siteCollectionOuter.WebApplication;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSiteCollection siteCollections = webApp.Sites;&lt;/p&gt;&#xD;
&lt;p&gt;SPSite siteCollectionInner = siteCollections[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SPSite siteCollectionInner leak. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPSite object siteCollectionOuter.Dispose() automatically called.&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;不良的编码实践 #2&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;em&gt;使用 &lt;span &gt;foreach&lt;/span&gt; 循环&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;void SPSiteCollectionForEachLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollectionOuter = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWebApplication webApp = siteCollectionOuter.WebApplication;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSiteCollection siteCollections = webApp.Sites;&lt;/p&gt;&#xD;
&lt;p&gt;foreach (SPSite siteCollectionInner in siteCollections)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SPSite siteCollectionInner leak.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPSite object siteCollectionOuter.Dispose() automatically called.&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;良好的编码实践 #1&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;em&gt;使用索引运算符&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;void SPSiteCollectionIndexerNoLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollectionOuter = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSite siteCollectionInner = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWebApplication webApp = siteCollectionOuter.WebApplication;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSiteCollection siteCollections = webApp.Sites;&lt;/p&gt;&#xD;
&lt;p&gt;siteCollectionInner = siteCollections[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (siteCollectionInner != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; siteCollectionInner.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPSite object siteCollectionOuter.Dispose() automatically called.&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;良好的编码实践 #2&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;em&gt;使用 &lt;span &gt;foreach&lt;/span&gt; 循环&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;void SPSiteCollectionForEachNoLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollectionOuter = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;&amp;#8221;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWebApplication webApp = siteCollectionOuter.WebApplication;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSiteCollection siteCollections = webApp.Sites;&lt;/p&gt;&#xD;
&lt;p&gt;foreach (SPSite siteCollectionInner in siteCollections)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(siteCollectionInner != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; siteCollectionInner.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPSite object siteCollectionOuter.Dispose() automatically called.&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;SPSite.AllWebs 属性 (SPWebCollection)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;h4 &gt;SPSite.AllWebs.Add 方法&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;span &gt;SPSite.AllWebs.Add&lt;/span&gt; 方法将创建并返回 &lt;span &gt;SPWeb&lt;/span&gt; 对象。应该释放从 &lt;span &gt;SPSite.AllWebs.Add&lt;/span&gt; 中返回的任何 &lt;span &gt;SPWeb&lt;/span&gt; 对象。 &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;不良的编码实践&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;void AllWebsAddLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWeb web = siteCollection.AllWebs.Add("site-relative URL");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SPWeb object leaked.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called. &lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;良好的编码实践&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;void AllWebsAddNoLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = siteCollection.AllWebs.Add("site-relative URL"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object web.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called. &lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;SPWebCollection.Add 方法&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;span &gt;SPWebCollection.Add&lt;/span&gt; 方法将创建并返回需要释放的 &lt;span &gt;SPWeb&lt;/span&gt; 对象。 &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;不良的编码实践&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;void SPWebCollectionAddLeak(string strWebUrl)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb outerWeb = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWebCollection webCollection = siteCollection.AllWebs; // No AllWebs leak just getting reference.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWeb innerWeb = webCollection.Add(strWebUrl);&amp;nbsp; // Must dispose innerWeb.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // innerWeb leak.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object outerWeb.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called. &lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;良好的编码实践&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;void SPWebCollectionAddNoLeak(string strWebUrl)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb outerWeb = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWebCollection webCollection = siteCollection.AllWebs; // No AllWebs leak just getting reference.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb innerWeb = webCollection.Add(strWebUrl))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object outerWeb.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called. &lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;SPSite.AllWebs [ ] 索引运算符&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;span &gt;SPSite.AllWebs []&lt;/span&gt; 索引运算符会在每次访问对象后返回一个新的 &lt;span &gt;SPWeb&lt;/span&gt; 实例。索引操作过程中将会创建对象，即使已经访问了该对象也不例外。如果未正确关闭，则以下代码示例会将 &lt;span &gt;SPWeb&lt;/span&gt; 对象保留在 .NET Framework 垃圾收集器中。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;不良的编码实践&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;void AllWebsForEachLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb outerWeb = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (SPWeb innerWeb in siteCollection.AllWebs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Explicitly dispose here to avoid out of memory leaks with large number of SPWeb objects.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object outerWeb.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called. &lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;良好的编码实践 #1&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;em&gt;使用 &lt;span &gt;foreach&lt;/span&gt; 循环&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;void AllWebsForEachNoLeakOrMemoryOOM()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb outerWeb = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (SPWeb innerWeb in siteCollection.AllWebs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(innerWeb != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; innerWeb.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object outerWeb.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called. &lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;良好的编码实践 #2&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;&lt;em&gt;使用索引运算符&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;void AllWebsIndexerNoLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = siteCollection.AllWebs[0])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object web.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called. &lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;SPSite.OpenWeb 和 SPSite. SelfServiceCreateSite 方法&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#1364c4"&gt;SPSite&lt;/font&gt; &lt;/span&gt;对象的 &lt;span&gt;&lt;font color="#1364c4"&gt;OpenWeb&lt;span xmlns=""&gt;()&lt;/span&gt;&lt;/font&gt;&lt;/span&gt; 方法和 &lt;span &gt;SelfServiceCreateSite&lt;/span&gt; 方法（所有签名）将创建 &lt;span &gt;SPWeb&lt;/span&gt; 对象并将其返回给调用方。此新对象未存储在 &lt;span &gt;SPSite&lt;/span&gt; 对象中，并且未在 &lt;span &gt;SPSite&lt;/span&gt; 类中的任何地方被释放。因此，应该释放通过这些方法创建的任何对象。&lt;/p&gt;&#xD;
&lt;h4 &gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;不良的编码实践&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;void OpenWebLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = new SPSite(SPContext.Current.Web.Url).OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SPSite leaked !&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object web.Dispose() automatically called.&lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h4 &gt;良好的编码实践&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;void OpenWebNoLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object web.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called.&lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;SPSite.RootWeb 属性&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;p&gt;前面的指导指明了调用应用程序释放 &lt;span &gt;SPSite.RootWeb&lt;/span&gt; 属性应该发生在即将释放使用该属性的 &lt;span &gt;SPSite&lt;/span&gt; 对象之前。这不再是正式的指导。释放清理是由 SharePoint Foundation 和 SharePoint Server 自动处理的。此外，&lt;span &gt;SPSite&lt;/span&gt; 属性 &lt;span &gt;LockIssue&lt;/span&gt;、&lt;span &gt;Owner&lt;/span&gt; 和 &lt;span &gt;SecondaryContact&lt;/span&gt; 在内部使用了 &lt;span &gt;RootWeb&lt;/span&gt; 属性。按照 &lt;span &gt;RootWeb&lt;/span&gt; 的更新的指导，每当使用其中的任意属性时对 &lt;span &gt;SPSite.RootWeb&lt;/span&gt; 属性调用 &lt;span &gt;Dispose&lt;/span&gt; 方法不再是可取的。&lt;/p&gt;&#xD;
&lt;h4 &gt;良好的编码实践&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;public void RootWebBestPractice()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // New SPSite.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWeb rootWeb1 = siteCollection.RootWeb;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // No explicit rootWeb1 dispose required.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // siteCollection automatically disposed by implementing using().&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // rootWeb1 will be Disposed by SPSite.&lt;/p&gt;&#xD;
&lt;p&gt;// SPContext and SPControl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWeb rootWeb2 = SPContext.Current.Site.RootWeb;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Also would apply to SPControl.GetContextSite(Context);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // No explicit rootWeb2 dispose required because it is obtained from SPContext.Current.Site.&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/shangmeizhai/aggbug/1951561.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951561.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951546.html</id><title type="text">SharePoint2010企业开发最佳实践（六）---- 用于确保释放对象的编码技术</title><summary type="text">可以采用某些编码技术来确保释放对象。这些技术包括在代码中使用以下内容： Dispose 方法using 语句try 、catch 和 finally 块Dispose 与 Close 方法的用途SPWeb 对象和 SPSite 对象的 Dispose 和 Close 方法作用相同。Dispose 方法调用对象的 Close 方法。我们建议调用 Dispose 方法，而不是调用 Close 方法，因为 SPWeb 和 SPSite 对象实现 IDisposable 接口，标准 .NET Framework 垃圾收集调用 Dispose 方法从内存中释放与对象关联的任何资源。using 语句通过使</summary><published>2011-02-11T09:51:00Z</published><updated>2011-02-11T09:51:00Z</updated><author><name>赏梅斋</name><uri>http://www.cnblogs.com/shangmeizhai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951546.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951546.html"/><content type="html">&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;可以采用某些编码技术来确保释放对象。这些技术包括在代码中使用以下内容： &lt;/p&gt;&#xD;
&lt;ul xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span &gt;Dispose&lt;/span&gt; 方法&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span &gt;using&lt;/span&gt; 语句&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;&lt;span &gt;try&lt;/span&gt; 、&lt;span &gt;catch&lt;/span&gt; 和 &lt;span &gt;finally&lt;/span&gt; 块&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;Dispose 与 Close 方法的用途&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font color="#1364c4"&gt;SPWeb&lt;/font&gt; &lt;/span&gt;对象和 &lt;span&gt;&lt;font color="#1364c4"&gt;SPSite&lt;/font&gt;&lt;/span&gt; 对象的 &lt;span &gt;Dispose&lt;/span&gt; 和 &lt;span &gt;Close&lt;/span&gt; 方法作用相同。&lt;span &gt;Dispose&lt;/span&gt; 方法调用对象的 &lt;span &gt;Close&lt;/span&gt; 方法。我们建议调用 &lt;span &gt;Dispose&lt;/span&gt; 方法，而不是调用 &lt;span &gt;Close&lt;/span&gt; 方法，因为 &lt;span &gt;SPWeb&lt;/span&gt; 和 &lt;span &gt;SPSite&lt;/span&gt; 对象实现 &lt;span &gt;IDisposable&lt;/span&gt; 接口，标准 .NET Framework 垃圾收集调用 &lt;span &gt;Dispose&lt;/span&gt; 方法从内存中释放与对象关联的任何资源。&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;using 语句&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;p&gt;通过使用 Microsoft Visual C# 和 Visual Basic &lt;span &gt;using&lt;/span&gt; 语句，可以自动释放实现 &lt;span &gt;IDisposable&lt;/span&gt; 接口的 SharePoint 对象。 &lt;/p&gt;&#xD;
&lt;p&gt;以下代码提供了示例。&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;String str;&lt;/p&gt;&#xD;
&lt;p&gt;using(SPSite oSPsite = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; using(SPWeb oSPWeb = oSPSite.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str = oSPWeb.Title;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str = oSPWeb.Url;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;利用 &lt;span &gt;using&lt;/span&gt; 语句可以大大简化代码。公共语言运行库会将 &lt;span &gt;using&lt;/span&gt; 语句转换为 try 和 finally 块，并且会为您释放实现 &lt;span &gt;IDisposable&lt;/span&gt; 接口的任何对象。但是，在许多情况下，&lt;span &gt;using&lt;/span&gt; 语句并不可取，或者必须慎用并要了解运行库所执行的操作。以下代码示例显示了一个不希望运行库为您构建 &lt;span &gt;finally&lt;/span&gt; 块和释放对象的情况。在此情况下，&lt;span &gt;SPContext&lt;/span&gt; 返回 &lt;span &gt;SPWeb&lt;/span&gt; 对象。&lt;/p&gt;&#xD;
&lt;p&gt;// Do not do this. Dispose() is automatically called on SPWeb. &lt;br /&gt;using( SPWeb web = SPControl.GetContextWeb(HttpContext.Current)) { ... }&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;SPContext&lt;/span&gt; 对象由 SharePoint 框架进行管理并且不应该在代码中明确释放。&lt;span &gt;SPContext.Site&lt;/span&gt;、&lt;span &gt;SPContext.Current.Site&lt;/span&gt;、&lt;span &gt;SPContext.Web&lt;/span&gt; 和 &lt;span &gt;SPContext.Current.Web&lt;/span&gt; 返回的 &lt;span &gt;SPSite&lt;/span&gt; 和 &lt;span &gt;SPWeb&lt;/span&gt; 对象也是如此。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;每当在同一行上合并 SharePoint 对象模型调用时，必须慎重并知道运行库所做的操作。这种情况引发的泄露最难找到。 &lt;/p&gt;&#xD;
&lt;p&gt;在以下代码示例中，&lt;span &gt;SPSite&lt;/span&gt; 对象会被实例化但不被释放，因为运行库会确保仅释放 &lt;span &gt;OpenWeb&lt;/span&gt; 返回的 &lt;span &gt;SPWeb&lt;/span&gt; 对象。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;void CombiningCallsLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = new SPSite(SPContext.Current.Web.Url).OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ... New SPSite will be leaked.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object web.Dispose() automatically called.&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过将一个 &lt;span &gt;using&lt;/span&gt; 语句嵌套在另一个语句中，可以解决此问题。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;void CombiningCallsBestPractice()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite(SPContext.Current.Web.Url))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Perform operations on site.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object web.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called.&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果不对 &lt;span &gt;SPSite&lt;/span&gt; 对象执行任何操作，则可以像在以下代码示例中那样更加简洁地编写此内容。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;void CombiningCallsBestPractice()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite(SPContext.Current.Web.Url))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Perform operations on site.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object web.Dispose() automatically called; SPSite object &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // siteCollection.Dispose() automatically called.&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在其他情况下，必须构建自己的 &lt;span &gt;try&lt;/span&gt;、&lt;span &gt;catch&lt;/span&gt; 和 &lt;span &gt;finally&lt;/span&gt; 块。需要处理异常并因此必须包括 &lt;span &gt;catch&lt;/span&gt; 块的情况就是最明显的示例。&lt;/p&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;try、catch 和 finally 块&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;p&gt;每当需要处理异常时，使用 &lt;span &gt;try&lt;/span&gt;、&lt;span &gt;catch&lt;/span&gt; 和 &lt;span &gt;finally&lt;/span&gt; 块显然是有意义的。&lt;span &gt;try/catch&lt;/span&gt; 块中的任何代码都应该具有 &lt;span &gt;finally&lt;/span&gt; 控制子句，这样可以确保释放实现 &lt;span &gt;IDisposable&lt;/span&gt; 的对象。请注意，在以下代码示例中，应该在 &lt;span &gt;catch&lt;/span&gt; 块中填充处理异常的代码。决不要将 &lt;span &gt;catch&lt;/span&gt; 块留空。另外请记下在释放之前测试 &lt;span &gt;null&lt;/span&gt; 的最佳实践。&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;String str;&lt;br /&gt;SPSite oSPSite = null;&lt;br /&gt;SPWeb oSPWeb = null;&lt;/p&gt;&#xD;
&lt;p&gt;try&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; oSPSite = new SPSite("&lt;a href="http://server/"&gt;http://server/&lt;/a&gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp; oSPWeb = oSPSite.OpenWeb(..);&lt;/p&gt;&#xD;
&lt;p&gt;str = oSPWeb.Title;&lt;br /&gt;}&lt;br /&gt;catch(Exception e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; // Handle exception, log exception, etc.&lt;br /&gt;}&lt;br /&gt;finally&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (oSPWeb != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oSPWeb.Dispose();&lt;/p&gt;&#xD;
&lt;p&gt;if (oSPSite != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oSPSite.Dispose();&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在 &lt;span &gt;foreach&lt;/span&gt; 块内创建可释放的对象时，为了避免潜在泄露，必需使用 &lt;span &gt;Try&lt;/span&gt; 和 &lt;span &gt;finally&lt;/span&gt; 块或 &lt;span &gt;using&lt;/span&gt; 语句，如以下代码示例中所示。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;public static void SPSiteCollectionForEachBestPractice()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string sUrl = "&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;";&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollectionOuter = new SPSite(sUrl))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPWebApplication webApp = siteCollectionOuter.WebApplication;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSiteCollection siteCollections = webApp.Sites;&lt;/p&gt;&#xD;
&lt;p&gt;SPSite siteCollectionInner = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (siteCollectionInner in siteCollections)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&amp;nbsp; // Should be first statement after foreach.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(siteCollectionInner.Url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Exception occurs here.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(siteCollectionInner != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; siteCollectionInner.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPSite object siteCollectionOuter.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;Response.Redirect 以及 try 块、catch 块、finally 块和 using 语句&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;p&gt;在 &lt;span &gt;try&lt;/span&gt; 块中调用 &lt;span &gt;Response.Redirect&lt;/span&gt; 之后，将会执行 &lt;span &gt;finally&lt;/span&gt; 块。&lt;span &gt;Response.Redirect&lt;/span&gt; 最终会生成 &lt;span&gt;&lt;font color="#1364c4"&gt;ThreadAbortException&lt;/font&gt;&lt;/span&gt; 异常。出现此异常时，运行库会执行所有 &lt;span &gt;finally&lt;/span&gt; 块，然后结束线程。但是，因为 &lt;span &gt;finally&lt;/span&gt; 块可能会执行无限制的计算或取消 &lt;span &gt;ThreadAbortException&lt;/span&gt;，所以该线程未必会结束。因此，必须先释放对象，然后才能重定向或传输处理。如果代码必须重定向，请按照与以下代码示例类似的方法来实现代码。&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;String str;&lt;br /&gt;SPSite oSPSite = null;&lt;br /&gt;SPWeb oSPWeb = null;&lt;/p&gt;&#xD;
&lt;p&gt;try&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; oSPSite = new SPSite("&lt;a href="http://www.msiw.netserver/"&gt;http://www.msiw.netserver/&lt;/a&gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp; oSPWeb = oSPSite.OpenWeb(..);&lt;/p&gt;&#xD;
&lt;p&gt;str = oSPWeb.Title;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if(bDoRedirection)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (oSPWeb != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oSPWeb.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (oSPSite != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oSPSite.Dispose();&lt;/p&gt;&#xD;
&lt;p&gt;Response.Redirect("newpage.aspx");&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;catch(Exception e)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;finally&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (oSPWeb != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oSPWeb.Dispose();&lt;/p&gt;&#xD;
&lt;p&gt;if (oSPSite != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oSPSite.Dispose();&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;因为 &lt;span &gt;using&lt;/span&gt; 语句会命令运行库创建 &lt;span &gt;finally&lt;/span&gt; 块，所以每当在 &lt;span &gt;using&lt;/span&gt; 语句内使用 &lt;span &gt;Response.Redirect&lt;/span&gt; 时，请确保正确释放对象。以下代码示例演示如何执行此操作。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;using (SPSite oSPSite = new SPSite("&lt;a href="http://server/"&gt;http://server/&lt;/a&gt;"))&lt;br /&gt;using (SPWeb oSPWeb = oSPSite.OpenWeb(..))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bDoRedirection)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Redirect("newpage.aspx");&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;h3  xmlns="http://www.w3.org/1999/xhtml"&gt;缩短长时间对象保留期的建议&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div  xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;p&gt;通过遵循以下常规建议，可以缩短 SharePoint 对象的长时间保留期。&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;如果用 &lt;span &gt;new&lt;/span&gt; 运算符创建对象，请确保用于创建的应用程序释放该对象。 &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;良好的编码实践 #1&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;明确释放&lt;/em&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;void CreatingSPSiteExplicitDisposeNoLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPSite siteCollection = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (siteCollection != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; siteCollection.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;良好的编码实践 #2&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;自动释放&lt;/em&gt; &lt;/p&gt;&#xD;
&lt;p&gt;CreatingSPSiteWithAutomaticDisposeNoLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPSite object siteCollection.Dispose() is called automatically.&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;释放由返回其他 &lt;span &gt;SPWeb&lt;/span&gt; 对象的 SharePoint 方法（如 &lt;span&gt;&lt;font color="#1364c4"&gt;OpenWeb&lt;span xmlns=""&gt;()&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;）所创建的项。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;良好的编码实践&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;void OpenWebNoLeak()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPSite siteCollection = new SPSite("&lt;a href="http://www.msiw.net/"&gt;http://www.msiw.net/&lt;/a&gt;"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SPWeb web = siteCollection.OpenWeb())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // SPWeb object web.Dispose() automatically called.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; // SPSite object siteCollection.Dispose() automatically called.&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;不要在线程之间共享任何 &lt;span &gt;SPRequest&lt;/span&gt; 对象（以及通过扩展共享任何包含对 &lt;span &gt;SPRequest&lt;/span&gt; 对象的引用的对象）。不支持以下性质的任何编码技术：在两个或更多个线程之间共享 &lt;span &gt;SPRequest&lt;/span&gt; 对象，或者在一个线程上创建 &lt;span &gt;SPRequest&lt;/span&gt; 对象而在另一个线程上释放该对象。这意味着，无法在静态变量中存储任何包含对 &lt;span &gt;SPRequest&lt;/span&gt; 对象的引用的对象。因此，不要将实现 &lt;span &gt;IDisposable&lt;/span&gt; 的 SharePoint 对象（例如 &lt;span &gt;SPWeb&lt;/span&gt; 或 &lt;span &gt;SPSite&lt;/span&gt;）存储在静态变量中。&lt;/p&gt;&lt;/li&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/shangmeizhai/aggbug/1951546.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shangmeizhai/archive/2011/02/11/1951546.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
