Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SharePoint中更新列表的SPItemEventReceiver程序集版本?_Sharepoint_Event Receiver - Fatal编程技术网

如何在SharePoint中更新列表的SPItemEventReceiver程序集版本?

如何在SharePoint中更新列表的SPItemEventReceiver程序集版本?,sharepoint,event-receiver,Sharepoint,Event Receiver,我们有一个SPItemEventReceiver编译成它自己的组件 我们正在使用STSDev将此EventReceiver作为功能打包为SharePoint解决方案。我不是将SPItemEventReceiver分配给elements.xml中的特定ListTemplateId,而是链接feature.xml和programmaticaly中的ReceiverAssembly将SPItemEventReceiver分配给多个SPList项 public override void Fea

我们有一个SPItemEventReceiver编译成它自己的组件

我们正在使用STSDev将此EventReceiver作为功能打包为SharePoint解决方案。我不是将SPItemEventReceiver分配给elements.xml中的特定ListTemplateId,而是链接feature.xml和programmaticaly中的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

问题:

我应该如何处理更新LabReportEventHandler并更改版本的未来事件

以下是我能想到的选项:

  • 停用/重新激活功能——我会将更新的dll包装回SharePoint解决方案文件中,更改上面的代码以反映新版本,并使用stsadmin升级解决方案。然后我将停用/重新激活该功能

  • 将程序集重定向添加到web.config

  • 不要碰撞LabReportEventHandlers版本号

  • 更改解决方案版本是否对我有所帮助

    我认为这3个选项存在问题:

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

  • 我不想手工编辑web.config,所以我会使用sharepoint API。我将在哪里运行该代码

  • 这显然是错误的,但很容易


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

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

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

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


    .b

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

    嗯,,
    jt

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

    谢谢您的建议。我会看看是否可以做到这一点,但我不负责开发程序集,只负责部署和集成。Bjorn,所有现有列表以及所有新列表都应该使用相同的EventHandler。在这种情况下,您有一个更简单的任务。如前所述,只需让featureactivated receiver从单独的文件中读取配置,然后在删除旧接收器之前添加新接收器。如果你愿意的话,我可以在1月1日之后就如何做到这一点发表一篇文章。