Share via


在 SharePoint Foundation 2010 中使用事件接收器(第 1 部分,共 2 部分)

**摘要:**利用 Microsoft SharePoint Foundation 2010 中的事件接收器,您的自定义代码可以在 SharePoint 对象上发生特定操作时响应。本文中的实践示例演示如何使用事件来增强 SharePoint 应用程序。

上次修改时间: 2015年3月9日

适用范围: Business Connectivity Services | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

本文内容
了解 SharePoint Foundation 2010 中事件的基本知识
处理 SharePoint Foundation 2010 中的事件
使用 Visual Studio 2010 中的事件接收器模板
其他资源

**供稿人:**Ali Badereddin,Microsoft Corporation | Nick Gattuccio,Microsoft Corporation

目录

  • 了解 SharePoint Foundation 2010 中事件的基本知识

  • 处理 SharePoint Foundation 2010 中的事件

  • 使用 Visual Studio 2010 中的事件接收器模板

  • 其他资源

了解 SharePoint Foundation 2010 中事件的基本知识

Microsoft SharePoint Foundation 2010 中的事件接收器 只是指定 SharePoint 对象上发生触发操作时调用的方法。触发操作包括添加、更新、删除、移动、签入和签出等操作。侦听事件的 SharePoint 对象(即事件接收器宿主)包含网站集、网站、列表和工作流等对象。

事件对于 SharePoint 开发人员来说是非常有价值的工具。当用户执行的某个操作影响 SharePoint 网站时,您可捕获该操作并使用自定义代码对其进行响应。例如,如果在新文档或文件添加到给定文档库时需要向项目经理发出通知,则可以编写事件接收器代码向项目经理发送电子邮件通知,然后将该代码绑定到文档库上的项目添加操作。SharePoint Foundation 2010 在检测和响应 SharePoint 事件方面提供巨大的灵活性。

备注

Microsoft Visual Studio 2010 目前提供了 SharePoint 事件接收器项目模板,该模板可自动执行本文中所述的很多任务。为了提供对整个事件管道中发生的操作的完整描述,我们不使用 Visual Studio 2010 事件接收器项目模板。不过,我们提供了使用 Visual Studio 2010 创建事件接收器的简要概述以及使用该模板的示例。

事件是在 Windows SharePoint Services 2.0 中首次引入的,但事件最初只在文档库上受支持。SharePoint 事件随后称作事件接收器。在 Windows SharePoint Services 3.0 中,SharePoint 事件基础结构采用其当前形式,并使用托管事件接收器。

通过多种方式改进了事件接收器。更易于使用;具有更多的事件类型;且在列表、内容类型、工作流和网站上受支持。SharePoint Foundation 2010 中引入了新列表和 Web 事件;此外,现在网站集可充当事件宿主,After 事件可以是同步的,并且事件取消和模拟都得到了改进。

SharePoint 事件的工作方式:只需了解一个段落即可

SharePoint 事件接收器绑定到 SharePoint 对象(事件宿主)并通过触发事件接收器代码响应用户操作。需将事件接收器代码编译到部署到全局程序集缓存的托管程序集(即 .dll 文件)。

可以在什么位置使用事件接收器?

如果要向 SharePoint 中发生的操作添加行为,可以在特定操作发生时使用事件接收器触发自定义代码。表 1 列出可插入自定义代码的各种操作。

表 1. 事件接收器可用的操作

对象

操作

网站集

  • 删除

Web

  • 创建

  • URL 修改

  • 删除

列表

  • 创建

  • 删除

  • 接收电子邮件

字段

  • 创建

  • 更新

  • 删除

项目

  • 创建

  • 更新

  • 删除

  • 签入

  • 签出

  • 文件移动

  • 文件转换

  • 添加附件

  • 删除附件

工作流

  • 启动

  • 完成

  • 延迟

什么是事件接收器?

事件接收器是一段托管代码,这些代码会在 SharePoint 对象发生特定触发操作时响应 SharePoint 事件。触发操作包括添加、更新、删除、移动、签入和签出等活动。

若要创建事件接收器,需从事件接收器基类之一继承。SharePoint 提供了五个事件接收器基类。(参见下节中的表 2。)请注意,每个基类都只支持指定的事件宿主和事件。必须为要支持的宿主类型选择正确的事件接收器基类。

