SharePoint 2013 Foundation 即时警报仅触发一次问题求助
我之前在SharePoint 2013 Foundation开发时也碰到过一模一样的问题——用C#创建的即时字段变更警报,明明改了好几次字段,用户却只收到一封邮件。后来折腾了好一阵,结合官方文档和实际调试,总结出几个可行的解决办法,你可以试试:
1. 检查并修正C#创建警报时的核心属性
很多时候问题出在创建警报时的参数设置不对,尤其是和通知频率、事件监听相关的属性:
- 必须确保AlertFrequency设为
SPAlertFrequency.Immediate,这是即时警报的核心标识 - 正确设置EventType和EventMask,明确监听字段变更事件
- 开启AlwaysNotify属性,强制SharePoint即使字段连续变更也发送通知
给你一个修正后的C#代码示例:
using (SPSite site = new SPSite("http://你的站点URL")) { using (SPWeb web = site.OpenWeb()) { SPList targetList = web.Lists["目标列表名称"]; SPUser alertUser = web.SiteUsers["domain\\用户名"]; SPAlert newAlert = web.Alerts.Add(); newAlert.Title = "字段变更即时通知"; newAlert.AlertType = SPAlertType.List; newAlert.List = targetList; newAlert.User = alertUser; newAlert.AlertFrequency = SPAlertFrequency.Immediate; // 关键:即时频率 newAlert.EventType = SPEventType.FieldChange; // 指定监听字段变更 newAlert.EventMask = (int)SPEventType.FieldChange; // 确保事件掩码匹配 newAlert.AlertTemplate = web.AlertTemplates[SPAlertTemplateType.GenericList]; newAlert.AlwaysNotify = true; // 强制每次变更都通知 newAlert.Update(); } }
2. 缩短即时警报计时器作业的间隔
SharePoint的「即时警报计时器作业(Immediate Alerts Job)」默认有一个批处理间隔(通常是5分钟),在这个窗口内的多次变更会被合并成一封邮件发送。你可以通过代码或PowerShell缩短这个间隔:
PowerShell方式:
$site = Get-SPSite "http://你的站点URL" $job = $site.WebApplication.JobDefinitions | Where-Object {$_.Name -eq "Immediate Alerts"} $job.Interval = [System.TimeSpan]::FromMinutes(1) # 改为1分钟间隔 $job.Update() $site.Dispose()
C#代码方式:
using (SPSite site = new SPSite("http://你的站点URL")) { SPWebApplication webApp = site.WebApplication; foreach (SPJobDefinition job in webApp.JobDefinitions) { if (job.Name == "Immediate Alerts") { job.Interval = TimeSpan.FromMinutes(1); job.Update(); break; } } }
3. 自定义警报模板禁用聚合
默认的警报模板可能开启了变更聚合,你可以修改模板强制每次变更单独发邮件:
- 备份
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\XML\AlertTemplates.xml - 复制一份作为自定义模板,找到对应列表类型的
<ImmediateNotification>节点,添加或修改<DigestNotification>false</DigestNotification> - 用stsadm命令部署自定义模板:
stsadm -o updatealerttemplates -filename "C:\你的自定义模板路径.xml" -url "http://你的站点URL"
- 重启IIS生效
4. 字段变更事件接收器中手动触发通知
如果上述方法都不生效,可以在字段变更的事件接收器里直接调用警报的Notify方法,绕过计时器作业强制发邮件:
public override void ItemUpdated(SPItemEventProperties properties) { base.ItemUpdated(properties); SPWeb web = properties.Web; SPList list = properties.List; SPUser targetUser = web.SiteUsers["domain\\目标用户名"]; // 找到用户对应的即时警报 SPAlert userAlert = targetUser.Alerts.Cast<SPAlert>() .FirstOrDefault(a => a.ListId == list.ID && a.AlertFrequency == SPAlertFrequency.Immediate); if (userAlert != null) { // 手动触发通知 userAlert.Notify(properties.ListItem, SPEventType.FieldChange, SPAlertEventType.Modify); } }
额外排查点
- 检查用户邮箱是否正常,有没有被邮件服务器当成垃圾邮件拦截
- 确认SharePoint的 outgoing email 设置正确(Foundation版本可以通过PowerShell查看)
- 查看ULS日志,搜索「Alert」相关条目,排查是否有警报处理失败的错误信息
内容的提问来源于stack exchange,提问作者Gurgen Hovsepyan
相关产品推荐
相关产品推荐

