2010-03-11 59 views
0

我嘗試註冊在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,但可能不會涉及到事件註冊,我得到錯誤),並且即使是重新啓動,以確保沒有組裝緩存正在進行 - 並沒有幫助過。

我上得去的唯一的事也許是下面的步驟,如:

  1. 清除包含註冊碼和事件處理程序類的程序集的GAC。
  2. 做一個IISRESET。
  3. 卸載WSP。
  4. 做一個IISRESET。
  5. 安裝WSP。
  6. 做一個IISRESET。

爲了讓它工作,我從來沒有做過重新啓動或重新啓動SharePoint服務,但我已經做了那些之前讓它工作(在更改我的代碼之前)。

我想我可以用Reflector挖掘更多的東西來看看我能找到什麼,但是我相信你很快就會陷入死衚衕(非託管代碼)。我不知道什麼可以堅持到舊的DLL?我無法想象SQL Server會以某種方式。即使如此,重新啓動也會解決這個問題(整個服務器場,包括SQL Server在此環境中位於同一臺計算機上)。

+0

Hey Kirk-這個錯誤對我來說看起來非常愚蠢,實際上我認爲它可能是一些SharePoint內部代碼的已知問題。我知道我們在MS發佈的SharePoint發佈代碼中有一個類似的問題,它應該在Dec.CU中修復。祝你好運 – Jeff 2010-03-12 01:05:55

回答

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,重啓等),因此,如果任何人有這個問題,記住這一點。