在事件接收器类中编写事件接收器后,必须将接收器编译到托管程序集,然后将其置于全局程序集缓存 (GAC) 中。最后,必须将事件接收器绑定到适当的事件宿主。本文稍后将讨论事件绑定以及可用于绑定事件的不同方法。

什么是事件宿主?

事件宿主是期望接收事件的常见 SharePoint 对象,也就是其事件接收器"侦听"SharePoint 事件的对象。这些 SharePoint 事件宿主的对象类型包括 SharePoint 网站集、网站和列表等常见对象的实例。每个事件宿主类型都有一组特定的事件接收器基类型,该类型可以从这些类型继承。

表 2 列出事件接收器基类和支持每个接收器的事件宿主类型以及这些基类支持的事件。

表 2. 事件接收器基类与支持的事件

事件接收器基类

可用的事件宿主类型

支持的事件

SPWebEventReceiver

  • SPSite

  • SPWeb

  • SiteDeleting

  • SiteDeleted

  • WebAdding

  • WebProvisioned

  • WebDeleting

  • WebDeleted

  • WebMoving

  • WebMoved

SPListEventReceiver(列表)

  • SPSite

  • SPWeb

  • ListAdding

  • ListAdded

  • ListDeleting

  • ListDeleted

SPListEventReceiver(字段)

  • SPSite

  • SPWeb

  • SPList

  • SPContentType

  • FieldAdding

  • FieldAdded

  • FieldDeleting

  • FieldDeleted

  • FieldUpdating

  • FieldUpdated

SPItemEventReceiver

  • SPSite

  • SPWeb

  • SPList

  • SPContentType

  • ItemAdding

  • ItemAdded

  • ItemDeleting

  • ItemDeleted

  • ItemUpdating

  • ItemUpdated

  • ItemFileConverted

  • ItemFileMoving

  • ItemFileMoved

  • ItemCheckingIn

  • ItemCheckedIn

  • ItemCheckingOut

  • ItemCheckedOut

  • ItemAttachmentAdding

  • ItemAttachmentAdded

  • ItemAttachmentDeleting

  • ItemAttachmentDeleted

SPEmailEventReceiver

  • SPSite

  • SPWeb

  • SPList

  • EmailReceived

SPWorkflowEventReceiver

  • SPSite

  • SPWeb

  • SPList

  • SPContentType

  • WorkflowStarting

  • WorkflowStarted

  • WorkflowCompleted

  • WorkflowPostponed

SharePoint 事件模型的主要概念

除了事件模型的基本组成部分(事件接收器、事件宿主和事件本身)外,下面是 SharePoint 事件模型横向方面的主要概念。

Before 事件

Before 事件发生在当前请求的操作之前。例如,ItemAdding 事件是在项目添加到 SharePoint 列表之前引发的 Before 事件。

换个角度看,当某个操作在 SharePoint 写入内容数据库之前发生时会引发 Before 事件。这为事件接收器在数据提交到数据库之前执行任务提供了机会。执行数据验证是使用 Before 事件的一个好示例,因为 Before 事件会在数据提交之前触发。还可使用 Before(或同步)事件取消用户操作,例如在数据验证失败的情况下。

Before 事件触发的事件接收器与执行触发该事件的用户操作的代码在同一线程中执行。出于这个原因,Before 事件始终是同步的。您可标识 Before 事件,因为其成员名称均以"-ing"后缀结尾,如 ItemAdding、ListAdding 等。

After 事件

After 事件在当前请求的操作发生后引发。例如 ItemAdded 事件是在项目添加到 SharePoint 列表后引发的 After 事件。

After 事件触发在用户操作提交到内容数据库之后执行的事件接收器;它们调用在内容数据库修改之后运行的代码。这使您能够执行用户完成特定操作之后发生的逻辑。

After 事件可以同步或异步方式执行。如果 After 事件是同步的,则它会在触发操作发生的同一线程中执行。但如果 After 事件是异步的,则它会在单独线程中执行。

您可标识 After 事件,因为其成员名称均以"-ed"后缀结尾,如 ItemDeleted、WebProvisioned 等。

同步事件

同步事件在发生触发操作的同一线程中执行。例如,当用户从 SharePoint 用户界面添加项目时,该事件会完全执行,然后返回用户并显示已添加项目。

所有 Before 事件都是同步事件。

异步事件

异步事件在触发它的操作之后发生,并且不在运行触发操作的线程中执行。例如,当用户使用 SharePoint 用户界面向文档库添加项目时,该事件开始执行,然后向用户返回控件;但并不保证事件接收器会在向用户显示已添加项目之前完成执行。

