2

我希望这里有一个关于 SO 的 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 泄漏的来源并修复它们,但我不能只是开始编辑可能是也可能不是问题根源的代码。有没有人有什么建议?

4

4 回答 4

2

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

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

在您的情况下, OpenWeb() 将需要包装在 using 中。如果您将它放在您的 fianlly 块中,那么我建议您显示更多代码以查看您是否正在调用任何其他“gotcha”实例。此外,如果某些 SPSite 和 SPWeb 对象是从 SPContext 类中获得的,则无需处置它们。

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

阅读您的代码表明 SPWeb 对象是在 RunWithElevatedPriviledges 委托之外声明的。这可能会影响 SharePoint 处理它们的方式。一般建议对委托内的对象做你需要做的事情。

于 2008-10-20T16:04:50.527 回答
1

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

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

鉴于您的示例代码,您仍然可以生成不会被释放的对象,因为 Dispose() 调用位于 finally 块中。

我的建议是将您的代码重新配置为以下内容:

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
            }
        }
    });
}

如果您有多层 Using 语句,您可以像这样“堆叠”它们并减少代码缩进的数量(类似于 if 语句执行下一行或块的方式):

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
        }
    });
}
于 2008-10-20T17:06:24.600 回答
1

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

于 2008-10-22T13:37:23.693 回答
0

我建议您阅读以下内容:

如果这些建议都不起作用。查看WSS v3 和 MOSS 2007 中的 SPSite/SPWeb 泄漏故障排除

编辑:您应该处置 SPSite 对象。因为它会自动处理他所有的 SPWeb 对象

于 2008-10-20T14:30:14.057 回答