Automatisch workflow starten bij aanmaken item via code

Enige tijd geleden moest ik iets maken voor een klant dat vanuit een ‘gewone’ ASP.NET pagina een item aanmaakte in een Sharepoint lijst. Op zich geen probleem, zeker niet omdat er in dezelfde application pool werd gewerkt, waardoor er gewoon gebruik gemaakt kon worden van de RunWithElevatedPrivileges die Sharepoint biedt.

Dit had ik dan ook al snel voor elkaar, maar bij het testen bleek dat de workflow van de lijst niet automatisch werd gestart. Aan de lijst hing namelijk een workflow die automatisch zou moeten starten wanneer er een nieuw item in de lijst wordt aangemaakt.

Na wat zoeken ben ik er achter gekomen dat dit ’normaal’ gedrag is en er een work-around voor is, namelijk door de workflow ook zelf via code op te starten. Als je dit weet is dat op zich prima, maar ook dat levert een foutmelding op. De melding was (vrij vertaald): ‘Failed to start (retrying)’. Enkele minuten later start de workflow alsnog. Wat wel vervelend is, is dat de gebruiker dit niet kan zien, omdat de status continu hetzelfde blijft, totdat de workflow is beeindigd.

Zelf kan ik hier prima mee leven, zeker omdat ik geen alternatief had.

Vandaag kreeg ik de melding dat er nog iets anders mis ging in het formulier. Na deze melding al vrij snel opgelost te kunnen hebben, heb ik toch even verder gekeken naar dit bovenstaande probleem. Na even zoeken kwam ik langs een post op het MSDN forum waarop staat dat je de workflow ook via de Sharepoint webservices kunt gaan opstarten. Logisch, maar had niet verwacht dat dat een oplossing zou zijn.

Als PoC heb ik de code dus omgeschreven om gebruik te maken van de Sharepoint webservice, gemixed met het object model. Tijdens het doorlopen van de code zag ik dat alles nu wel vlekkeloos werkt.

Wat ik nu gedaan heb is het volgende (versimpeld voorbeeld):

private bool StartWorkflow(SPList list, SPListItem listItem, SPWorkflowAssociation wf)
{
    bool
    started = false;

    WorkflowService.Workflow workflowService = new WorkflowService.Workflow();
    workflowService.Url = webserviceLink;
    workflowService.UseDefaultCredentials = true;
    workflowService.Credentials = new NetworkCredential(ADMIN_USERNAME, ADMIN_PASSWORD, ADMIN_DOMAIN);
    workflowService.PreAuthenticate = true;

    XmlDocument workflowParameters = new XmlDocument();
    workflowParameters.LoadXml(wf.AssociationData);
    workflowService.StartWorkflow(String.Format("https://testsite/{0}", listItem.Url), wf.Id, workflowParameters);
    return started;
}

Op deze manier maak je dus gebruik van de webservice (WorkflowService = vti_bin/Workflow.asmx).

Het is nog niet getest door ons testteam en staat nog niet in productie, maar ziet er toch naar uit dat dit het ‘probleem’ heeft opgelost van de vage melding. Nu krijg ik alleen maar een juiste status te zien van de workflow en hoef ik ook niet 5 minuten te wachten voordat de workflow opstart (Sharepoint timer).


Share