事件绑定

事件绑定(也称为事件注册)可通过使用服务器对象模型或功能 XML 完成。以下各节提供有关 SharePoint Foundation 中绑定事件的详细信息。

事件取消

利用事件取消,您可在操作完成前取消 Before 事件中的事件接收器操作。例如,可在 ItemAdding 事件接收器中编写一些用于取消项目添加操作的代码。这样,当用户尝试添加项目时,该操作会取消,并且项目未添加到列表。取消该操作时,确保向用户显示错误消息,或通过将用户重定向到特定 URL 来提供自定义错误消息。

事件接收器序列

事件接收器序列指定在一个事件触发多个事件接收器的情况下,执行事件接收器的顺序。例如,如果有两个 ItemAdded 事件接收器绑定到同一列表(一个来自程序集"1",另一个来自程序集"2"),则先执行绑定序列号较低的事件接收器。实践示例是:向已绑定一个系统事件接收器的系统列表添加一个事件接收器。在这种情况下,向新事件接收器分配一个更高的序列号。

SharePoint 事件管道

图 1 演示 SharePoint 事件的同步和排序方式。

图 1. SharePoint 事件管道

SharePoint 事件管道

请注意以下详细信息:

  • 基于事件绑定期间指定的序列号按顺序调用同步事件接收器。这适用于 Before 和 After 同步事件。

  • 基于序列号按顺序启动异步 After 事件接收器线程。但不保证它们会按相同顺序完成。

  • 异步 After 事件在其关联的用户操作执行后可随时启动。它可能在 Web 请求完成前、完成时或完成后启动。

用户在 SharePoint 用户界面中启动操作后,SharePoint Foundation 执行用户操作前,引发同步 Before 事件。如果存在多个同步 Before 事件,将按这些事件的序列号指定的顺序引发它们。同样,同步 After 事件在 SharePoint Foundation 执行用户操作之后引发,引发的顺序也是按序列号指定的顺序。如您可以看到的,所有同步事件在发生用户操作的同一线程中处理。

但是,异步 After 事件在辅助线程中处理。

处理 SharePoint Foundation 2010 中的事件

创建 SharePoint 事件基本包含两个步骤。首先,确定要与事件关联的操作,并从相应事件接收器基类继承,然后为事件接收器编写自定义代码。其次,将事件绑定到相应的 SharePoint 事件宿主。(这一步也称为"注册"事件。)

编写事件接收器代码并将其编译到强签名的程序集后,可使用以下两种方法之一将事件绑定到其事件宿主:可以使用 SharePoint 对象模型中的 API,也可以使用 SharePoint 解决方案中的功能 XML。我们将详细讨论这两种方法。

使用对象模型与使用解决方案的比较

简而言之,使用对象模型 (OM) 与使用解决方案绑定 SharePoint 事件的区别在于:OM 方法更灵活且更易于开发,但难以部署和维护。解决方案方法灵活性较低且更难开发,但部署和维护工作要容易得多。

使用 OM 方法时,您有可随意支配的整个 SharePoint 对象模型。编写事件接收器代码,并将其编译到部署到 GAC 的程序集,然后运行代码将该程序集中的事件绑定到 SharePoint 事件宿主。

此方法在开发模式中很有用,因为可以轻松测试和更改事件接收器代码及事件绑定,然后重新生成并重新部署项目。但是,当您将代码从开发平台移到生产环境时,这种简单性就消失了,因为您必须手动部署所有内容。这意味着必须将事件接收器代码(即托管程序集)复制到生产环境中的每台独立的前端 Web 服务器。然后,您需要在其中一台前端 Web 服务器上运行可执行代码,再在每台前端 Web 服务器上运行 iisreset 以刷新 IIS 工作进程 (w3wp.exe) 上的缓存。在大型生产环境中,这可能是一项极其笨拙和危险的工作。

SharePoint 解决方案方法在绑定事件接收器定义的方式上不同。此外,借助部署 (.wsp) 包中的事件接收器代码以及解决方案文件,跨服务器场部署要简单和可靠的多,并且只需激活功能事件接收器定义即会变得可用。解决方案方法的另一个重要优势是,您可在部分受信任的代码(即沙盒解决方案)中实现事件接收器。网站集级别的管理员随后可以添加事件接收器。(在 SharePoint 2010 之前,只有服务器场管理员才可添加事件接收器。)

