我用过类似的东西

 using (SPWeb web = SPControl.GetContextWeb(Context))

但是,在部署项目时会显示错误。在试图找出原因时,我遇到了一篇MSDN文章:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.spcontrol.getContextweb.aspx

哪个说明:

请勿使用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在 SPSiteSPWeb 对象进行数据库调用。如果对象未正确处理,您最终将用尽内存,因为.NET中的垃圾收集器无法自动释放“外部”(TO .NET)对象。

在您的情况下,您应该 不是 使用 using 语句因为它将自动处置对象。在编译器中像这样扩展了使用语句

using (SPWeb web = SPControl.GetContextWeb(Context)) {
    ...
}

为此:

try (SPWeb web = SPControl.GetContextWeb(Context)) {
    ...
}
finally {
    web.Dispose();
}

我也随着SharePoint开发的速度加快了 以身作用 成为这个主题的很好的参考。希望这对您有所帮助。

如果您是否怀疑您是否正确处理处置,Microsoft有 SpdisPosecheck工具 可以为您检查。您可以直接从Visual Studio手动运行此此操作,甚至可以将其集成到构建服务器上的验证中。

许可以下: CC-BY-SA归因
scroll top