【问题标题】:How to update SPItemEventReceiver assembly version for a list in SharePoint?如何更新 SharePoint 中列表的 SPItemEventReceiver 程序集版本?
【发布时间】:2014-02-02 11:34:51
【问题描述】:

我们有一个 SPItemEventReceiver 编译到它自己的程序集中。

我们正在使用 STSDev 将 SharePoint 解决方案与此 EventReceiver 打包为一项功能。我没有将 SPItemEventReceiver 分配给 elements.xml 中的特定 ListTemplateId,而是在 feature.xml 中链接一个 ReceiverAssembly 并以编程方式将 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 版本号。

更改解决方案版本对我有帮助吗?

我认为这3个选项有问题:

  1. 停用该功能后,有人可以在我做出反应之前更新项目。

  2. 我不想手动编辑 web.config,所以我会改用 sharepoint API。我将在哪里运行该代码?

  3. 这完全是错误的,但很容易。

【问题讨论】:

    标签: sharepoint event-receiver


    【解决方案1】:

    也许您可以将易于更改的逻辑封装到一个单独的程序集中,由您的事件处理程序引用和使用。这样,事件处理程序本身就不必更改,您只需将更新的“逻辑”程序集适当地部署到 GAC 或 bin 目录。

    HTH, jt

    【讨论】:

    • 感谢您的建议。我会看看这是否可以做到,但我不负责开发程序集,只负责部署和集成。
    【解决方案2】:

    我不确定您想要升级什么,是要将新事件处理程序应用于旧列表还是仅用于新列表。

    对于仅升级新列表,您可以将程序集信息放在单独的文件中,在 FeatureActivated 方法中读取该文件,然后应用新值。升级时,您只需更新单独的配置文件,任何新的激活都将使用新的值和版本号。

    如果您需要升级旧的事件处理程序,您可以执行类似的过程,但在删除旧的功能接收器之前添加新的功能接收器。如果您以相同的方法执行此操作,则添加新处理程序和删除旧处理程序之间的时间将最短,并且任何人在该确切时间添加项目的机会接近于零。如果您想一直归零,您可以隐藏列表或使用额外的 ItemUpdated 事件处理程序来检查是否正在进行升级,如果是则停止更新。

    所以,简而言之: 对于新列表,从外部文件中读取程序集配置 对于旧列表,请在删除旧处理程序之前添加升级的程序集信息。

    .b

    【讨论】:

    • Bjorn,所有现有列表以及所有新列表都应使用相同的事件处理程序。
    • 在这种情况下,您的任务更简单。如前所述,只需让功能激活接收器从单独的文件中读取配置,然后在删除旧接收器之前添加新接收器。如果您愿意,我可以在 1 月 1 日之后发表一篇文章,介绍如何做到这一点。
    【解决方案3】:

    我仅在需要执行程序集的(旧的和新的)版本时才使用程序集版本控制。我在事件接收器上从来不需要这个。因此,我不会更改事件接收器的程序集版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 2011-05-08
      相关资源
      最近更新 更多