在网上看到一篇文章说跟踪ItemUpdated,执行了10次,特验证一次,结果真的是执行10次。代码如下:
我以为是不同代码调用造成的,就像SPSecurity.RunWithElevatedPrivileges,结果使用注释掉和没有注释掉的代码实验,结果是一样的。
更新一次item系统事件记录了10次。
更新前样子:

更新后样子:

恩,就是10次。。。不知道您是否在意过这个地方呢,呵呵。
我想,是不是SPListItem的Update方法重新引发了ItemUpdated事件导致了死循环,而MOSS又有某种机制,使得这种循环只发生10次就退出。
当然,这只是我的猜想,没有真凭实据,如果您知道,麻烦您告诉我,谢谢。
这个问题的解决方法也是很简单,就是使用DisableEventFiring和EnableEventFiring这两个方法,在那篇文章中有说明,下面的留言也有参考URL,代码就象下面这样:
更改代码后,再试,正常。
相关文章在这里:
http://www.sharepointsecurity.com/blog/sharepoint/sharepoint-2007-development/sp-event-recievers-firing-10-times-on-purpose/
 1 public class ListEventTest : SPItemEventReceiver
public class ListEventTest : SPItemEventReceiver
2 {
    {
3 public override void ItemUpdated(SPItemEventProperties properties)
        public override void ItemUpdated(SPItemEventProperties properties)
4 {
        {
5 try
            try
6 {
            {
7 //using (SPWeb web = properties.OpenWeb())
                //using (SPWeb web = properties.OpenWeb())
8 //{
                //{
9 //    SPList list = web.Lists["testlist"];
                //    SPList list = web.Lists["testlist"];
10 //    SPListItem item = list.GetItemById(properties.ListItemId);
                //    SPListItem item = list.GetItemById(properties.ListItemId);
11 //    item["Title"] = "updated_" + item["Title"].ToString();
                //    item["Title"] = "updated_" + item["Title"].ToString();
12 //    item.Update();
                //    item.Update();
13 //    System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
                //    System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
14 //}
                //}
15 SPListItem item = properties.ListItem;
                SPListItem item = properties.ListItem;
16 item["Title"] = "updated_" + item["Title"].ToString();
                item["Title"] = "updated_" + item["Title"].ToString();
17 item.Update();
                item.Update();
18 System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
                System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
19 }
            }
20 catch (Exception ex)
            catch (Exception ex)
21 {
            {
22 System.Diagnostics.EventLog.WriteEntry("test event", ex.ToString());
                System.Diagnostics.EventLog.WriteEntry("test event", ex.ToString());
23 }
            }
24 }
        }
25 }
    }
 public class ListEventTest : SPItemEventReceiver
public class ListEventTest : SPItemEventReceiver2
 {
    {3
 public override void ItemUpdated(SPItemEventProperties properties)
        public override void ItemUpdated(SPItemEventProperties properties)4
 {
        {5
 try
            try6
 {
            {7
 //using (SPWeb web = properties.OpenWeb())
                //using (SPWeb web = properties.OpenWeb())8
 //{
                //{9
 //    SPList list = web.Lists["testlist"];
                //    SPList list = web.Lists["testlist"];10
 //    SPListItem item = list.GetItemById(properties.ListItemId);
                //    SPListItem item = list.GetItemById(properties.ListItemId);11
 //    item["Title"] = "updated_" + item["Title"].ToString();
                //    item["Title"] = "updated_" + item["Title"].ToString();12
 //    item.Update();
                //    item.Update();13
 //    System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
                //    System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");14
 //}
                //}15
 SPListItem item = properties.ListItem;
                SPListItem item = properties.ListItem;16
 item["Title"] = "updated_" + item["Title"].ToString();
                item["Title"] = "updated_" + item["Title"].ToString();17
 item.Update();
                item.Update();18
 System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
                System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");19
 }
            }20
 catch (Exception ex)
            catch (Exception ex)21
 {
            {22
 System.Diagnostics.EventLog.WriteEntry("test event", ex.ToString());
                System.Diagnostics.EventLog.WriteEntry("test event", ex.ToString());23
 }
            }24
 }
        }25
 }
    }我以为是不同代码调用造成的,就像SPSecurity.RunWithElevatedPrivileges,结果使用注释掉和没有注释掉的代码实验,结果是一样的。
更新一次item系统事件记录了10次。
更新前样子:

更新后样子:

恩,就是10次。。。不知道您是否在意过这个地方呢,呵呵。
我想,是不是SPListItem的Update方法重新引发了ItemUpdated事件导致了死循环,而MOSS又有某种机制,使得这种循环只发生10次就退出。
当然,这只是我的猜想,没有真凭实据,如果您知道,麻烦您告诉我,谢谢。
这个问题的解决方法也是很简单,就是使用DisableEventFiring和EnableEventFiring这两个方法,在那篇文章中有说明,下面的留言也有参考URL,代码就象下面这样:
1 SPListItem item = properties.ListItem;
SPListItem item = properties.ListItem;
2 item["Title"] = "updated_" + item["Title"].ToString();
item["Title"] = "updated_" + item["Title"].ToString();
3 this.DisableEventFiring();
this.DisableEventFiring();
4 item.Update();
5 this.EnableEventFiring();
this.EnableEventFiring();
 SPListItem item = properties.ListItem;
SPListItem item = properties.ListItem;2
 item["Title"] = "updated_" + item["Title"].ToString();
item["Title"] = "updated_" + item["Title"].ToString();3
 this.DisableEventFiring();
this.DisableEventFiring();4 item.Update();
5
 this.EnableEventFiring();
this.EnableEventFiring();更改代码后,再试,正常。
相关文章在这里:
http://www.sharepointsecurity.com/blog/sharepoint/sharepoint-2007-development/sp-event-recievers-firing-10-times-on-purpose/
 
 
 
                    
                 
 
    
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号