题
我用过类似的东西
using (SPWeb web = SPControl.GetContextWeb(Context))
但是,在部署项目时会显示错误。在试图找出原因时,我遇到了一篇MSDN文章:
哪个说明:
请勿使用SPWEB类的处置或关闭方法来关闭通过GetContextWeb方法返回的对象。而是让Windows SharePoint服务或您的门户应用程序管理对象。
我是SharePoint的新手,有人可以向我解释一下这背后的原因吗?
解决方案
如果您从上下文中获得SPWEB,则它是在其他地方创建的,其他地方将为您销毁它。
如果您为时过早销毁(处置),当页面出售该页面时,它很可能会感到恐慌,并且用于生成页面的一些数据可能会丢失。
经验法则 - 如果您使用spsite.openweb()或以其他方式使用新的spweb(),则必须自己处置它(或包含在使用语句中)。这同样适用于通过SPWebCollection检索的网(例如Spweb.webs,spsite.allwebs或spweb.getsubwebsubwebsforcurrentuser())。
其他提示
这 Dispose()
方法如果是 IDisposal
接口是一个指定接口,当对象锁定重量且昂贵的资源时使用。例如,当您获得与数据库的连接时。处置方法在那里告诉对象我已经完成了连接(在SQL情况下),并且您现在可以将其关闭并让其他人使用资源。在.NET中,所有内容都是用托管代码编写的,并自动收集了垃圾,而SQL Connections和com+对象不会自动释放。
在SharePoint的情况下,(多年来)就何时以及如何处置对象进行了讨论。詹姆斯用经验法则很好地解释了这一点。您需要在某些情况下需要调用处置的原因是SharePoint在 SPSite
和 SPWeb
对象进行数据库调用。如果对象未正确处理,您最终将用尽内存,因为.NET中的垃圾收集器无法自动释放“外部”(TO .NET)对象。
在您的情况下,您应该 不是 使用 using
语句因为它将自动处置对象。在编译器中像这样扩展了使用语句
using (SPWeb web = SPControl.GetContextWeb(Context)) {
...
}
为此:
try (SPWeb web = SPControl.GetContextWeb(Context)) {
...
}
finally {
web.Dispose();
}
我也随着SharePoint开发的速度加快了 以身作用 成为这个主题的很好的参考。希望这对您有所帮助。
如果您是否怀疑您是否正确处理处置,Microsoft有 SpdisPosecheck工具 可以为您检查。您可以直接从Visual Studio手动运行此此操作,甚至可以将其集成到构建服务器上的验证中。