2015-12-10 1 views
1

J'ai un Event Receiver qui est joint à une modification dans une liste d'éléments. Ce récepteur d'événements fait des choses qui consomment beaucoup de procédure. Je veux courir sous le processus OWSTIMER.EXE et non W3WP.EXE, il semble que dans Sharepoint 2013 les récepteurs d'événements fonctionnent sous W3WP.EXE. J'ai trouvé this question parce que je voulais faire la même chose, mais personne ne répond. En raison de ce problème avec les différents processus que je veux exécuter sous, j'ai créé un TimerJobthis way qui regarde les éléments sur ma liste et fait la même chose qu'avant fait le premier récepteur d'événement. Cela fonctionne, et fonctionne sous OWSTIMER.EXE comme je le veux. Maintenant, la chose que je veux faire est, exécute ce TimerJob de mon ancien récepteur d'événement (pas celui que je crée pour exécuter ce timerJob, comme dans l'exemple), juste parce que cette liste ne changera pas fréquemment, et je veux le processus en cours, quand il change. (Ce que je veux, est Hacking SharePoint pour exécuter un Event Receiver dans OWSTIME.EXE)Exécuter un TimerJob à partir d'un événement de liste de manipulation d'un récepteur d'événements

Puis-je faire cela?

Merci d'avance.

dans l'exemple, le récepteur d'événements:

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; 
      } 
     } 

mon Event Receiver (cette course onther 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? 

      } 

Répondre

1

réponse est Oui et Non, Oui parce programmaticalement il est possible d'exécuter travail du minuteur utilisant le code ci-dessous

var yourjob = (from jobDefinition in WebApp.JobDefinitions 
           where jobDefinition.DisplayName == "oyu job name" 
           select jobDefinition).SingleOrDefault(); 
if (yourjob != null) 
{ 
    yourjob.RunNow(); 
} 

Non parce que, pour utiliser RunNow(), Vous avez besoin du privilège d'administrateur de la batterie. Et vous ne pouvez pas utiliser RunWithElevatedPrivilages car lorsque vous utilisez la méthode RunWithElevatedPrivileges, le code s'exécute dans le contexte du compte du pool d'applications, qui n'a généralement pas de droits d'administrateur de batterie.

+0

Oh, ce sont de mauvaises nouvelles, parce que je ne vais pas pouvoir changer quoi que ce soit. Droite? – Tupac

+1

Je déteste sharepoint en ce moment. – Tupac