错误在某些环境
我尝试注册在SharePoint一个WebDeleting事件接收器注册的SharePoint WebDeleting事件接收器。这在我的开发环境中工作正常,但不在几个临时环境中。我得到的错误是“价值不在预期范围内”。下面是我使用的代码:错误在某些环境
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(web.Site.ID))
{
using (SPWeb elevatedWeb = elevatedSite.OpenWeb(web.ID))
{
try
{
elevatedWeb.AllowUnsafeUpdates = true;
SPEventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add(new Guid(MyEventReciverId));
eventReceiver.Type = SPEventReceiverType.WebDeleting;
Type eventReceiverType = typeof(MyEventHandler);
eventReceiver.Assembly = eventReceiverType.Assembly.FullName;
eventReceiver.Class = eventReceiverType.FullName;
eventReceiver.Update();
elevatedWeb.AllowUnsafeUpdates = false;
}
catch (Exception ex)
{
// Do stuff...
}
}
}
});
我意识到,我可以通过一个功能元素文件(我想现在这种做法)做到这一点,但更愿意用上述方法。
我在ULS日志中一直得到的错误是:
03/11/2010 17:16:57.34 w3wp.exe (0x09FC) 0x0A88 Windows SharePoint Services Database 6f8g Unexpected Unexpected query execution failure, error code 3621. Additional error information from SQL Server is included below. "The statement has been terminated." Query text (if available): "{?=call proc_InsertEventReceiver(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"
03/11/2010 17:16:57.34 w3wp.exe (0x09FC) 0x0A88 Windows SharePoint Services General 8e2s Medium Unknown SPRequest error occurred. More information: 0x80070057
任何想法?
更新 - 一些有趣的事情我已经学会...
我修改了代码执行以下操作:
- 我打电话EventReceivers.Add()未经GUID,因为大多数的例子我看到不这样做
- 一声事件接收器,因为大多数的例子,我看到做一个名称和序列号是
我部署以及与去ULS日志一些额外的跟踪语句和做得不够iisresets和清除我的组装GAC后这种变化,我开始看到在ULS日志我的新的跟踪语句和我不再有错误!
于是,我开始去背对着我的原代码,看看有什么变化究竟有帮助。我终于结束了在源代码控制中的原始版本,它仍然工作:-S。
因此,答案显然是,这是一些缓存的问题。但是,当我最初试图使它工作时,我尝试了IISRESET,重新启动了一些SharePoint服务OWSTimer(这个我相信运行事件hander,但可能不会涉及到事件注册,我得到错误),并且即使是重新启动,以确保没有组装缓存正在进行 - 并没有帮助过。
我上得去的唯一的事也许是下面的步骤,如:
- 清除包含注册码和事件处理程序类的程序集的GAC。
- 做一个IISRESET。
- 卸载WSP。
- 做一个IISRESET。
- 安装WSP。
- 做一个IISRESET。
为了让它工作,我从来没有做过重新启动或重新启动SharePoint服务,但我已经做了那些之前让它工作(在更改我的代码之前)。
我想我可以用Reflector挖掘更多的东西来看看我能找到什么,但是我相信你很快就会陷入死胡同(非托管代码)。我不知道什么可以坚持到旧的DLL?我无法想象SQL Server会以某种方式。即使如此,重新启动也会解决这个问题(整个服务器场,包括SQL Server在此环境中位于同一台计算机上)。
因此,看起来整个问题是通过提供GUID来创建事件接收器。
EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add(new Guid(MyEventReciverId));
现在我做:
EventReceiverDefinition eventReceiver = elevatedWeb.EventReceivers.Add();
不幸的是,这意味着,当我想了解如果事件已经被注册,我必须做类似下面的代码,而不是单一的一个衬垫。
// Had to use the below instead of: web.EventReceivers[new Guid(MyEventReceiverId)]
private SPEventReceiverDefinition GetWebDeletingEventReceiver(SPWeb web)
{
Type eventReceiverType = typeof(MyEventHandler);
string eventReceiverAssembly = eventReceiverType.Assembly.FullName;
string eventReceiverClass = eventReceiverType.FullName;
SPEventReceiverDefinition eventReceiver = null;
foreach (SPEventReceiverDefinition eventReceiverIter in web.EventReceivers)
{
if (eventReceiverIter.Type == SPEventReceiverType.WebDeleting)
{
if (eventReceiverIter.Assembly == eventReceiverAssembly && eventReceiverIter.Class == eventReceiverClass)
{
eventReceiver = eventReceiverIter;
break;
}
}
}
return eventReceiver;
}
它仍然不清楚为什么事情似乎徘徊,需要一些清理(IISRESET,重启等),因此,如果任何人有这个问题,记住这一点。
Hey Kirk-这个错误对我来说看起来非常愚蠢,实际上我认为它可能是一些SharePoint内部代码的已知问题。我知道我们在MS发布的SharePoint发布代码中有一个类似的问题,它应该在Dec.CU中修复。祝你好运 – Jeff 2010-03-12 01:05:55