Patrick Tisseghem
U2U
适用于:
Microsoft® Office SharePoint® Portal Server 2003
摘要:了解 .NET 开发人员如何通过自定义报警结果信道来扩展 Microsoft Office SharePoint Portal Server 2003。学习为用户提供用来接收报警结果的额外信道。本文将逐步完成 Quick Alerts 报警结果信道,以便为读者提供示例。
简介 | |
从 DeliveryChannel 类开始 | |
预订报警 | |
报警 Web 部件 | |
用户如何获得通知 | |
创建 Quick Alerts 传递信道 | |
部署自定义信道 | |
使用 Quick Alerts 信道 | |
自定义新的报警页 | |
小结 | |
其他资源 | |
关于作者 |
Microsoft® Office SharePoint® Portal Server 门户网站或工作组网站的访问者一定知道 Alert Me 链接。当其中一个网站中的内容被创建、更新或删除时,您可以得到通知。要获得报警结果,用户必须创建报警。Microsoft Office SharePoint Portal Server 2003 本身就能够通过门户网站或电子邮件通知用户。
本文描述使用 .NET 框架的开发人员如何通过自定义报警结果信道为其用户扩展 SharePoint Portal Server 2003。我们将逐步完成 Quick Alerts 报警结果信道,以便为读者提供示例。
注 本文仅适用于 SharePoint Portal Server 2003,而不适用于 Microsoft Windows® SharePoint Services。
可以用报警来通知用户,报警是一个吐司 或小窗口,当从运行在任务栏报警结果区域中的应用程序中激活时弹出。Microsoft MSN® Messenger 是使用报警的应用程序的很好示例。通过用于 .NET 框架的 Microsoft Alerts Version 6.0 SDK,可以编写代码将 MSN Messenger 设计为显示您自己的报警。遗憾的是,就 Microsoft Alerts 而言,您必须首先将报警结果发送给 Microsoft Alert Web 服务,然后实际用户才能看到报警结果。许多公司出于多种原因而不允许进行此类通讯。一个原因是它们只是不允许员工在公司内部使用 MSN Messenger。因此,由于我们希望集中讨论与 SharePoint Portal Server 2003 有关的问题,所以该示例将使用客户端工具来模拟 Messenger Microsoft Alert。
注 如果您希望使用 Microsoft Alerts SDK,您还应该浏览 Microsoft Alerts 网站,以查找其他有关如何充当 Messenger 的报警提供程序的详细信息。
我们将讨论创建、注册和使用自己的报警结果信道的基本步骤。然后,我们将通过自定义报警页来进一步考察更为高级的功能。
通知或报警借助于传送或报警结果信道传递给用户。默认情况下,SharePoint Portal Server 2003 公开两个信道,以便当访问者的 SharePoint 网站中的内容被创建、修改或删除时通知他们。一个信道是门户网站本身,用户在此通过其“我的网站”私有视图内提供的 Web 部件,查看他们已经预订的报警的摘要。第二个报警结果信道当然是通过电子邮件传递,并且这是在运行 Microsoft Windows SharePoint Services 时可用的唯一信道。
可以使用两个类 — PortalChannel 与 EmailChannel(在 SharePoint Portal Server 2003 对象模型中公开)来实现这两个信道。Microsoft SharePoint Products and Technologies 2003 Software Development Kit (SDK) 中对该对象模型进行了说明。
可以在 Microsoft.SharePoint.Portal 程序集(图 1)中找到这两个类;它们都派生自 DeliveryChannel 基类。
• |
PortalChannel 负责将报警结果放到门户网站中。报警结果显示在用户“我的网站”的私有视图中。 |
• |
EmailChannel 用来以电子邮件的格式将报警结果传递给用户。 图 1.传递信道和自定义 QuickAlertsChannel 从 Microsoft.SharePoint.Portal.Alerts.DeliveryChannel 类继承 |
作为开发人员,您可以通过创建其他将报警结果传递给用户的方法来扩展 SharePoint Portal Server 2003。额外的自定义传递或报警结果信道的示例包括即时消息、对报警结果进行特定于媒体的传递以及类似于 RSS 的聚合。
您可以从使用 DeliveryChannel 基类作为您自己的自定义传递信道的父类开始。我们将演示如何从 DeliveryChannel 基类派生 QuickAlertsChannel 类。
用户必须采取的第一个操作是:注册当 SharePoint 门户网站或工作组网站中的区域、列表、文档库或其他类型的内容提供程序中发生某种操作时,他或她希望以何种方式得到通知。这一操作称为预订报警,用户通过单击 Alert Me 链接完成这一操作。
在幕后,SharePoint Portal Server 2003 咨询它的 MYPORTAL_SERV Microsoft SQL Server™ 数据库来查明可能的传递信道是什么。SharePoint Portal Server 将用户重定向到 NewAlert.aspx 页(图 2),它在该页上为每个已注册的信道显示了一个用户界面 (UI) 块。红色矩形的内部显示了为 SharePoint Portal Server 2003 中的两个默认传递信道呈现的 UI 块。
图 2. 显示两个传递信道的 UI 的 NewAlert.aspx 页
当用户单击 OK 时,SharePoint Portal Server 2003 将您的报警存储在 MYPORTAL_SERV SQL Server 数据库中。您可以通过打开 sub_UserSubscription 表对此进行验证。用户帐户的 GUID 链接到报警的 ID。您可以在相关的 sub_SubscriptionXXX 表中找到有关报警的更多信息。
您可以创建一个小型 Web 部件,以显示用户已经在门户网站内创建的各种报警。您的 Web 部件还可以显示所有已注册的传递信道以及与不同类型的报警和报警结果有关的信息(图 3)。默认情况下,SharePoint Portal Server 2003 提供了不同类型的报警,而且您可以创建自己的自定义报警类型。这样做,您就定义了可以警告用户的新的事件范围或类型。
图 3. Web 部件显示被预订的报警、已注册的传递信道以及可用的报警和报警结果类型
您可以在 Web 部件内使用下面的代码行。在许多文章中以及在 SharePoint Products and Technologies 2003 SDK 中都解释了如何创建 Web 部件。有关详细信息,请参阅其他资源。请将以下代码放入 Web 部件类的 RenderWebPart() 方法中。
AlertManager am = new AlertManager(PortalContext.Current); StringBuilder sb = new StringBuilder(); sb.AppendFormat("Alerts I subscribed to"); foreach(Alert alert in am.GetMyAlerts()) { sb.AppendFormat("Alert {0}.",alert.Name); } sb.AppendFormat(" Delivery Channels"); foreach(DeliveryChannel dc in am.Configuration.DeliveryChannels) { if(dc.GetSettings().Notification == null) sb.AppendFormat("->{0} ({1}) - Notification: n/a", dc.DisplayName,dc.ChannelId); else sb.AppendFormat("->{0} ({1}) - Notification: n/a", dc.DisplayName,dc.ChannelId, dc.GetSettings().Notification.ToString()); } sb.AppendFormat(" Possible Alert Types"); foreach(AlertType at in am.Configuration.AlertTypes) { sb.AppendFormat("->{0} ({1})", at.TypeDisplayName,at.AlertGroupDisplayName); } sb.AppendFormat(" Possible Notification Types"); NotificationManager nm = new NotificationManager (PortalContext.Current); foreach(NotificationType nt in nm.Configuration.NotificationTypes) { sb.AppendFormat("->{0}",nt.NotificationTypeId); } output.Write(sb.ToString());
任何与报警相关的任务的入口点是 AlertManager 类,该类在 Microsoft.SharePoint.Portal.Alerts 命名空间中提供。当您希望为当前登录的用户检索报警列表时,请使用 AlertManager 类。AlertManager 对象的构造函数需要当前的 PortalContext。在您创建该对象之后,您可以开始检索用户当前预订的所有报警、已注册的传递信道的列表以及可能的报警类型。
图 3 中的示例显示用户为门户网站中的 Events 列表创建了一个报警。当该列表内的操作发生时,SharePoint Portal Server 2003 不会立即通知用户,因而该报警的结果不会立即出现在用户的“我的网站”上。实际的传递时间取决于爬网频率。当爬网发生时,用户将在“我的通知摘要”Web 部件中看到一个新项(图 4)。
图 4. 用户“我的网站”上的报警结果
现在,我们可以考察您如何创建自己的自定义传递信道。您将创建第三个传递信道,名为 Quick Alerts 信道。在门户网站上创建报警的用户可以选择不仅通过电子邮件或“我的报警摘要”Web 部件中的项获得通知,而且通过能够显示一个小吐司(报警)的客户端应用程序来获得通知。
您必须在 .NET 框架类库中创建自定义传递信道。该程序集必须具有强名称,并且部署在全局程序集缓存中。您的 .NET 框架类库项目需要对 Microsoft.SharePoint.Portal.dll 的引用。该程序集包含基类 Microsoft.SharePoint.Portal.Alerts.DeliveryChannel,您将从该类派生您自己的类。
public class QuickAlertChannel: DeliveryChannel { public QuickAlertChannel() {} }
报警结果信道由两个您必须覆盖的属性进行标识:内部 ChannelID 以及将在 SharePoint 网站本身内部显示的 DisplayName。
private string channelID = "QA"; private string displayName = "Quick Alerts"; public override string ChannelId { get { return channelID; } } public override string DisplayName { get { return displayName; } }
在该类中,您还有一个可以覆盖的附加属性。您可以使用 SortKey 属性来控制在 NewAlert.aspx 页中呈现的 UI 块的顺序位置(参见图 2)。下面的代码显示了如何向 SharePoint Portal Server 2003 说明它需要在为两个默认信道生成 UI 块后,立即为您的 Quick Alerts 信道生成 UI 块。
public override string SortKey { get { return "ZZZLast"; } }
您还需要覆盖基类的三个方法。
• |
GetControl() 定义了用户将在报警页中看到的内容。您根本无须编写 UI 就可添加自定义传递信道。(有关使用该方法通过您自己的 ASP.NET 服务器控件替换 SharePoint Portal Server 2003 所呈现的 UI 的信息,请参阅其他资源。) |
• |
GetSettings() 用于与自定义信道相关的特定设置。当创建报警结果时,SharePoint Portal Server 2003 会向每个已注册的传递信道请求其实现的任何自定义设置。 |
• |
Send() 用于发送自定义报警结果。Send() 方法引进了三个参数: Microsoft.SharePoint.Portal.Alerts.NotificationSite 对象,使您可以访问将报警结果发送到的门户网站。 Microsoft.SharePoint.Portal.Topology.PortalZone,供内部使用,并且未予说明。 XML 格式的通知文本,这是一个重要的参数,它只是一串提供额外的信道特有信息的参数。 |
public override Microsoft.SharePoint.Portal.Alerts.DeliveryChannel.ChannelControl GetControl() { return base.GetControl (); } public override DeliveryChannelSettings GetSettings() { return base.GetSettings (); } public override void Send(NotificationSite site, Microsoft.SharePoint.Portal.Topology.PortalZone renderLinkZone, System.Xml.XmlDocument notification, string parameters) { notification.Save(@"C:\notificationdump.html"); }
如图 3 所示,默认情况下存在许多报警结果类型(AlertResultNotification、AlertNewsLetterNotification、AlertCreationConfirmation、AlertAutoDeactivationNotification)。SharePoint Portal Server 2003 在需要时会调用这些报警结果类型中的每个类型,并且这些类型负责传递 XML 格式的报警结果数据。然后,将在这些数据上执行 XSL,并且将格式化的报警结果提供给已注册的传递信道。
出于测试目的,可以简单地将该 XML 数据输出到文件中并查看内容。当您创建报警时,SharePoint Portal Server 2003 会创建 AlertCreationConfirmation 报警结果类型的实例。每个已注册的传递信道都将获得格式化的 XML 数据,并对该数据进行相应的处理。Portal 信道不会对传入的数据进行任何处理。它会将这一工作委派给“我的网站”上显示的 Microsoft.SharePoint.Portal.WebControls.Alerts.SummaryView Web 部件。该 Web 部件会使用 Microsoft.SharePoint.Portal.Alerts.AlertCollection 枚举报警结果。Email 信道实际上是处理传入数据的唯一信道,它会创建电子邮件并将其发送给用户。报警结果类型定义了传递频率。Email 信道可以处理 AlertResultNotification 报警结果类型和 AlertNewsLetterNotification 报警结果类型。前者会产生即时报警,后者用于每天或每周生成邮件。
XML 数据在很大程度上是面向电子邮件的,因为 Email 信道是主要用于处理数据的信道。然而,您可以自定义用于格式化报警结果的 XML 模板和 XSL。XML 文件存储在 \Program Files\Common Files\Microsoft Shared\Web Server Extensions\60\Template\LCID\XML 中,其中 LCID 是区域设置 ID。SharePoint Products and Technologies 2003 SDK 讨论了不同的 XML 和 XSL 文件及其用途。
Quick Alerts 信道的目的是:通过使用报警结果区域中提供的小型 .NET 框架客户端应用程序,在客户端计算机上显示一个吐司。因此,您可以将报警信息存储在 SQL Server 数据库中,并且让客户端应用程序不时轮询该数据库。可以使用对数据库的直接访问或通过 Web 服务做到这一点。您可以用下面的代码片段来替换 Send() 方法内部的代码,以便为此进行准备。这些代码从 XML 格式的传入报警结果中检索帐户和消息,而其余的代码则执行向自定义数据库和表的插入操作。
XmlNode ownerNode = null; XmlNode messageNode = null; string owner = string.Empty; string message = string.Empty; ownerNode = notification.SelectSingleNode("//A[@id='Owner']"); messageNode = notification.SelectSingleNode("//Headers/Subject"); if((ownerNode!=null)&&(messageNode!=null)){owner = ownerNode.InnerText; message = messageNode.InnerText; SqlConnection conn = new SqlConnection ("Server=.;Integrated Security=true;Initial Catalog=U2U"); conn.Open(); SqlCommand cmd = new SqlCommand ("INSERT INTO Alerts (Account,Message) VALUES('" + owner + "','" + message + "')",conn); cmd.ExecuteNonQuery(); conn.Close();}
您需要首先注册新的 Quick Alerts 传递信道,然后才能在门户网站上使用它。Microsoft.SharePoint.Portal.Alerts.DeliveryChannelCollection 类提供了两个注册和注销自定义信道的方法。
SharePoint Portal Server 2003 没有提供完成该任务的工具。您可以通过对 Microsoft.SharePoint.Portal.dll 以及含有自定义信道的程序集的引用,创建一个小型 Windows 应用程序(图 5)或控制台应用程序。
图 5. 用于注册或注销自定义信道的 Windows 应用程序
您可以使用晚绑定技术使工具变得更加通用,从而可以简单地指向您要注册的程序集 DLL。
TopologyManager tm = new TopologyManager(); PortalSite ps = tm.PortalSites[new Uri(your portal site url)]; PortalContext pc = PortalApplication.GetContext(ps); DeliveryChannelCollection.RegisterDeliveryChannel (pc, new QuickAlertChannel(),string.Empty);
RegisterDeliveryChannel 方法接受下列参数:PortalContext,对自定义传递信道的对象的引用,以及以字符串形式提供的可能的配置信息。
在执行前面的代码块以后,您必须重置您的 Web 服务器,并且重新启动 SharePoint Portal Alert 服务。信道的注册由 SharePoint Portal Server 2003 记录。您可以在 C:\Program Files\SharePoint Portal Server\Logs 文件夹找到一个 XXXX-ChannelInstaller.log。以下内容为其摘录:
0000038F UNK 00000000 00000BB4 Registering DeliveryChannel extension: QA Assembly name:CustomNotifications, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d64cb961d296a9a7 class name:CustomNotifications.QuickAlertChannel configuration: 0000042F UNK 00000000 00000BB4 DeliveryChannel extension: QA registered successfully Assembly name:CustomNotifications, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d64cb961d296a9a7 class name:CustomNotifications.QuickAlertChannel configuration:
可以使用 DeliveryChannelCollection 类的 UnregisterDeliveryChannel() 方法注销信道。 注册结果可以直接在主页上提供的自定义 Web 部件中看到(图 6)。
图 6. 在 SharePoint Portal Server 中注册的新传递信道
在成功注册该信道之后,用户在预订新报警时将看到该信道显示为第三选项(图 7)。请注意 SharePoint Portal Server 2003 默认情况下如何维护 UI 块(将生成一个复选框以便激活传递选项)。
图 7. 自定义传递选项(Quick Alerts 复选框)
在上述示例中,用户已经为门户网站主页中提供的 Events 列表创建了一个报警。在该列表中添加或修改事件会产生附加的第三个报警结果。报警将显示在用户的“我的网站”上。我们已经收到了一个电子邮件,并且我们还在自定义数据库中有了一项(图 8)。
图 8. 自定义数据库中的报警记录
用户可以安装 Quick Alerts 客户端应用程序,该程序会将自身安装到报警结果区域中,然后监视该表中是否有需要以吐司的形式传递给用户的新消息(图 9)。
图 9. 为报警弹出消息
您将经常需要在用户实际创建报警本身的同时捕获与该报警有关的特定信息。您可以在 NewAlert.aspx 页中完成该任务。
您已经在前面看到了从 DeliveryChannel 类派生的 QuickAlertsChannel 类如何覆盖 GetChannelControl() 方法。到现在为止,您只是简单地返回从基类获得的 DeliveryChannel.ChannelControl 引用。
然而,您可以创建自己的 ChannelControl 类。ChannelControl 类是一个 ASP.NET 服务器控件,带有一些与 Alerts 框架相关的扩展。您可以生成一个功能完整的 ASP.NET 服务器控件,并将其插入到报警页中。
以下内容为该类的摘录。
注 并未包含与状态管理有关的全部细节。
[ToolboxData("<{0}:QuickAlertControl runat=server> ")] public class QuickAlertControl : Microsoft.SharePoint.Portal.Alerts.DeliveryChannel.ChannelControl { bool selected; public override bool Selected { get { return this.selected; } } public override string ChannelId { get { return "QA"; } } public override Microsoft.SharePoint.Portal.Alerts.DeliveryChannelSettings Settings { get { return null; } set { } } CheckBox cb = null; HyperLink hl = null; protected override void CreateChildControls() { this.cb = new CheckBox(); this.cb.AutoPostBack = true; this.Controls.Add(this.cb); this.cb.CheckedChanged +=new EventHandler(cb_CheckedChanged); this.hl = new HyperLink(); this.hl.Text = "Download and install our Quick Alert Client Tool!"; this.hl.NavigateUrl = "http://localhost/downloads/quickalertclient.msi"; this.Controls.Add(this.hl); } protected override void RenderContents(HtmlTextWriter writer) { this.EnsureChildControls(); writer.RenderBeginTag(HtmlTextWriterTag.P); this.cb.RenderControl(writer); writer.Write(" Quick Alerts"); writer.RenderEndTag(); writer.RenderBeginTag(HtmlTextWriterTag.Ul); writer.RenderBeginTag(HtmlTextWriterTag.Li); this.hl.RenderControl(writer); writer.RenderEndTag(); writer.RenderEndTag(); } private void cb_CheckedChanged(object sender, EventArgs e) { this.selected = this.cb.Checked; } }
控件本身继承自 Microsoft.SharePoint.Portal.Alerts.DeliveryChannel.ChannelControl 类,这一点不能直接在对象模型内部看出来。当您从该类继承时,必须覆盖一些成员。然而,最重要的方法是 RenderContents(),通过该方法可以控制在用户能够激活 Quick Alerts 传递信道的块内到底显示哪些内容。
在图 10 中,您可以看到一个可能的自定义示例。用户可以激活报警,也可以下载小型客户端应用程序,以便轮询 SQL Server 数据库是否含有它需要显示的报警。
图 10. 覆盖由 SharePoint Portal Server 2003 生成的 UI 块
本文使用小型 Quick Alerts 示例介绍了创建您自己的自定义报警结果信道的基本步骤。除了由 SharePoint Portal Server 2003(“我的网站”上的“我的报警摘要”Web 部件和电子邮件消息)传递的两个报警结果以外,还可以通过一个类似于 Messenger 的小型弹出窗口来通知用户。
A Developer's Introduction to Web Parts
Building Web Parts for Microsoft SharePoint Products and Technologies (Part I)
Building Web Parts for Microsoft SharePoint Products and Technologies (Part II)
Building Web Parts for Microsoft SharePoint Products and Technologies (Part III)
Creating a System Tray Application
Microsoft SharePoint Portal Server 2003 Administration Guide
Microsoft SharePoint Products and Technologies 2003 Software Development Kit (SDK)
Patrick Tisseghem 是 U2U (一家总部位于布鲁塞尔的面向 .NET 的培训服务公司)的经营合伙人。他的主要专业领域为 .NET 框架以及与信息工作者有关的所有产品和技术。作为上述专业人士,他正在比利时、荷兰、卢森堡三国宣传Microsoft 的 SharePoint Portal Server 2003 和 Office 开发。
本文是与 A23 Consulting 合作撰写的。
本文地址:http://com.8s8s.com/it/it44387.htm