更新时间:06/08/2009 15:52:简短回答原始问题:

我找不到任何在SPWeb.Site上提供有关处置指南的参考。我已经阅读了一些有关处置SharePoint对象的更流行的最佳实践文档:


http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects
http://msdn.microsoft.com/en-us/library/aa973248.aspx
http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx


不幸的是,这些准则都没有提到SPWeb.Site。为了提供一些背景信息,我正在编写一个公共扩展API,该API接受SPWeb作为方法的参数,即:

public static void GetWebPartFromCatalog(this SPWeb web, string webPartName)
{
     ......

     SPSite site = web.Site;
     ......

     **OR** ??

     using (SPSite site = web.Site)
     {
         ....
     }
}


我已经看过SPWeb的refelector中的Close()方法,该方法由SPWeb.Dispose()调用,并且其中没有任何内容指示已丢弃实际的SPSite成员字段。

更新:2009年6月8日13:47

Alex's建议


“将其放入运行100次的循环中,并使用WSS v3和MOSS 2007中的SPSite / SPWeb泄漏疑难解答中描述的SPRequestStackTrace注册表项,以检查问题的根源。”


我运行了Webpart中包含的以下代码:

 for (int i = 0; i < 100; i++)
 {
     using (SPWeb web = SPContext.Current.Site.OpenWeb(""))
     {
            SPSite site = web.Site;
            Debug.WriteLine(site.Url);
     }
 }


SharePoint日志中未显示任何内容。

尽管我会毫不犹豫地从这个幼稚的实验中得出任何真实的结论,但它表明不需要处置SPWeb.Site。从对此事有更多了解的人那里得到具体答案,真是太好了。

更新:2009年6月8日14:52
在Greg的注释的提示下,我确定了m_Site的分配,并且看起来它最终总是通过内部构造函数传递给SPWeb的。例如。 SPWeb.OpenWeb将其传递给新的SPWeb()。因此,我更确定不应该处置SPWeb.Site,否则确实可能会引起问题。

最佳答案

Kirk's answer是正确的。在创建SPWeb之前,必须对SPSite有一定的了解,并且这与调用SPWeb.Site时将具有的SPSite实例相同。

让我们仔细考虑一下它的含义-如果您不控制SPSite的创建,但是从外部代码将SPSite的其中一个子站点移交给您,并且您处置了该站点,则当控制权返回到调用代码时,您将ve处置了他们可能无法完成的网站!让自己陷入调用代码的麻烦:将SPWeb传递到方法中,当该方法完成后,您正在使用的SPSite已关闭。清理人员分配的资源始终是其责任。在这种情况下,请勿丢弃SPSite。

关于sharepoint - SPWeb.Site,您应该在其上调用Dispose()吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1237862/

10-11 03:12