Как обновить версию сборки SPItemEventReceiver для списка в SharePoint?

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

  •  23-08-2019
  •  | 
  •  

Вопрос

У нас есть SPItemEventReceiver, скомпилированный в свою собственную сборку.

Мы используем STSDev для упаковки решения SharePoint с этим EventReceiver в качестве функции.Я не присваиваю SPItemEventReceiver определенному ListTemplateId в пределах elements.xml , но вместо этого связываю ReceiverAssembly в feature.xml и программно назначать SPItemEventReceiver нескольким элементам SPList.

    public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {
        foreach (SPWeb web in site.AllWebs)
        {
            SPListCollection webListCollection = web.Lists;

            foreach (SPList myList in webListCollection)
            {
                if (myList.Title == "Lab Reports")
                {
                    SPEventReceiverDefinitionCollection receivers = myList.EventReceivers;
                    SPEventReceiverDefinition receiver = receivers.Add();
                    receiver.Name = "PostUpdateLabReport";
                    receiver.Assembly = "LabReportEventHandlers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1111111111111";
                    receiver.Class = "LabReportEventHandlers.LabReportsHandler";
                    receiver.Type = SPEventReceiverType.ItemUpdated;
                    receiver.Update();
                    break;
                }
            }

            web.Dispose();
        }
    }

Я использую FeatureDeactivating, чтобы выполнить обратное приведенному выше коду удаление EventReceiver из списков.

Вопрос:

Как я должен обработать будущее событие, в котором LabReportEventHandlers обновляется и изменяется версия?

Это те варианты, о которых я могу подумать:

  1. Деактивировать / повторно активировать функцию - я бы вернул обновленную библиотеку dll обратно в файл решения SharePoint, изменил свой приведенный выше код, чтобы отразить новую версию, и использовал stsadmin для обновления решения.Затем я бы деактивировал / повторно активировал эту функцию.

  2. Добавьте перенаправление сборки в web.config.

  3. Не указывайте номер версии LabReportEventHandlers.

Есть ли что-то в изменении версии решения, что поможет мне?

Я думаю, что есть проблемы с тремя вариантами:

  1. После деактивации этой функции кто-то может обновить элемент до того, как я смогу повторно активировать.

  2. Я бы не хотел редактировать web.config вручную, поэтому вместо этого я бы использовал sharepoint API.Где бы я запустил этот код?

  3. Это просто неправильно, но легко.

Это было полезно?

Решение

Возможно, вы сможете инкапсулировать логику, которая подвержена изменениям, в отдельную сборку, на которую ссылается и использует ваш обработчик событий.Таким образом, сам обработчик события меняться не будет, вам нужно будет только соответствующим образом развернуть обновленную сборку "logic" в каталоге (каталогах) GAC или bin.

HTH, джей Ти

Другие советы

Я не уверен, чего вы хотите от обновления, хотите ли вы, чтобы новый обработчик событий применялся к старым спискам или только к новым спискам.

Для обновления только новых списков вы могли бы поместить информацию о сборке в отдельный файл, прочитать этот файл в вашем методе FeatureActivated и применить новые значения.При обновлении все, что вам нужно сделать, это обновить отдельный конфигурационный файл, и при любой новой активации будут использоваться новые значения и номера версий.

Если вам нужно обновить старые обработчики событий, вы могли бы выполнить аналогичную процедуру, но добавить новый приемник функций перед удалением старого.Если вы сделаете это тем же методом, время между добавлением нового обработчика и удалением старого будет минимальным, а вероятность того, что кто-либо добавит элемент именно в это время, близка к нулю.Если вы хотите пройти весь путь до нуля, вы можете скрыть список или использовать дополнительный обработчик событий ItemUpdated, который проверяет, выполняется ли обновление, и если да, то останавливает обновление.

Итак, вкратце:Для новых списков прочитайте конфигурацию сборки из внешнего файла Для старых списков добавьте обновленную информацию о сборке непосредственно перед удалением старого обработчика.

Я использую управление версиями сборки только в том случае, если есть необходимость в выполнении обеих (старой и новой) версий сборки.Мне никогда не требовалось это на приемнике событий.Поэтому я не меняю версию сборки для получателей событий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top