分享
 
 
 

在 SharePoint Portal Server 2003 中生成自定义报警结果信道

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

在 SharePoint Portal Server 2003 中生成自定义报警结果信道

发布日期: 7/23/2004 | 更新日期: 7/23/2004

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 的报警提供程序的详细信息。

我们将讨论创建、注册和使用自己的报警结果信道的基本步骤。然后,我们将通过自定义报警页来进一步考察更为高级的功能。

返回页首

从 DeliveryChannel 类开始

通知或报警借助于传送或报警结果信道传递给用户。默认情况下,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 部件,以显示用户已经在门户网站内创建的各种报警。您的 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 传递信道

现在,我们可以考察您如何创建自己的自定义传递信道。您将创建第三个传递信道,名为 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 中注册的新传递信道

返回页首

使用 Quick Alerts 信道

在成功注册该信道之后,用户在预订新报警时将看到该信道显示为第三选项(图 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 合作撰写的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有