سؤال

آمل أن يكون هناك خبير 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) للقبض على التغيير التسجيل.

نصائح أخرى

إلى حد بعيد أفضل موقع للتحقق من تحذيرات التخلص هو:

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

في حالتك، يجب أن يتم تغليف 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
        }
    });
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top