部署随后需要的步骤不会超过通常用于 SharePoint 解决方案部署(通过使用 .wsp 文件)的步骤。激活功能后,运行单个部署命令会将接收器程序集和事件绑定部署到所有前端 Web 服务器。

Visual Studio 2010 使此过程甚至更加简单。使用 Visual Studio 会提供对象模型方法的灵活性,同时保持解决方案方法的经济性。在以下各节中,我们在处理事件接收器时,会强调 Visual Studio 2010 极大简化此过程的方式。

使用服务器对象模型

使用服务器对象模型时,需要执行三个主要操作:创建事件代码、绑定事件以及修改或更改事件代码。以下各节详细讨论了每个步骤。

备注

尽管我们在以下示例中使用 Visual Studio,但不会使用 Visual Studio 2010 中包含的 SharePoint 项目模板。出于此原因,重新创建以下示例时,可使用 Visual Studio 2008 或 Visual Studio 2010。

使用对象模型创建事件

编写自定义事件接收器的第一步是重写事件接收器基类之一。虽然本文前面已在表 2 中列出了五个 SharePoint 事件接收器基类,但这五个基类均从核心事件接收器基类 SPEventReceiverBase 继承。

创建事件接收器

  1. 在 Visual Studio 2008 或 Visual Studio 2010 中,创建一个 C# 类库项目,例如名为 MyReceiverAssembly。

    重要说明重要说明

    如果使用 Visual Studio 2010,则确保面向 Microsoft .NET Framework 3.5,原因是 SharePoint 2010 依赖于 .NET Framework 3.5。您可在项目属性的"应用程序"选项卡上找到此设置,如图 2 所示。

    图 2. 面向 .NET Framework 3.5

    设定 .NET Framework 3.5 的目标

  2. 在项目属性的"生成"选项卡上,将"平台目标"设置为"x64"或"任何 CPU",如图 3 所示。不要选择"x86"。

    图 3. 面向相应平台

    设定适当平台的目标

  3. 在项目属性的"签名"选项卡上,选择"为程序集签名"。

  4. 单击"选择强名称密钥文件",然后单击"新建"。

  5. 在"创建强名称密钥"对话框的"密钥文件名称"文本框中,键入任意名称。清除"使用密码保护密钥文件"复选框,然后单击"确定"。

  6. 重命名类;例如 MyReceiverClass。

  7. 添加对 Microsoft.SharePoint.dll 的引用。

  8. 在类中,通过插入以下语句创建对 Microsoft.SharePoint 命名空间的引用:

    using Microsoft.SharePoint;

  9. 根据您要创建的事件,从 SPEventReceiverBase 的相应子类继承。(参考表 2。)例如,如果要创建和绑定 ItemAdded 事件,则从 SPItemEventReceiver 基类继承,如下所示:

    Public class MyReceiverClass : SPItemEventReceiver

  10. 为您要实现的事件定义方法。一种有用的方法是键入 public override,然后按空格键。在 Visual Studio 中,IntelliSense 显示类的可用事件,如图 4 所示。

    图 4. 使用 IntelliSense 查看可用事件

    使用 IntelliSense 查看可用事件

    如果选择了 ItemAdded 事件,您现在即有以下方法定义:

    Public override void ItemAdded(SPItemEventProperties properties)
    {
        base.ItemAdded(Properties;
    }
    
  11. 将类库内置到 DLL。

  12. 通过导航到 %WINDIR%\assembly 文件夹然后将程序集拖到该文件夹,将 DLL 放置在 GAC 中。

    如果您收到"拒绝访问"错误或其他问题阻止您将程序集放入缓存,可使用以下过程。

    1. 确保您的计算机上安装了 Visual Studio 2010 中的 SharePoint 开发工具。

    2. 启动 Visual Studio 命令提示符。

    3. 输入 gacutil /i 后跟程序集路径。如果操作成功,您将收到消息"程序集已成功添加到缓存中"。

    4. 若要确认您的程序集已添加,请在命令提示符处输入以下命令,以列出程序集缓存的指定目录中的所有程序集(在此示例中,在名为 MyReceiverAssembly 的缓存目录中):

      gacutil /l MyReceiverAssembly

使用对象模型绑定事件

使用 SharePoint Foundation 对象模型时,您可绑定(注册)任何具有 EventReceivers 属性的对象。EventReceivers 属性的类型为 SPEventReceiverDefinitionCollection,这便于将事件接收器定义添加到事件宿主。下面列出具有此属性且可充当事件宿主的 SharePoint 对象。

绑定事件接收器

  1. 在 Visual Studio 2008 或 Visual Studio 2010 中,创建一个 C# 控制台应用程序项目,例如名为 RegisterEvents。

    重要说明重要说明

    如果使用 Visual Studio 2010,则确保面向 Microsoft .NET Framework 3.5,原因是 SharePoint 2010 依赖于 .NET Framework 3.5。您可在项目属性的"应用程序"选项卡上找到此设置,如前面的图 2 所示。

  2. 添加对 Microsoft.SharePoint.dll 的引用。

  3. 在类中,通过插入以下语句创建对 Microsoft.SharePoint 命名空间的引用:

    using Microsoft.SharePoint;

  4. SPEventReceiverDefinition 类型的新项目添加到指定对象上的 EventReceivers 集合,类似于以下操作:

    SPEventReceiverDefinition def = list.EventReceivers.Add();

  5. 若要获取您在上一过程创建的程序集的全名,请转到 GAC,找到该程序集,右键单击程序集项,再单击"属性"。属性窗口应类似于图 5。

    图 5. GAC 中的程序集属性

    GAC 中的程序集属性

  6. 从属性窗口复制值以指定全名、版本、区域性和公钥标记。在此示例中,源代码如下所示:

    def.Assembly = "MyReceiverAssembly, Version=1.0.0.0, Culture=Neutral,PublicKeyToken=12e5e5525fb3d28a";

  7. 设置 Class 属性。Class 属性表示包含事件接收器的类的完全限定类名称,格式为命名空间.类。在此示例中,源代码如下所示:

    def.Class = "MyReceiverAssembly.MyReceiverClass";

  8. 设置 Type 属性。在此示例中,源代码如下所示:

    def.Type = SPEventReceiverType.ItemAdded;

  9. 设置 Name 属性。此属性可选。可以为事件接收器定义提供名称,也可以忽略该值。在此示例中,源代码如下所示:

    def.Name = "My ItemAdded Event Receiver";

  10. 设置 Synchronization 属性。此属性可选。如果未指定此属性的值,此属性将设置为 Default(即 SPEventReceiverSynchronization.Default)。默认行为是 Before 事件同步,After 事件异步。在此示例中,源代码如下所示:

    def.Synchronization = SPEventReceiverSynchronization.Synchronous;

  11. 设置 SequenceNumber 属性。此属性可选。使用此属性可设置在事件接收器定义中包含多个事件的情况下事件的触发顺序。如果未设置此值,则默认为 10000。设置此值时,可以选择介于 0 到 (216)-1 之间的任何值。

  12. 通过添加以下语句将事件接收器定义保存到 SharePoint 内容数据库中:

    def.Update();

下面是前一过程的完整源代码。当您运行这些代码时,将在 https://localhost 网站的"任务"列表上注册您的事件。当您在该列表中创建新项目时,将触发 ItemAdded 事件。

using (SPSite site = new SPSite("https://localhost"))
{
    using (SPWeb web = site.OpenWeb())
    {
        SPList list = web.Lists["Tasks"];
        SPEventReceiverDefinition def = list.EventReceivers.Add();
        def.Assembly = 
          "MyReceiverAssembly, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=12e5e5525fb3d28a";
        def.Class = "MyReceiverAssembly.MyReceiverClass";
        def.Type = SPEventReceiverType.ItemAdded;
        def.Name = "My ItemAdded Event Receiver";
        def.Synchronization = SPEventReceiverSynchronization.Synchronous;
        def.SequenceNumber = 1000;
        def.Update();
    }
}

更改事件

SharePoint 事件模型便于更改和重新部署事件接收器代码。下面说明阐释如何更改 MyReceiverAssembly 示例项目。

更新事件接收器

  1. 在 Visual Studio 中,打开项目(如 MyReceiverAssembly 项目)并进行更改。

  2. 重新生成该项目以创建 DLL 文件的新生成。

  3. 将 DLL 的新生成放入 GAC。确保覆盖或删除之前的 DLL。

  4. 运行 iisreset 以清除 IIS 缓存,从而在 GAC 中加载程序集的新版本。此操作将确保 SharePoint 获得您的更改。

使用 SharePoint 解决方案

使用 SharePoint 对象模型创建和部署事件接收器的替代方法是使用 SharePoint 解决方案。在此节中,我们将逐步完成创建事件接收器解决方案的手动过程。

使用 SharePoint 解决方案创建事件进行实现的方式与使用 SharePoint 对象模型时是一样的。按照使用对象模型创建事件一节中的过程创建事件。

这两种实现事件的方法之间的真正差异在于绑定,您对绑定使用解决方案 (.wsp) 文件中部署的 SharePoint 功能。

使用解决方案绑定事件

以下过程创建一个采用示例事件(我们在 MyReceiverAssembly DLL 中创建的 ItemAdded 事件)的 SharePoint 功能,并将其绑定到要激活功能的网站上的"任务"列表。

创建 SharePoint 功能

  1. 创建一个与功能同名的文件夹。

  2. 在新文件夹中,创建两个名为 feature.xml 和 eventbinder.xml 的 XML 文件。

  3. 通过访问文件属性并添加对位于 …/TEMPLATE/XML/wss.xsd 目录中的目标架构 (.xsd) 文件的引用,在 XML 文件中启用 IntelliSense。

    一般情况下,您必须在每次打开 XML 文件时重新创建此链接。但如果您在 Visual Studio 项目中工作,只需将架构文件添加到项目中即可。

    但如果在多个 Visual Studio 项目中创建了大量 CAML 文件且频繁创建,此过程可能会十分麻烦。替代方法是在每次打开 XML 文件时加载引用架构的 XSD 文件。若要实现此操作,请执行以下步骤。

    1. 在 Visual Studio 安装文件夹中找到名为 Catalog.xml 的 XML 文件,通常为 C:\Program Files\Microsoft Visual Studio 9.0\Xml\Schemas。

    2. 通过添加以下标记,从 Catalog.xml 文件中引用 wss.xsd 架构文件。确保 href 值指向 wss.xsd 文件的正确位置。

      <Schema href="C:/Program Files/Common Files/Microsoft Shared/Web Server Extensions/12/TEMPLATE/XML/wss.xsd" targetNamespace="https://schemas.microsoft.com/sharepoint/" />

    提示提示

    如果使用 Visual Studio 2010,可实际跳过步骤 3。当您打开包含 xmlns="https://schemas.microsoft.com/sharepoint/" 属性的 XML 文件时,Visual Studio 2010 会自动添加对 wss.xsd 的引用,从而启用 IntelliSense。

  4. 在 feature.xml 文件中,创建 <Feature> 元素。将 xmlns 属性设置为"https://schemas.microsoft.com/sharepoint/",将 Id 属性设置为全局唯一标识符 (GUID),将 Scope 属性设置为"Web",并将 Title 属性设置为"EventBinderFeature"。

    重要说明重要说明

    对于 Id 属性,必须提供有效的 GUID,该 GUID 可通过运行 guidgen.exe 在 Visual Studio 中获得。

  5. 在 <Feature> 元素中,添加 <ElementManifests> 元素。

  6. 在 <ElementManifests> 元素中,添加 <ElementManifest> 元素。将 Location 属性设置为"eventbinder.xml"。

  7. 在 eventbinder.xml 文件中,创建 <Elements> 元素。将 xmlns 属性设置为"https://schemas.microsoft.com/sharepoint/"。

  8. 在 <Elements> 元素中,添加 <Receivers> 元素。将 ListUrl 属性设置为"Tasks"。

  9. 在 <Receivers> 元素中,添加 <Receiver> 元素。

  10. 在 <Receiver> 元素中,添加以下元素,并为每个元素指定一个相应值:

    • <Assembly>

    • <Class>

    • <Type>

    • <Name>

    • <Synchronization>

    • <SequenceNumber>

完成前面的过程后,feature.xml 文件应类似于以下形式。

<Feature Id="E54C7FF5-1DF3-4B0B-8FFF-DB3185ECE8A6" 
         Scope="Web" 
         Title="Event Binder Feature"
         xmlns="https://schemas.microsoft.com/sharepoint/">
  <ElementManifests>
    <ElementManifest Location="eventbinder.xml" />
  </ElementManifests>
</Feature>

而 eventbinder.xml 文件应类似于以下形式。

<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <Receivers ListUrl="Lists/Tasks">
    <Receiver>
      <Assembly>MyReceiverAssembly, Version=1.0.0.0, Culture=Neutral, 
        PublicKeyToken=12e5e5525fb3d28a</Assembly>
      <Class>MyReceiverAssembly.MyReceiverClass</Class>
      <Type>ItemAdded</Type>
      <Name>My ItemAdded Event Receiver</Name>
      <Synchronization>Synchronous</Synchronization>
      <SequenceNumber>1000</SequenceNumber>
    </Receiver>
  </Receivers>
</Elements>

打包解决方案

若要将事件接收器部署到 SharePoint 的安装中,必须将文件组合到解决方案包 (.wsp) 文件中。.wsp 文件只是一个文件扩展名为 .wsp 的 CAB 文件 (.cab)。

解决方案清单文件告知 SharePoint 利用 .wsp 文件中打包的文件执行哪些操作。例如,<FeatureManifest> 元素指定此文件夹为 SharePoint 功能,因而应当部署到 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES 并安装在服务器场上。同样,<Assembly> 元素指定此文件是一个程序集,其 DeploymentTarget 属性指示是将该程序集部署到 GAC 还是部署到 Web 应用程序 bin 文件夹。

准备、创建和编辑 manifest.xml 文件,如下所示:

准备解决方案内容

  1. 创建名为"EventSolution"的文件夹。

  2. 将功能文件夹 EventBinder 复制到 EventSolution 文件夹。

  3. 将程序集 MyReceiverAssembly.dll 复制到 EventSolution 文件夹。

  4. 在 EventSolution 文件夹中创建一个名为"manifest.xml"的 XML 文件。

编辑 manifest.xml 文件

  1. 在 manifest.xml 文件中,创建 <Solution> 元素。将 xmlns 属性设置为"https://schemas.microsoft.com/sharepoint/",将 SolutionId 属性设置为 GUID,并将 Title 属性设置为"事件接收器解决方案"。

  2. 在 <Solution> 元素中,添加 <FeatureManifests> 元素。

  3. 在 <FeatureManifests> 元素中,添加 <FeatureManifest> 元素。将 Location 属性设置为"EventBinder\feature.xml"。

  4. 在 <Solution> 元素中,添加 <Assemblies> 元素。

  5. 在 <Assemblies> 元素中,添加 <Assembly> 元素。将 Location 属性设置为"MyReceiverAssembly",并将 DeploymentTarget 属性设置为"GlobalAssemblyCache"。

manifest.xml 文件现在应类似于以下形式。

<Solution SolutionId="11C76135-CEEC-475B-9A93-67E5EF151B3C"
          Title="Event Receiver Solution"
          xmlns="https://schemas.microsoft.com/sharepoint/">
  <FeatureManifests>
    <FeatureManifest Location="EventBinder\feature.xml"/>
  </FeatureManifests>
  <Assemblies>
    <Assembly Location="MyReceiverAssembly" 
              DeploymentTarget="GlobalAssemblyCache">
    </Assembly>
  </Assemblies>
</Solution>

解决方案内容现已就绪,只剩下创建 Diamond Directive File (DDF)。DDF 包含 Microsoft Cabinet Maker (makecab.exe) 用来标识如何将文件打包和压缩到 .cab 文件的信息。(DDF 文件本身未放入 .cab 文件。)

创建 DDF

  1. 在 EventSolution 文件夹中,创建一个名为"cab.ddf"的文件。

  2. 在文本编辑器(如"记事本")中打开 cab.dff,并添加以下信息。

    ;
    .OPTION EXPLICIT
    .Set CabinetNameTemplate=MyEventSolution.wsp 
    .set DiskDirectoryTemplate=CDROM
    .Set CompressionType=MSZIP
    .Set UniqueFiles="ON"
    .Set Cabinet=on
    .Set DiskDirectory1=Package
    manifest.xml manifest.xml
    MyReceiverAssembly.dll MyReceiverAssembly.dll
    EventBinder\feature.xml EventBinder\feature.xml
    EventBinder\EventBinder.xml EventBinder\EventBinder.xml
    
  3. 保存该文件。

重要说明重要说明

在 DDF 中,确保第一行以分号开始。

OPTION EXPLICIT 指令强制在文件中显式声明所有变量。将 UniqueFiles 设置为"ON"可确保目标文件唯一。"ON"是默认值,因为两次使用同一文件名通常意味着无意中包含了同一文件两次,这将浪费磁盘空间。

此 DDF 中的最后四行是文件映射:每行的第一个名称是源;第二个名称是目标。

若要创建解决方案包文件,请打开命令提示符,导航到 EventSolution 文件夹,然后输入以下命令:

makecab /F cab.ddf

Cabinet Maker 将在名为"Package"的 EventSolution 文件夹的子文件夹中创建 .wsp 文件。新文件的名称为 MyEventSolution.wsp。

部署解决方案

SharePoint 2010 提供了两种解决方案:服务器场解决方案和沙盒解决方案。沙盒解决方案非常重要,因为它们允许网站集的管理员在网站集范围上载和激活解决方案。使用沙盒解决方案,计算机不再需要访问 WFE 文件。

但按照定义,使用沙盒解决方案将限制可以运行的代码。例如,当解决方案部署为服务器场解决方案时,如果事件接收器中的代码尝试访问磁盘,则代码会运行无误。但如果事件接收器部署为沙盒解决方案,则在尝试访问磁盘时将引发运行时异常。

备注

在 SharePoint 2010 中,Windows PowerShell 将取代 Stsadm.exe 管理工具。您仍然可使用 Stsadm 部署服务器场解决方案,但建议您使用 Windows PowerShell。您无法使用 Stsadm 部署沙盒解决方案。

部署服务器场解决方案

  1. 通过执行以下 Windows PowerShell 命令,将解决方案上载到服务器场解决方案存储区:

    Add-SPSolution -LiteralPath full_path_to_solution

  2. 通过执行以下命令激活解决方案:

    Install-SPSolution solution_name.wsp -GACDeployment

部署沙盒解决方案

  1. 通过执行以下 Windows PowerShell 命令,将解决方案上载到网站集解决方案库:

    Add-SPUserSolution -LiteralPath full_path_to_solution -Site siteUrl

  2. 通过执行以下命令激活解决方案:

    Install-SPUserSolution solution_name.wsp -Site siteUrl

部署解决方案时,功能将复制到 TEMPLATE\FEATURES 文件夹,托管程序集将放入 GAC,其他文件将放入 TEMPLATES 下各自的文件夹中。现在您可激活功能。

如果您需要收回解决方案,请使用以下 Windows PowerShell 命令之一:

  • 服务器场解决方案:Uninstall-SPSolution solution_name.wsp

  • 沙盒解决方案:Uninstall-SPUserSolution solution_name.wsp -Site siteUrl

收回解决方案后,您可通过使用以下命令之一删除它:

  • 服务器场解决方案:Remove-SPSolution solution_name.wsp

  • 沙盒解决方案:Remove-SPUserSolution solution_name.wsp -Site siteUrl

使用 Visual Studio 2010 中的事件接收器模板

Visual Studio 2010 在 Microsoft Visual Basic 和 C# 中提供了一组扩展的 SharePoint 项目模板,包括一个 SharePoint 事件接收器模板。项目模板简化了 SharePoint 对象(如网站、列表、工作流及其他常见项目)的处理事件。

备注

本文未重点介绍事件接收器的 Visual Studio 项目模板,因为本文旨在提供 SharePoint 事件模型中的所有技术详细信息,甚至是 Visual Studio 项目模板隐藏的那些技术。也就是说,本节向您演示使用项目模板创建基本事件接收器何其容易。

在 Visual Studio 中使用事件接收器项目模板创建事件接收器项目时,本文中包含的一些步骤会自动完成。这些步骤包括:创建程序集并为程序集签名,创建事件绑定的功能,解决方案打包、部署和调试。

使用 Visual Studio 事件接收器项目模板创建 SharePoint 事件接收器

  1. 在 Visual Studio 2010 中,使用 SharePoint 2010 事件接收器模板创建一个新项目。

  2. 基于事件接收器代码的实现,选择 SharePoint 解决方案的信任级别。如果解决方案不需要磁盘、网络或系统级访问,则沙盒解决方案是首选项,因为它更易于、更可能使用。

  3. 选择要重写的事件。在我们的示例中,我们要重写 ItemAdded 事件并将其绑定到"任务"列表。

    • 您需要哪种类型的事件接收器?列表项事件

    • 哪个项目应是事件源?任务

    • 处理以下事件:项目已添加

  4. 单击"完成"。

  5. 在 ItemAdded 事件中,添加自定义代码。

  6. 在菜单栏上,单击"生成",然后单击"部署解决方案"。

将打包、添加和部署您的解决方案!您甚至可以在事件接收器代码中设置一个断点,并调试它。

若要探究若干个使用 SharePoint 事件模型的实践示例,请阅读本文的第二部分:在 SharePoint Foundation 2010 中使用事件接收器(第 2 部分,共 2 部分)

其他资源

有关详细信息,请参阅以下资源: