خطأ في تسجيل مستقبل أحداث SharePoint WebDeleting في بعض البيئات

StackOverflow https://stackoverflow.com/questions/2429159

  •  19-09-2019
  •  | 
  •  

سؤال

أحاول تسجيل جهاز استقبال حدث WebDeleting داخل SharePoint. هذا يعمل بشكل جيد في بيئة التطوير الخاصة بي، ولكن ليس في العديد من بيئات التدريج. الخطأ الذي أعيده هو "القيمة لا تقع ضمن النطاق المتوقع". هنا هو الرمز الذي أستخدمه:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite elevatedSite = new SPSite(web.Site.ID))
    {
        using (SPWeb elevatedWeb = elevatedSite.OpenWeb(web.ID))
        {
            try
            {
                elevatedWeb.AllowUnsafeUpdates = true;
                SPEventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add(new Guid(MyEventReciverId));
                eventReceiver.Type = SPEventReceiverType.WebDeleting;
                Type eventReceiverType = typeof(MyEventHandler);
                eventReceiver.Assembly = eventReceiverType.Assembly.FullName;
                eventReceiver.Class = eventReceiverType.FullName;
                eventReceiver.Update();
                elevatedWeb.AllowUnsafeUpdates = false;
            }
            catch (Exception ex)
            {
                // Do stuff...
            }
        }
    }
});

أدرك أنه يمكنني القيام بذلك من خلال ملف عنصر ميزة (أحاول هذا النهج الآن)، لكنه يفضل استخدام النهج أعلاه.

الأخطاء التي أحصل عليها باستمرار في سجلات ULS هي:

03/11/2010 17:16:57.34  w3wp.exe (0x09FC)                           0x0A88  Windows SharePoint Services     Database                        6f8g    Unexpected  Unexpected query execution failure, error code 3621. Additional error information from SQL Server is included below. "The statement has been terminated." Query text (if available): "{?=call proc_InsertEventReceiver(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"  
03/11/2010 17:16:57.34  w3wp.exe (0x09FC)                           0x0A88  Windows SharePoint Services     General                         8e2s    Medium      Unknown SPRequest error occurred. More information: 0x80070057   

أيه أفكار؟


تحديث - بعض الأشياء المثيرة للاهتمام تعلمت ...

قمت بتعديل التعليمات البرمجية الخاصة بي للقيام بما يلي:

  • أسمي EventReceivers.Add () بدون GUID لأن معظم الأمثلة التي أرى لا تفعل ذلك
  • أعطى مستقبل الحدث اسم رقم وتسلسل لأن معظم الأمثلة التي أرى القيام بذلك

لقد قمت بنشر هذا التغيير جنبا إلى جنب مع بعض البيانات النزرة الإضافية التي تذهب إلى سجلات ULS وبعد القيام بما يكفي من IISRESETS وتطهير GAC التجميعي، بدأت في رؤية بيانات النزاه الجديدة الخاصة بي في سجلات ULS و لم أعد حصلت على الخطأ!

لذلك، بدأت في العودة إلى التعليمات البرمجية الأصلية لمعرفة ما هو التغيير الذي ساعد بالضبط. انتهى أخيرا بالنسخة الأصلية في مراقبة المصدر وما زالت عملت: -s.

وبالتالي فإن الإجابة بوضوح أنها بعض مشكلة التخزين المؤقت. ومع ذلك، عندما كنت أحاول في الأصل الحصول عليها للعمل الذي جربته IISRESETS، أعد تشغيل بعض خدمات SharePoint Owstimer (هذا، وأعتقد أنه يدير مهندس الحدث، ولكن ربما لا يشارك في تسجيل الحدث حيث أحصل على الخطأ)، و حتى إعادة التشغيل للتأكد من عدم وجود تخزين مؤقت التجمع يحدث - وهذا لم يساعد من قبل.

الشيء الوحيد الذي يجب أن أذهب إليه هو ربما اتباع خطوات مثل:

  1. امسح GAC للتجميع الذي يحتوي على رمز التسجيل وفئة Hander الحدث.
  2. هل iisreset.
  3. إلغاء تثبيت WSP.
  4. هل iisreset.
  5. تثبيت WSP.
  6. هل iisreset.

للحصول عليه في العمل، لم أفعل أبدا إعادة تشغيل أو إعادة تشغيل خدمات SharePoint، لكنني قمت بذلك قبل الحصول على عملها (قبل تغيير الرمز الخاص بي).

أفترض أنني أستطيع حفر المزيد مع العاكس لمعرفة ما يمكنني العثور عليه، لكنني أعتقد أنك تحصل على نهاية مسدود (رمز غير مدار) سريع جدا. أتساءل ماذا يمكن أن تمسك DLL القديم؟ لا أستطيع أن أتخيل أن خادم SQL سيكون بطريقة ما. ومع ذلك، فإن إعادة التشغيل قد تم إصلاح ذلك (المزرعة بأكملها، بما في ذلك SQL Server على نفس الجهاز في هذه البيئة).

هل كانت مفيدة؟

المحلول

لذلك، يبدو أن المشكلة بأكملها كانت تخلق جهاز استقبال الحدث من خلال توفير GUID.

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add(new Guid(MyEventReciverId));

الآن أنا أفعل:

EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add();

لسوء الحظ، هذا يعني عندما أريد معرفة ما إذا كان الحدث مسجل بالفعل، يجب أن أفعل شيئا مثل الرمز أدناه بدلا من بطانة واحدة واحدة.

// Had to use the below instead of: web.EventReceivers[new Guid(MyEventReceiverId)]
private SPEventReceiverDefinition GetWebDeletingEventReceiver(SPWeb web)
{
    Type eventReceiverType = typeof(MyEventHandler);
    string eventReceiverAssembly = eventReceiverType.Assembly.FullName;
    string eventReceiverClass = eventReceiverType.FullName;

    SPEventReceiverDefinition eventReceiver = null;

    foreach (SPEventReceiverDefinition eventReceiverIter in web.EventReceivers)
    {
        if (eventReceiverIter.Type == SPEventReceiverType.WebDeleting)
        {
            if (eventReceiverIter.Assembly == eventReceiverAssembly && eventReceiverIter.Class == eventReceiverClass)
            {
                eventReceiver = eventReceiverIter;
                break;
            }
        }
    }

    return eventReceiver;
}

لا يزال غير واضح سبب ظهور الأمور وتتطلب بعض التنظيف (IISRESET، إعادة التشغيل، إلخ)، لذلك إذا كان أي شخص آخر لديه هذه المشكلة في الاعتبار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top