我想注册一个WebDeleting事件接收内SharePoint。这一工作的现在我的发展环境,但不是在几个暂存环境。错我回来的是"价值不属于预期的范围。".这里是代码,我在使用:

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...
            }
        }
    }
});

我意识到我可以这样做是通过一个特征元素的文件(我在尝试这种做法现在的),但是会更喜欢使用上述方法。

错误我一贯得到承载日志是:

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.添加()没有GUID由于大多数例子,我看到不这样做
  • 给了事件的接收器的名称和序列号,因为大多数例子,我看到那样做

我部署了这种变化伴随着一些额外的痕迹的陈述,去承载日志和后做足够的iisresets和清除GAC的我会的我开始看到我的痕迹的陈述中承载日志 我不再得到了错误!

因此,我开始为回去对我的原始代码看看有什么改变完全有帮助。我终于结束了原来的版本源的控制,它仍然工作:-S.

所以答案是清楚的,这是一些缓存的问题。但是,当我最初试图得到它的工作中,我试图IISRESETs,重新启动一些SharePoint服务OWSTimer(这一点,我相信运行事件处理程序,但可能不是事件中涉及的登记我在哪里得到的错误),并甚至重新启动,以确保不会缓存在-这并没有帮助。

我唯一要去上也许是下列步骤,如:

  1. 清除GAC的组件包含登记的代码和事件处理程序类。
  2. 做IISRESET.
  3. 卸载WSP。
  4. 做IISRESET.
  5. 安装WSP。
  6. 做IISRESET.

得到它的工作我从来没有重新启动或重新启动SharePoint服务,但是我做了那些之前得到它的工作(在改变我的代码)。

我想我可以挖掘更多的反光,看看有什么我可以找到,但是我相信你会得到一个死胡同(管理的代码)相当快。我不知道什么可以保持到老DLL?我不能想象SQL服务器将在一些方式。即便如此,一个重新启动将具有固定的,(整个农场,包括SQL服务器都在同一台机器,在这种环境)。

有帮助吗?

解决方案

因此,它的出现,整个问题是创造的事件接收通过提供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,重新启动,等等。) 因此,如果任何人有这种问题记住这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top