Я пытаюсь зарегистрировать приемник событий 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 (это, я думаю, запускает обработчик событий, но, вероятно, не участвует в регистрации событий, где я получаю ошибку), и даже перезагрузка, чтобы убедиться, что кэширование сборок не происходит - и это не помогло раньше.
Единственное, что мне нужно сделать, это, возможно, выполнить следующие шаги:
- Очистить GAC сборки, которая содержит регистрационный код и класс обработчика событий.
- Сделать IISRESET.
- Удалите WSP.
- Сделай IISRESET.
- Установите WSP.
- Сделай IISRESET.
Чтобы заставить его работать, я никогда не перезагружал и не перезапускал службы SharePoint, но я делал это до того, как он заработал (до изменения моего кода).
Полагаю, я мог бы больше покопаться в Reflector, чтобы увидеть, что я могу найти, но я верю, что вы довольно быстро зашли в тупик (неуправляемый код). Интересно, что может держаться за старую DLL? Я не могу представить, что SQL Server будет каким-то образом. Несмотря на это, перезагрузка исправила бы это (вся ферма, включая SQL Server, находится на одном компьютере в этой среде).