You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:17:47