التخلص السليم من كائنات SharePoint؟
-
03-07-2019 - |
سؤال
آمل أن يكون هناك خبير SharePoint هنا في SO يمكنه المساعدة في هذا الأمر.
ها هي المشكلة.تحتوي سجلات 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 وإصلاحها، لكن لا يمكنني البدء في تحرير التعليمات البرمجية التي قد تكون أو لا تكون مصدر المشكلة.هل يوجد لدى احد أي اقتراحات؟
المحلول
وتحتاج إلى إعادة تشغيل العمليات المتأثرة (إذا كان w3wp.exe إعادة تشغيل IIS) للقبض على التغيير التسجيل.
نصائح أخرى
إلى حد بعيد أفضل موقع للتحقق من تحذيرات التخلص هو:
في حالتك، يجب أن يتم تغليف OpenWeb() في ملف use.إذا كنت تتخلص منه في الكتلة الخاصة بك، فإنني أقترح إظهار المزيد من التعليمات البرمجية لمعرفة ما إذا كنت تتصل بأي مثيلات "مسكتك" أخرى.كما أنه من غير الضروري التخلص من بعض كائنات SPSite وSPWeb إذا تم الحصول عليها من فئة SPContext.
إذا كنت تريد تتبع عمليات التخلص من الكائن، فيمكنك وراثتها وتجاوز طريقتي onload وondispose لتسجيلها بطريقة مراسلة مطولة.
تشير قراءة التعليمات البرمجية الخاصة بك إلى أنه تم تعريف كائن SPWeb خارج مفوض RunWithElevatedPriviledges.وقد يكون لذلك تأثير على الطريقة التي يتخلص بها SharePoint منها.يُقترح عمومًا أن تفعل ما عليك فعله بالكائن الموجود داخل المفوض.
من http://msdn.microsoft.com/en-us/library/aa973248.aspx الرابط الذي تم ذكره سابقا :
الاتصال لن يقوم Response.Redirect بتنفيذ الكتلة النهائية.لذلك ، قبل حدوث أي إعادة توجيه أو نقل للمعالجة ، يجب التخلص من الكائنات.
بالنظر إلى رمز المثال الخاص بك، لا يزال بإمكانك إنشاء كائنات لا يتم التخلص منها لأن استدعاء 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
}
}
});
}
إذا كان لديك طبقات متعددة من عبارات الاستخدام، فيمكنك "تكديسها" بهذه الطريقة وتقليل مقدار المسافة البادئة للكود (على غرار الطريقة التي تنفذ بها عبارة if السطر أو الكتلة التالية):
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
}
});
}
أقترح عليك أن تأخذ قراءة على:
MSDN : أفضل الممارسات:مشكلات الترميز الشائعة عند استخدام نموذج كائن SharePointMSDN : أفضل الممارسات:استخدام كائنات Windows SharePoint Services التي يمكن التخلص منهاكريس أوبراين : التخلص من كائنات SharePoint - ما لا يخبرك به
إذا لم تنجح أي من هذه النصائح.نلقي نظرة على استكشاف أخطاء تسرب SPSite/SPWeb وإصلاحها في WSS v3 وMOSS 2007.
يحرر :يجب عليك التخلص من كائن SPSite.منذ ذلك الحين التخلص من كافة كائنات SPWeb الخاصة به تلقائيًا.