Ошибка при регистрации приемника событий 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...
            }
        }
    }
});

Я понимаю, что могу сделать это с помощью файла feature element (сейчас я пробую этот подход), но предпочел бы использовать описанный выше подход.

Ошибки, которые я постоянно получаю в журналах 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 services OWSTimer (я полагаю, это запускает обработчик событий, но, вероятно, не участвует в регистрации событий, где я получаю ошибку), и даже перезагрузку, чтобы убедиться, что кэширование сборки не выполняется - и это не помогло раньше.

Единственное, что мне нужно сделать, это, возможно, выполнить следующие шаги, такие как:

  1. Очистите GAC сборки, которая содержит регистрационный код и класс обработчика событий.
  2. Выполните IISRESET.
  3. Удалите WSP.
  4. Выполните IISRESET.
  5. Установите WSP.
  6. Выполните IISRESET.

Чтобы заставить его работать, я никогда не делал перезагрузку или перезапускал SharePoint services, но я делал это до того, как он заработал (до изменения моего кода).

Я полагаю, я мог бы покопаться больше с помощью Reflector, чтобы посмотреть, что я смогу найти, но я полагаю, что вы довольно быстро заходите в тупик (неуправляемый код).Интересно, что могло бы храниться в старой библиотеке DLL?Я не могу представить, что SQL Server будет каким-то образом.Тем не менее, перезагрузка исправила бы это (вся ферма, включая 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