我的物品在哪里处理?

时间:2008-10-14 14:54:49

标签: c# .net sharepoint

我有一个奇怪的问题:我在.aspx页面中使用SPContext.Current.Web,但最后,我得到一个“试图使用已经关闭或处置并且不再有效的SPWeb对象。 “错误信息。

从我看到的,SPContext.Current.Web由某人处置,但我不知道在哪里。我只是想知道:使用Visual Studio 2005的调试器,我能以某种方式看到哪个/谁处置了一个对象?由于我既没有创建也没有源代码,因此设置断点是一个问题。

找出谁将某个特定对象置于何处,而不是随意注释出来的线路,会有什么好方法?

(注意:问题已解决,但问题本身也适用于Sharepoint之外)

3 个答案:

答案 0 :(得分:6)

检查这是否有帮助:

  1. 使用调试>添加新断点新断点>在功能中断...(Ctrl + B)
  2. 在功能编辑框中输入 Microsoft.SharePoint.SPWeb.Dispose
  3. 关闭显示Intellisense无法找到指定位置的对话框。
  4. 在调试器下运行。
  5. 当断点被击中时,您可以在调用堆栈上看到调用Dispose方法的人。希望在某些时候断点被击中一个堆栈帧在源代码中。
  6. 如果出现一个对话框,说明当断点被点击时,当前位置没有可用的源代码,请将其解除。


    注意:因为我没有安装SharePoint,所以我使用System.IO.StreamReader.Dispose对此进行了测试,但我猜这也适用于SPContext.Current.Web。请记下这一点。

答案 1 :(得分:0)

在自定义代码中,确保没有获得对Context对象的实际SPWeb对象的引用并将其处理掉。例如,以下内容非常糟糕。

using (SPWeb myWeb = SPContext.Current.Web)
{
   // do something
}

这将导致处理SPContext的对象,并且可能不会导致代码出现问题,但可能会在以后引起问题。

答案 2 :(得分:-1)

您应该阅读:http://msdn.microsoft.com/en-us/library/aa973248.aspx

要快点:您应该使用

处理所有SPWeb和SPSite
using(SPWeb web = ...)
{
    ....
}

SPWeb web = ...
...
web.Dispose()