2008-10-20 70 views
2

我希望這裏有一位SharePoint專家,可以幫助解決這個問題。正確處理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泄漏的來源並修復它們,但我不能只是開始編輯可能或不可能成爲問題根源的代碼。有沒有人有什麼建議?

+0

正在運行的WSS/MOSS的哪個版本。也許與SP1之前的版本運行是一個潛在的問題。 – 2008-10-20 16:58:37

+0

它是第三版,但我不確定它是否是SP1。 – 2008-10-20 18:51:55

回答

1

您需要重新啓動受影響的進程(如果它是w3wp.exe的重新啓動IIS)來捕捉註冊表更改。

0
+0

謝謝。我讀過前兩篇文章 - 當然我知道需要處理的東西 - 但不是第三個。我的問題不是關於如何處置sharepoint對象,而是如何找到哪些對象沒有被處置。 – 2008-10-20 14:34:03

+0

我也讀過最後一個鏈接。這表明編輯註冊表,我說這是不可能的。 – 2008-10-20 14:35:06

2

到目前爲止,檢查處理警告的最佳位置是:

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

在你的情況OpenWeb()將需要被裹在使用。如果你將它放置在你的密碼塊中,那麼我會建議顯示更多的代碼來查看你是否正在調用任何其他「陷阱」實例。另外,如果從SPContext類中獲取SPSite和SPWeb對象,則不需要處理它們。

如果您想跟蹤可以繼承它們的對象的處置並覆蓋onload和ondispose方法以詳細消息方式記錄它們。

讀取您的代碼表明SPWeb對象是在RunWithElevatedPriviledges委託之外聲明的。這可能會影響SharePoint處理它們的方式。通常建議您對委託內的對象執行所需的操作。

1

從先前提到的http://msdn.microsoft.com/en-us/library/aa973248.aspx鏈接:

調用的Response.Redirect將不執行finally塊。因此,在任何重定向或處理轉移發生之前,您必須處理對象的 。

鑑於你的示例代碼,您仍有可能產生,因爲Dispose()方法調用是在最後阻止沒有得到處置的對象。

我的建議是重新配置您的代碼如下:

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

如果您在使用報表的多個層,可以「堆疊」他們這樣,減少代碼被縮進量(類似於如果要執行statment下一行或塊的方式的):

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