通过本文和代码示例,启用 Microsoft Windows SharePoint Services 中的文档库事件日志消息。本文将指导您如何创建要在 Microsoft Windows SharePoint Services 中使用的事件处理程序。下载代码示例并根据自己的环境对其进行修改。
本文转自 http://blog.csdn.net/msdnportal/archive/2004/06/01/65250.aspx
为 Microsoft Windows SharePoint Services 中的文档库创建事件日志消息
Nigel Bridport
Microsoft Corporation
2003 年 10月
适用于:
Microsoft_ Windows_ SharePoint Services
Microsoft Office SharePoint Portal Server 2003
摘要:通过本文和代码示例,启用 Microsoft Windows SharePoint Services 中的文档库事件日志消息。本文将指导您如何创建要在 Microsoft Windows SharePoint Services 中使用的事件处理程序。下载代码示例并根据自己的环境修改它。(13 页打印页)
![*](http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/3squares.gif)
本页内容
![]() | 概述 |
![]() | 事件设置 |
![]() | 启用文档库的事件 |
![]() | 为事件创建 Microsoft Visual Studio .NET 2003 项目 |
![]() | 将事件代码与文档库相关联 |
![]() | 小结 |
![]() | 附录 A — 示例安装 |
![]() | 附录 B — 示例事件代码 |
概述
Microsoft_ Windows_ SharePoint? Services 可提供允许您基于 Windows SharePoint Services 平台构建的文档库事件。您可以创建为这些事件定义处理程序的托管代码程序集,然后将这些处理程序绑定到文档库。事件处理程序可以通过调入对象模型 (OM) 来直接访问配置数据库和内容数据库,也可以将 Windows SharePoint Services 用作其他系统的用户界面来调用外部服务。通过定义事件处理程序并为特定文档库启用事件日志记录,您可以使用 Microsoft 事件查看器来查看事件消息。
下表列出 Windows SharePoint Services 提供的文档库的事件,您可以对这些事件启用日志记录。
表 1. 文档库事件
事件 | 说明 |
Cancel Check Out | 撤消对已签出文档进行的更改。 |
Check In | 将文档签入到文档库中。 |
Check Out | 从文档库中签出文档。 |
Copy | 复制文档库中的文档。 |
Delete | 从文档库中删除文档。 |
Insert | 将新文档保存到文档库中。 |
Move or Rename | 移动或重命名文档。 |
Update | 编辑库中现有的文档或自定义列的值。 |
在 Windows SharePoint Services 的上下文中,事件处理程序是一个实现 IListEventSink 接口的 .NET 类,在事件处理程序中使用此接口的单一方法 OnEvent。SPListEvent 对象包含有关所发生事件的信息。您可以通过 Type 属性来识别事件的类型,并可以使用 Site 属性来访问处理程序中 Microsoft.SharePoint 命名空间的对象模型。
您必须将用来定义事件处理程序的托管程序集安装到全局程序集缓存 (GAC) 或适当的虚拟服务器 BIN 目录中。
注 此外,在服务器场配置中,每个前端 Web 服务器都必须安装有托管程序集。
要在服务器上部署事件处理程序,您必须启用“SharePoint 管理中心”内的“虚拟服务器常规设置”页上的事件处理。
注 您必须是本地 Administrators 组或 SharePoint Administrators 组的成员,才能启用文档库的事件处理。
事件设置
文档库的元数据可通过下表中指定的属性,将事件处理程序的类绑定到该文档库。您可以在“文档库高级设置”页上为文档库指定这些属性,也可以通过设置 SPList 对象的 EventSinkAssembly、EventSinkClass 和 EventSinkData 属性的代码来指定。
表 2. 可能的事件设置
设置 | 类型 | 说明 |
Assembly Name | String | 事件处理程序的程序集文件(位于 GAC 或 BIN 目录中)的强名称 |
Class Name | String | 程序集中完全限定且区分大小写的类名称 |
Properties | String | 由事件处理程序使用的自定义属性的任意字符串,其长度不能超过 255 个字符 |
在安装事件处理程序的程序集之后,您必须在文档库“文档库高级设置”页的“程序集名称”框中,采用以下格式指定程序集的强名称:
程序集名称, Version=版本, Culture=区域性, PublicKeyToken=公钥标记
您可以在 Microsoft Windows 资源管理器中浏览至 GAC 的默认位置 (%windir%\assembly) 来识别这些值。例如,在默认情况下,Windows SharePoint Services 程序集的强名称如下所示:
Microsoft.SharePoint, Version=11.0.0.0, Culture=Neutral, PublicKeyToken=71e9bce111e9429c
您为“类名”框指定的值必须是区分大小写的完整类名,该类在指定程序集中定义,并可实现 IListEventSink 接口。例如,在以下示例中,类的全名如下:
WSSEventSink.EventSink
启用文档库的事件
在默认情况下,Windows SharePoint Services 不启用文档库的事件。要启用文档库的事件,请按照下列步骤操作。事件是基于每个虚拟服务器启用的。因此,当您启用事件时,会针对指定虚拟服务器上创建的所有站点启用它们。
在虚拟服务器上启用事件
1. | 在运行 Windows SharePoint Services 的服务器上,单击“开始”,指向“管理工具”,然后单击“SharePoint 管理中心”。请参见图 1。 注 默认的“管理中心”页是根据计算机上所安装的 SharePoint 产品或技术决定的。如有必要,请在“链接”窗格中单击“Windows SharePoint Services”,以转至 Windows SharePoint Services 的“管理中心”页: ![]() 图 1. Windows SharePoint Services 的“管理中心”页 |
2. | 在“虚拟服务器配置”部分中,单击“配置虚拟服务器设置”。 |
3. | 在“虚拟服务器列表”上,单击要设置的虚拟服务器,例如,单击“默认 Web 站点”。 |
4. | 在“虚拟服务器设置”页的“虚拟服务器管理”部分中,单击“虚拟服务器常规设置”。 |
5. | 在“虚拟服务器常规设置”页的“事件处理程序”部分中,在“事件处理程序的状态”框中选择“开”,然后单击“确定”。 |
现在,宿主 SharePoint 站点的虚拟服务器便启用了这些事件。
为事件创建 Microsoft Visual Studio .NET 2003 项目
本部分描述如何创建自定义事件处理程序。
要点 本部分假设 Microsoft Visual Studio_ .NET 2003 已安装在运行 Windows SharePoint Services 的服务器上。如果您要在没有安装 Windows SharePoint Services 的计算机上开发事件处理程序,则需要访问运行 Windows SharePoint Services 的服务器。在服务器计算机上,从 <系统驱动器>:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\60\ISAPI 文件夹复制 Microsoft.SharePoint.dll,并将其转移到将在其上开发事件处理程序的计算机的文件夹中。
在 Visual Studio .NET 2003 中创建自定义事件处理程序
1. | 在 “ 文件 ” 菜单上,指向 “ 新建 ” ,然后单击 “ 项目 ” 。 |
2. | 在“项目类型”窗口中,单击“Visual Basic 项目”,然后在“模板”窗口中单击“类库”。 |
3. | 在“名称”字段中,键入 WSSEventSink,然后单击“确定”。 |
4. | 在“解决方案资源管理器”中,单击 Class.vb,然后在“属性”窗口的“杂项”下,将“文件名”更改为 EventSink.vb。 下一步是添加对 Microsoft.SharePoint.dll 的引用。 |
5. | 为此,请在“项目”菜单上单击“添加引用”。在 .NET 列表中,单击 Microsoft.SharePoint.dll,然后单击“确定”。如果此计算机上没有安装 Windows SharePoint Services,则在“.NET”选项卡上单击“浏览”,然后按上面描述的方法导航至将 Microsoft.SharePoint.DLL 复制到其中的文件夹。选择该 .DLL 并单击“打开”。 |
6. | 复制附录 B 中的示例代码并将其粘贴到 EventSink.vb 的代码窗口中,替换项目文件中已存在的任何默认代码,然后单击“保存”。 |
7. | 在“工具”菜单上,单击“创建 GUID”,以创建一个 GUID。 |
8. | 单击“4. 注册表格式 (即,{xxxxxxx-xxxx. . . xxxx})”,单击“复制”,然后单击“退出”。 |
9. | 在解决方案资源管理器中,单击 AssemblyInfo.vb 以打开 AssemblyInfo.vb 的代码窗口。 |
10. | 在 AssemblyInfo.vb 的代码窗口中,找到程序集的 GUID 项并将该字符串替换为所复制的 GUID。 |
11. | 在 AssemblyInfo.vb 中,找到以下代码并添加一个版本号。 <Assembly: AssemblyVersion("1.0.*")> 例如,<Assembly: AssemblyVersion("1.0.0.1")> |
12. | 保存该项目文件。 接着,您需要赋予该项目一个强名称,然后才能在 Windows SharePoint Services 中使用它: |
13. | 在开发计算机上,单击“开始”,指向“所有程序”,指向“Microsoft Visual Studio .NET 2003”,指向“Visual Studio .NET 工具”,然后单击“Visual Studio .NET 2003 命令提示”。 |
14. | 键入以下命令:sn.exe –k c:\keypair.snk 注 您可以将路径更改为任何所需路径。 |
15. | 在事件接收项目中,打开 AssemblyInfo.vb 文件,并将下行添加到模块的末尾 <Assembly: AssemblyKeyFile("c:\\keypair.snk")> |
16. | 现在,您可以对该项目进行编译。为此,请在“生成”菜单上单击“生成解决方案”。 |
17. | 检验并解决所有生成错误,然后保存所有更改。如果需要,重新构建解决方案。 |
18. | 下一步是将新的 .dll 复制到运行 Windows SharePoint Services 的服务器的全局程序集缓存 (GAC) 中。为此,请浏览至该项目在开发计算机上的位置,然后将 Windows SharePoint Services EventSink.dll 文件复制到 Windows SharePoint Services 服务器的 GAC 中,GAC 位于与 Windows 2003 和 Windows XP 相对应的以下位置: %windir%\assembly |
19. | 将程序集复制到 GAC 之后,请注意“公钥标记”的值,因为将代码与 Windows SharePoint Services 中的文档库相关联时,该值是必需的。要查找托管程序集的公钥标记,请在 Windows 资源管理器中打开 GAC,然后观察“公钥标记”列。 |
现在,您已经成功创建了要在 Windows SharePoint Services 中使用的事件处理程序。
注 有关此代码示例的完整版本,请下载 CreatingEventsinaDocumentLibrarySample.exe。
将事件代码与文档库相关联
创建自定义事件处理程序之后,您必须将它与要在其中执行该代码的相关文档库相关联。这一步骤还充当 Windows SharePoint Services 的 SafeControl 项;因此,您不必修改其他 SharePoint 文件,如 Web.config。
关联事件代码
1. | 在 SharePoint 站点上,浏览至要与该事件代码相关联的文档库。 |
2. | 在链接栏中,单击“修改设置和栏”。 |
3. | 在“常规设置”部分中,单击“更改高级设置”。 |
4. | 如果您使用本文中提供的示例托管程序集,则在“事件处理程序”部分的“程序集名称”文本框中,键入以下内容: WSSEventSink, Version=1.0.0.2, Culture=neutral, PublicKeyToken=25a7f6c72becfbbb 注 如果您创建了自己的代码,则需要用与您的托管程序集相应的值来更新 Version 和 PublicKeyToken 值。 |
5. | 在“类名”文本框中,键入以下内容: WSSEventSink.EventSink |
6. | 单击“确定”。 |
现在,您已经将自定义的事件处理程序代码与文档库相关联。
小结
本文概述了如何启用 Microsoft Windows SharePoint Services 中文档库的事件日志消息。本文深入介绍了如何使用 Microsoft Visual Studio .NET 2003 来创建事件处理程序,并提供了一个可让您用于部署 Microsoft SharePoint 产品和技术的代码示例。要查看该代码的示例结果集,请参阅“附录 A — 示例安装”。
附录 A — 示例安装
以下示例事件基于本文中使用的自定义事件代码。要打开事件查看器,请单击“开始”,指向“管理工具”,然后单击“事件查看器”。下图显示事件查看器的默认视图。
![sharepoint_wssevents02.gif](https://i-blog.csdnimg.cn/blog_migrate/ddaba1a8383bb66ba156c3984a01427c.png)
图 2. 事件查看器的默认视图
下图显示示例事件的属性。
![sharepoint_wssevents03.gif](https://i-blog.csdnimg.cn/blog_migrate/71afaf060e046e8f7308ec6961f36da7.png)
图 3. 示例事件
以下示例显示该事件的完整说明:
Event occurred in <Shared Documents> Event type was <Insert> Item that caused the event was <Shared Documents/sample.doc Item field details are as follows -> Field name = <Created Date> Value = <08/07/2003 12:00:58> Field name = <Created By> Value = <1; user_name\administrator> Field name = <Last Modified> Value = <08/07/2003 12:00:58> Field name = <Modified By> Value = <1; user_name\administrator> Field name = <Approval Status> Value = <0> Field name = <Approver Comments> Value = <> Field name = <URL Path> Value = </sites/site_name/Shared Documents/Steps to enable events for sample.doc> Field name = <URL Dir Name> Value = <11; sites/site_name/Shared Documents> Field name = <Modified> Value = <08/07/2003 12:00:58> Field name = <Created> Value = <08/07/2003 12:00:58> Field name = <File Size> Value = <193024> Field name = <File System Object Type> Value = <0> Field name = <ID of the User who has the item checked out> Value = <11; > Field name = <Name> Value = <Steps to enable events for sample.doc> Field name = <Virus Status> Value = <11; 193024> Field name = <Checked Out To> Value = <11; > Field name = <Checked Out To> Value = <11; > Field name = <Document Modified By> Value = <user_name\administrator> Field name = <Document Created By> Value = <user_name\administrator> Field name = <File Type> Value = <doc> Field name = <HTML File Type> Value = <> Field name = <Source Url> Value = <> Field name = <Shared File Index> Value = <> Field name = <Name> Value = <Steps to enable events for sample.doc> Field name = <Name> Value = <Steps to enable events for sample.doc> Field name = <Select> Value = <11> Field name = <Select> Value = <11> Field name = <Edit> Value = <> Field name = <Type> Value = <doc> Field name = <Server-based Relative URL> Value = </sites/site_name/Shared Documents/sample.doc> Field name = <Encoded Absolute URL> Value = <http://server_name/sites/site_name/Shared%20Documents/sample.doc> Field name = <Name> Value = <Steps to enable events for sample.doc> Field name = <File Size> Value = <193024> Field name = <InstanceID> Value = <> Field name = <Title> Value = <Steps to enable events for sample.doc>
附录 B — 示例事件代码
以下示例代码可用于创建自定义事件处理程序。该代码使用 Microsoft Visual Studio .NET 2003 以 Microsoft Visual Basic_ .NET 编写。
Option Explicit On Imports System Imports System.IO Imports Microsoft.SharePoint Public Class EventSink : Implements IListEventSink Public Sub OnEvent(ByVal listEvent As Microsoft.SharePoint.SPListEvent) Implements Microsoft.SharePoint.IListEventSink.OnEvent On Error Resume Next Dim SharePointWeb As SPWeb = listEvent.Site.OpenWeb() Dim SharePointEventItem As SPFile = SharePointWeb.GetFile(listEvent.UrlAfter) Dim oItem As SPListItem = SharePointEventItem.Item Dim oField As SPField Dim oFields As SPFieldCollection Dim sLog As String 'Check to make sure that we actually have the event item! If SharePointEventItem Is Nothing Then EventLog.WriteEntry("Event Log Test", "Cannot retrieve event item", EventLogEntryType.Information, listEvent.Type) Exit Sub End If 'Get the fields collection for the Event Item oFields = oItem.Fields 'Inform the user of some top-level information such as the source of the event sLog = "Event occurred in <" + listEvent.Title + ">" + vbCrLf sLog = sLog + "Event type was <" + listEvent.Type.ToString + ">" + vbCrLf + vbCrLf 'The delete event carries no useful information to log in the fields collection If (Len(listEvent.UrlAfter.ToString) > 1) Then sLog = sLog + "Item that caused the event was <" + listEvent.UrlAfter.ToString + ">" + vbCrLf + vbCrLf sLog = sLog + "Item field details are as follows ->" + vbCrLf + vbCrLf 'Iterate through the items fields and detail them For Each oField In oFields sLog = sLog + "Field name = <" + oField.Title.ToString + "> " + vbCrLf + vbTab + "Value = <" + oItem(oField.Title.ToString) + ">" + vbCrLf Next End If 'Event Id Explanation ' -1 : Invalid ' 0 : Insert ' 1 : Update ' 2 : Delete() ' 3 : Move or Rename ' 4 : Copy ' 5 : CheckIn ' 6 : CheckOut ' 7 : UnCheckOut 'Write out the collected information to the Application Log EventLog.WriteEntry("Event Log Test", sLog, EventLogEntryType.Information, listEvent.Type) 'This is just some sample code that shows how to operate on the different ' event types. Select Case listEvent.Type Case SPListEventType.CheckIn 'Perform necessary actions for the CheckIn event Case SPListEventType.CheckOut 'Perform necessary actions for the CheckOut event Case SPListEventType.Copy 'Perform necessary actions for the Copy event Case SPListEventType.Delete 'Perform necessary actions for the Delete event Case SPListEventType.Insert 'Perform necessary actions for the Insert event Case SPListEventType.Invalid 'Perform necessary actions for the Invalid event Case SPListEventType.Move 'Perform necessary actions for the Move event Case SPListEventType.UncheckOut 'Perform necessary actions for the UnCheckOut event Case SPListEventType.Update 'Perform necessary actions for the Update event End Select End Sub 'OnEvent End Class 'EventSink