在某些环境中注册SharePoint WebDeleting事件接收器时出错

时间:2010-03-11 22:23:19

标签: sharepoint eventreceiver

我正在尝试在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   

有什么想法吗?


更新 - 我学到了一些有趣的事情......

我修改了我的代码以执行以下操作:

  • 我在没有GUID的情况下调用EventReceivers.Add(),因为我看到的大多数示例都没有这样做
  • 给事件接收者一个姓名和序列号,因为我看到的大多数例子都是这样做的

我将此更改与一些额外的跟踪语句一起部署到ULS日志中,在完成足够的iisresets并清除程序集的GAC后,我开始在ULS日志中看到我的新跟踪语句 我不再收到错误!

所以,我开始回到我原来的代码,看看究竟有什么变化帮助了。我最终得到了源代码控制中的原始版本,它仍然有效:-S。

所以答案显然是一些缓存问题。但是,当我最初试图让它工作时,我尝试了IISRESET,重新启动了一些SharePoint服务OWSTimer(我相信这会运行事件处理程序,但可能不参与我收到错误的事件注册),以及甚至重新启动以确保没有进行汇编缓存 - 而且之前没有帮助。

我唯一需要做的就是遵循以下步骤:

  1. 清除包含注册码和事件处理程序类的程序集的GAC。
  2. 执行IISRESET。
  3. 卸载WSP。
  4. 执行IISRESET。
  5. 安装WSP。
  6. 执行IISRESET。
  7. 为了让它正常工作,我从来没有重新启动或重新启动SharePoint服务,但是在完成它之前我已经完成了这些(在更改我的代码之前)。

    我想我可以用Reflector挖掘更多东西,看看我能找到什么,但我相信你很快就会陷入死胡同(非托管代码)。我想知道什么可以坚持旧的DLL?我无法想象SQL Server会以某种方式存在。即便如此,重新启动也会修复(整个服务器场,包括SQL Server在此环境中位于同一台计算机上)。

1 个答案:

答案 0 :(得分:0)

因此,似乎整个问题是通过提供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,重启等),所以如果有其他人有这个问题,请记住这一点。

相关问题