我有Event Receiver
附加到项目列表中的某些更改。这个事件接收器做的事情消耗了很多程序。我想在流程OWSTIMER.EXE
而非W3WP.EXE
下运行它,似乎在Sharepoint 2013
中,事件接收器在W3WP.EXE
下运行。我发现this question因为我想做同样的事,但没有人回答。
由于我想要运行的不同进程存在这个问题,我创建了一个TimerJob
this way来查看列表中的项目并执行与第一个事件接收器之前相同的操作。这是有效的,并且按照我想要的方式在OWSTIMER.EXE
下运行。
现在,我想要做的是,从我的旧事件接收器(不是我创建的那个运行这个timerJob,就像在示例中)执行TimerJob,只是因为这个列表不会经常更改,我想要进程运行,当它发生变化时。
(我想要的是黑客SharePoint
在Event Receiver
中运行OWSTIME.EXE
我能这样做吗?
提前致谢。
在示例中,事件接收者:
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
try
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
SPSite site = properties.Feature.Parent as SPSite;
DeleteExistingJob(JobName, parentWebApp);
CreateJob(parentWebApp);
});
}
catch (Exception ex)
{
throw ex;
}
}
我的Event Receiver
(运行于w3wp.exe
):
public override void ItemUpdated(SPItemEventProperties properties)
{
base.ItemAdded(properties);
//here it does the same that do the Timer Job(but with that item)
//here I want to execute my TimerJob. This is possible?
}
答案 0 :(得分:1)
答案是是,否,是,因为从语法上可以使用以下代码运行计时器作业
var yourjob = (from jobDefinition in WebApp.JobDefinitions
where jobDefinition.DisplayName == "oyu job name"
select jobDefinition).SingleOrDefault();
if (yourjob != null)
{
yourjob.RunNow();
}
否,因为使用RunNow(),您需要服务器场管理员权限。
并且您不能使用RunWithElevatedPrivilages,因为当您使用RunWithElevatedPrivileges方法时,代码在应用程序池帐户的上下文中运行,该帐户通常没有服务器场管理员权限。
答案 1 :(得分:0)
SharePoint工作项计时器作业可以帮助您。 在这里你可以找到一个例子: http://sharepintblog.com/2011/12/12/spworkitemjobdefinition-a-different-kind-of-sharepoint-timer-job/