我一直在.NET 1.1 SharePoint 2003环境中使用以下代码,它工作得很好:
try
{
site = SPControl.GetContextSite(Context);
web = site.OpenWeb();
...
}
catch (Exception export)
{
output.Write("Caught Exception: <br/><br/>");
output.Write(export.Message + "<br><br>");
output.Write(export.StackTrace);
}
finally
{
if (web != null)
web.Dispose();
if (site != null)
site.Dispose();
}但是,我目前正在将代码移植到.NET 2.0 SharePoint 2007环境中,并收到以下错误消息:
“尝试使用已关闭或释放并不再有效的SPWeb对象。”
如果我注释掉Dispose()代码,它会工作得很好。但是这不会导致内存泄漏吗?解决这个问题的最好方法是什么?
发布于 2010-05-21 07:55:50
当您从GetContextSite获取SPSite对象时,您将获得一个与该页面上运行的其他对象共享的对象。
在您处理它之后,其他代码正在尝试使用它-因此出现了错误。
您应该只释放您自己创建的对象,而不是使用GetContextSite获得的对象。
快速解决方法是(正如Iambriansreed所说的)删除finally块,并将前两行替换为。
SPSite site = SPContext.Current.Site; // Do you even need this?
SPweb web = SPContext.Current.Web;更好的性能和无内存泄漏,因为SharePoint框架处理通过SPContext检索的对象的创建和处置。
然而,这是一个复杂且缺乏理解力的主题,因此通读Best Practices: Using Disposable Windows SharePoint Services Objects并使用SPDisposeCheck tool是必不可少的。
发布于 2010-05-21 04:16:11
在处理可释放对象时,尤其是在处理SharePoint时,使用using会更简单
using(SPSite site = new SPSite("..."))
using(SPWeb web = site.OpenWeb("..."))
{
}但是,请注意,您不应该处置来自当前上下文的元素-它们是共享的,处置它们可能会导致此错误。这是一个常见的错误,在我看来,API应该处理得更好。
另请参阅- Using Disposable Windows SharePoint Services Objects:
SPContext对象由SharePoint框架管理,不应在代码中显式处理。对于由SPContext.Site、SPContext.Current.Site、SPContext.Web和SPContext.Current.Web返回的SPSite和SPWeb对象也是如此。
发布于 2010-05-21 04:17:04
还有一种更好的方法来做上面的事情:
site = SPControl.GetContextSite(Context);
web = site.OpenWeb()如下所示:
SPSite site = SPContext.Current.Site;
SPweb web = SPContext.Current.Web;这里没有内存泄漏。说真的,要去2007年,而不是2010年?
https://stackoverflow.com/questions/2877429
复制相似问题