Ошибка регистрации приемника событий SharePoint WebDeleting в некоторых средах - PullRequest
0 голосов
/ 12 марта 2010

Я пытаюсь зарегистрировать приемник событий 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.

Таким образом, ответ очевиден: это проблема кеширования. Однако, когда я первоначально пытался заставить его работать, я попробовал IISRESET, перезапустив некоторые службы SharePoint OWSTimer (это, я думаю, запускает обработчик событий, но, вероятно, не участвует в регистрации событий, где я получаю ошибку), и даже перезагрузка, чтобы убедиться, что кэширование сборок не происходит - и это не помогло раньше.

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

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

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

Полагаю, я мог бы больше покопаться в Reflector, чтобы увидеть, что я могу найти, но я верю, что вы довольно быстро зашли в тупик (неуправляемый код). Интересно, что может держаться за старую DLL? Я не могу представить, что SQL Server будет каким-то образом. Несмотря на это, перезагрузка исправила бы это (вся ферма, включая SQL Server, находится на одном компьютере в этой среде).

1 Ответ

0 голосов
/ 17 марта 2010

Итак, похоже, что вся проблема заключалась в создании приемника событий путем предоставления 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, rebots и т. Д.), Поэтому, если у кого-то еще есть эта проблема, имейте это в виду.

...