近来在Sharepoint的开发中,用户要求用代码设置通知我功能,因为在每个站点中设置通知我时,用户不能多选,只能一个列表一个列表的选择,用户嫌太多列表时麻烦,所以给用户提出说只要用户选择了站点,系统自动遍历该站点下的列表,设置用户的通知,代码很简单,就是用SPAlert类就可以了,开始Demo代码执行也很快,但把代码给程序人员后,程序人员说执行速度慢,页面超时,开始以为是列表太多,页面响应时间短,计划改成后台的Job来跑,又试着写了代码准备测试,用户的主站点下有10个产品子站点,每个产品子站点还有一个子站点,在测试环境一跑代码,完了,慢... 用一个人的账户测试了一下,设完所有产品的通知,要30分钟,这肯定不行,查原因吧。
发现是执行SPalert.update() 这句话时慢,要20多秒, 为啥啊?
通过查sdk,发现还有一个带false的update方法,用这个一试,哈哈,快如闪电,原来用30分钟的,现在一闪而过。
原来如此! 默认用update()方法时要给用户发一封邮件的,告诉用户已经设置某某列表的通知,而加false参数的这个不给用户发通知,之所以慢是因为测试环境的外发邮件是随便设置了一个,并不能真正的发送邮件,导致的慢,开始本机快是因为本机同时设置了SMTP服务器,所以没有发现慢,而本来我也不需要在设置时给用户发送邮件,20多个站点,列表很多,给用户发送邮件,用户不烦死啊,所以,我就应该用带false参数的这个!
代码如下:
public static void Addalert(string ProductName,string strUrl,string userId)
{
using (SPSite site = new SPSite(strUrl))
{
Console.WriteLine("--\t1 "+System.DateTime.Now.ToLongTimeString());
using (SPWeb web = site.OpenWeb())
{
Console.WriteLine("--\t\t2 " + System.DateTime.Now.ToLongTimeString());
foreach (SPList list in web.Lists)
{
Console.WriteLine("--\t\t\t3 " + System.DateTime.Now.ToLongTimeString());
if (!list.Hidden)
{
SPUser user = web.SiteUsers[userId];
SPAlert spAlert = user.Alerts.Add();
spAlert.Title = "SPS系统" + ProductName + "通知列表" + list.Title ;
spAlert.EventType = SPEventType.All;
spAlert.AlertFrequency = SPAlertFrequency.Immediate;
spAlert.AlertType = SPAlertType.List;
spAlert.List = list;
spAlert.User = user;
SPAlertTemplate newTemplate = new SPAlertTemplate();
newTemplate.Name = "SPAlertTemplateType.GenericList";
spAlert.AlertTemplate = newTemplate;
spAlert.Update(false);
}
Console.WriteLine("--\t\t\t\t4 " + System.DateTime.Now.ToLongTimeString());
}
}
}
}
private static void RemoveAlert(string siteURLvalue,string userId)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite _site = new SPSite(siteURLvalue))
{
SPWeb _web = _site.OpenWeb();
_site.AllowUnsafeUpdates = true;
_web.AllowUnsafeUpdates = true;
//SPUser _currentUser = SPContext.Current.Web.CurrentUser;
SPUser _currentUser = _web.EnsureUser(userId);
SPAlertCollection AlertLists = _web.EnsureUser(_currentUser.LoginName).Alerts;
int AlertNum = AlertLists.Count;
for (int alertIndex = 0; alertIndex < AlertNum; alertIndex++)
{
AlertLists.Delete(0);
}
_web.Update();
_web.AllowUnsafeUpdates = false;
_site.AllowUnsafeUpdates = false;
}
});
}