在SharePoint的log中有时候会出现这样的错误信息:
“Couldnot load file or assembly 'AssemblyName,Version=..., Culture=neutral, PublicKeyToken=... ...' or one ofits dependencies. The system cannot find the file specified.”
从这里可以判断出某个代码集找不到了,如果在Event Viewer中可以看到Event ID为6644的错误,例如:
Event Type: Error
Event Source:
Event Category: General
Event ID: 6644
Date: 1/10/2012
Time: 10:26:44 AM
User: N/A
Computer:
Description:
这时就可以断定SharePoint系统中出现了无效的Event Receiver了(即Orphaned Event Receiver)。
无效的Event Receiver就是其所引用的代码集丢失了的event receiver,大家知道在定义Event Receiver的时候,需要指定所引用的代码集,如果执行event receiver的时候,找不到代码集,就会出现这样的错误信息。
出现问题的可能原因是:一般在feature被激活的时候通过代码创建event receivers,在deactivate feature的时候,删除event receivers,如果没有deactivate feature,直接在管理中心retract或者delete solution,就可能造成这样的错误。
一般解决问题的方法就是重新部署solution,或者彻底删除无效的event receivers。重新部署就没什么可以说的了,如果是想删除这些event receivers,首先需要找到都是哪些list中的event receivers是无效的,这里有一个方法,可以在内容数据库中执行以下查询语句,一次查找出来所有的跟某个代码集有关的无效event receivers:
select webs.Title, Alllists.tp_Title from EventReceivers with (nolock)
inner join Webs on EventReceivers.WebId = webs.Id
inner join AllLists on EventReceivers.HostId = Alllists.tp_ID
where Assembly like '%代码集的名字%'
其中表“EventReceivers”中保存了所有的event receiver的信息,其中的“Assembly”列中保存的是其所引用的代码集的名字。因为“EventReceivers”表中只保存了站点和列表的id,所以要连接“Webs”和“AllLists”表来获得站点和列表的名字。
这样就可以找到所有的与某个代码集相关的无效event receivers了,然后可以使用这个工具,将它们删除干净:EventReceiver Manager
也可以使用SharePoint Management Shell命令找出无效的event receivers,并将它们删除,参见:点击打开链接