2008-10-20 71 views
2

我希望这里有一位SharePoint专家,可以帮助解决这个问题。正确处理SharePoint对象?

这是问题所在。我的SharePoint日志中包含此行,好几次:

An SPRequest object was not disposed before the end of this thread. To avoid wasting system resources, dispose of this object or its parent (such as an SPSite or SPWeb) as soon as you are done using it. This object will now be disposed. Allocation Id: {8D090AD2-5D55-42C2-9873-2D5486FE257C} To determine where this object was allocated, create a registry key at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\HeapSettings. Then create a new DWORD named SPRequestStackTrace with the value 1 under this key.

我编辑注册表并添加键,但堆栈跟踪是无处可寻。它不在SharePoint日志或事件查看器中。

我真的需要找到这些SPSite/SPWeb泄漏的来源并修复它们,但我不能只是开始编辑可能或不可能成为问题根源的代码。有没有人有什么建议?

+0

正在运行的WSS/MOSS的哪个版本。也许与SP1之前的版本运行是一个潜在的问题。 – 2008-10-20 16:58:37

+0

它是第三版,但我不确定它是否是SP1。 – 2008-10-20 18:51:55

回答

1

您需要重新启动受影响的进程(如果它是w3wp.exe的重新启动IIS)来捕捉注册表更改。

0
+0

谢谢。我读过前两篇文章 - 当然我知道需要处理的东西 - 但不是第三个。我的问题不是关于如何处置sharepoint对象,而是如何找到哪些对象没有被处置。 – 2008-10-20 14:34:03

+0

我也读过最后一个链接。这表明编辑注册表,我说这是不可能的。 – 2008-10-20 14:35:06

2

到目前为止,检查处理警告的最佳位置是:

http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx

在你的情况OpenWeb()将需要被裹在使用。如果你将它放置在你的密码块中,那么我会建议显示更多的代码来查看你是否正在调用任何其他“陷阱”实例。另外,如果从SPContext类中获取SPSite和SPWeb对象,则不需要处理它们。

如果您想跟踪可以继承它们的对象的处置并覆盖onload和ondispose方法以详细消息方式记录它们。

读取您的代码表明SPWeb对象是在RunWithElevatedPriviledges委托之外声明的。这可能会影响SharePoint处理它们的方式。通常建议您对委托内的对象执行所需的操作。

1

从先前提到的http://msdn.microsoft.com/en-us/library/aa973248.aspx链接:

调用的Response.Redirect将不执行finally块。因此,在任何重定向或处理转移发生之前,您必须处理对象的 。

鉴于你的示例代码,您仍有可能产生,因为Dispose()方法调用是在最后阻止没有得到处置的对象。

我的建议是重新配置您的代码如下:

try 
{ 
    //instantiate the SPSite and SPWeb with elevated privileges:  
    SPSecurity.RunWithElevatedPrivileges(delegate() 
    { 
     using (SPSite mySite = new SPSite(url)) 
     { 
      using (myWeb = mySite.OpenWeb()) 
      { 
       //do stuff here 
      } 
     } 
    }); 
} 

如果您在使用报表的多个层,可以“堆叠”他们这样,减少代码被缩进量(类似于如果要执行statment下一行或块的方式的):

try 
{ 
    //instantiate the SPSite and SPWeb with elevated privileges:  
    SPSecurity.RunWithElevatedPrivileges(delegate() 
    { 
     using (SPSite mySite = new SPSite(url)) 
     using (myWeb = mySite.OpenWeb()) 
     { 
      //do stuff here 
     } 
    }); 
}