如何只通过Sandboxed Solution启动一个定时执行的操作
假如你的客户告诉你,你只能在服务器上部署沙盒解决方案(Sandboxed Solution),除此之外不能再在服务器上部署任何自定义代码。然后,客户接着告诉你,他们还需要在服务器上定期进行某种自动化检查,而且这是一个必需的需求。这时你就会犯难了。由于Sandboxed的限制,你没法向服务器上注册能够定时运行的计时器作业(Timer Job),但是客户的需求又要求能够在服务器上定期的自动执行某种操作,嗯,有没有什么办法能实现这个目标呢?
在一个SharePoint网站中,是有一种东西能定期自动执行的,这就是SharePoint内置的信息管理策略(Information Management Policy)功能。信息管理策略可以让你为某个列表的数据指定一个过期策略,然后在列表项到达某个时间点的时候(比如,在列表项被创建后1个星期),执行某个特定操作(比如,启动一个自定义工作流)。
接下来我来演示如何在一个SharePoint网站中,利用信息管理策略来实现定时执行某个自定义操作。首先,在网站中创建一个辅助列表,比如“定时作业辅助列表”,打开列表设置,然后点击“信息管理策略设置”。
选择为“项目”内容类型设置策略,接着就打开了策略设置界面。在界面中,选中“启用保留”,然后点击“添加保留阶段”。
在打开的对话框中,设置策略激活的时间,比如,在创建日期1天之后,这样这个保留策略会在一个列表项被添加进来1天后自动激活。然后在操作下拉框中选择“启动工作流”,这样你就可以选择一个SharePoint Designer创建的自定义工作流了。截图上的“激活定时作业”流程,是我在SharePoint Designer里面创建的一个工作流。在下方的定期区域中,可以选择让保留策略按照指定的周期,重复执行。这样,这个自定义工作流就会每天都自动执行一次。
但是SharePoint Designer工作流不能算是自定义代码呀!你如果要这样说,那么你可以在网站中再创建第二个辅助列表,比如起名为“定时作业激活列表”,然后在定期执行的工作流中只放一个操作:在那个“定时作业激活列表”中创建一个列表项。
然后,你可以在Sandboxed Solution中,为“定时作业激活列表”绑定上一个事件处理程序。于是最终,只要你向第一个辅助列表,“定时作业辅助列表”中添加一个列表项(只需要最开始手工添加一个列表项),就会按照下面的步骤激活一个每天都定时自动执行的事件:
(1) 手工向“定时作业辅助列表”添加一个列表项 –> (2) 1天后,信息管理策略的保留策略被激活 -> (3) 保留策略激活后,启动我们的自定义工作流 -> (4) 自定义工作流向“定时作业激活列表”中添加一个列表项 -> (5) “定制作业激活列表”上绑定的事件处理程序被激活,执行我们写在事件处理程序中的代码 -> ( 6 ) 1天后,信息管理策略的保留策略又会被重复激活,回到第(3)步
当然,这个方法也是有限制的。第一个限制,就是保留策略的最短定时周期就是1天,不能再短于1天了。其次,保留策略实际上也是被一个系统的计时器作业定时来执行的,这个系统计时器作业执行的时间不一定正好匹配我们的需求(但是如果你有服务器场管理权限,可以修改这个计时器作业的运行周期)。最后,由于代码是放在事件处理程序里面,而且是在沙盒中运行,你不能在里面做一个需要长时间运行才能完成的操作。