SharePoint Web级Event Receiver部署触发异常问题求助
我之前遇到过几乎一模一样的问题!这大概率是因为你第一次部署的Site作用域事件接收器没有被彻底移除——即使后来换成Web作用域重新部署,旧的Site级绑定仍然残留在生产环境中,导致现在同时存在Site级(全局触发)和Web级(指定列表绑定)的两个接收器实例,才会出现"所有列表触发+指定列表触发两次"的现象。
结合你提供的配置文件,还有一个小细节需要注意:你的Elements.xml里两个接收器的Class属性不一致——第一个是IC___Event_Receiver.Email_Event.Email_Event(三个下划线),第二个是IC__Event_Receiver.Email_Event.Email_Event(两个下划线),这也可能导致部署时注册了两个逻辑上不同的接收器,加剧重复触发的问题。
下面是具体的解决步骤:
1. 先确认并清理残留的Site级事件接收器
用PowerShell连接生产环境的SharePoint服务器,执行以下命令查询站点级的绑定:
# 替换为你的生产站点URL $site = Get-SPSite "http://your-production-site-url" # 筛选目标事件接收器,注意匹配类名的模糊查询(兼容下划线差异) $siteReceivers = $site.EventReceivers | Where-Object { $_.Class -match "IC__Event_Receiver.Email_Event.Email_Event" } $siteReceivers | Select-Object Name, Type, Scope
如果查询结果里出现Scope为Site的记录,说明旧的Site级绑定确实残留了,直接删除:
foreach ($receiver in $siteReceivers) { Write-Host "Removing site-level receiver: $($receiver.Name)" $receiver.Delete() } $site.Update() $site.Dispose()
2. 检查并清理指定列表的重复绑定
接着检查目标列表的接收器是否有重复:
$web = Get-SPWeb "http://your-production-site-url/ISD" $list = $web.Lists.TryGetList("ICForm") $listReceivers = $list.EventReceivers | Where-Object { $_.Class -match "IC__Event_Receiver.Email_Event.Email_Event" } $listReceivers | Select-Object Name, Type, SequenceNumber
如果同一个Type(比如ItemAdded)出现多条记录,保留一条,删除其他重复项:
# 按Type分组,保留SequenceNumber最小的那条 $groupedReceivers = $listReceivers | Group-Object Type foreach ($group in $groupedReceivers) { if ($group.Count -gt 1) { $keepReceiver = $group.Group | Sort-Object SequenceNumber | Select-Object -First 1 $group.Group | Where-Object { $_ -ne $keepReceiver } | ForEach-Object { Write-Host "Removing duplicate list receiver: $($_.Name)" $_.Delete() } } } $list.Update() $web.Dispose()
3. 修复配置文件的类名不一致问题
打开你的Elements.xml,把两个接收器的Class属性统一为正确的命名空间(根据你的项目结构,应该是两个下划线的IC__Event_Receiver.Email_Event.Email_Event),避免部署时产生歧义。
4. 彻底清理并重新部署解决方案
先完全卸载旧的解决方案,再部署修正后的版本:
# 替换为你的解决方案名称 $solutionName = "your-solution-name.wsp" $webAppUrl = "http://your-production-webapp-url" # 卸载并移除旧解决方案 Uninstall-SPSolution -Identity $solutionName -WebApplication $webAppUrl -Confirm:$false Remove-SPSolution -Identity $solutionName -Confirm:$false # 部署新解决方案 Add-SPSolution "C:\path\to\your-updated-solution.wsp" Install-SPSolution -Identity $solutionName -WebApplication $webAppUrl -GACDeployment -Confirm:$false
最后在目标Web站点上重新激活你的IC - Event Receiver Feature。
额外注意事项
- SharePoint的事件接收器绑定不会随着解决方案卸载自动清理,尤其是当作用域变更时,必须手动检查残留;
- 部署前建议先在测试环境复刻问题并验证修复步骤,再操作生产环境;
- 如果后续需要变更作用域,一定要先完全移除旧的所有绑定,再部署新的版本。
内容的提问来源于stack exchange,提问作者nicker

