Wf: exemple de workflow séquentiel web

Soyez le premier à donner votre avis sur cette source.

Vue 29 600 fois - Téléchargée 2 316 fois

Description

Important : cette source nécessite Windows Workflow Foundation Beta 2 ainsi que le Framework 2.0 pour fonctionner.

Cette source présente un exemple de Workflow Séquentiel humain et répond à plusieurs problématiques auquel j?ai été confronté :
- Utiliser Windows Workflow Foundation dans un projet Web, en insistant sur l?aspect communication application Web -> Workflow à plusieurs étapes du cycle de vie du Workflow (sans hoster le Workflow via des Webservices).
- Faire démarrer un Workflow par un utilisateur, le mettre en pause et le faire réactiver par un autre utilisateur (tout en le faisant persister dans SQLServer, dans le cas ou plusieurs jours se passent entre les deux actions).
- Mettre en place une gestion de timeout

Cette source a servit de base pour un projet contenant un Workflow de validation d?utilisateurs, des modifications étant appliquées au niveau du compte de l?utilisateur et des Emails étant envoyés lors de chaque étape.

Fonctionnement :
Pour faire fonctionner cette source, et surtout la gestion de la persistance dans SQLServer 2005 Express, vous devez
- Ajouter une base de données « Database.mdf » dans le répertoire App_Data du projet ASPNETWorkflowExemple
- Exécuter les scripts « sqlPersistenceService_logic.sql » et « sqlPersistenceService_schema.sql » dans cette base (ils sont présents dans le projet DBScripts, il suffit de faire click droit / run dessus).

Composition :
- ASPNETWorkflowExemple contient l?application Web
- DBScripts les scripts de persistance
- testWorkflow le workflow
- WorkflowComm l?interface de communication

Utilisation :
Ensuite, une fois l?application compilée, deux pages sont à votre disposition :
- Default.aspx pour démarrer des instances de Workflow
- Validation.aspx pour reprendre des instances en cours et les terminer

Attention, il s?agit d?un exemple, le Workflow ne fait rien d?autre que de « logger » les étapes dans lesquelles il passe dans le fichier « C:\WorkflowLOG.txt»
Les sources sont commentées (quelques extraits ci dessous), n'hesitez pas a poser des questions suite à cette source.

Source / Exemple :


protected void bt_start_Click(object sender, EventArgs e)
{
    //récuperation du runtime courant 
    WorkflowRuntime workflowRuntime = WorkflowWebRequestContext.Current.WorkflowRuntime;

    //creation et activation d'une instance de workflow dans le runtime
    WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(testWorkflow.MyWorkflow));
    workflowInstance.Start();

    //affichage de l'instance de ce workflow
    lb_guidInstance.Text = workflowInstance.InstanceId.ToString();
}

protected void bt_accepte_Click(object sender, EventArgs e)
{
    //recuperation du service du communication et du service d'echange de données
    ExternalDataExchangeService dataService = (ExternalDataExchangeService)WorkflowWebRequestContext.Current.WorkflowRuntime.GetService(typeof(ExternalDataExchangeService));
    WorkflowCommunicationData communicationDataService = (WorkflowCommunicationData)dataService.GetService(typeof(WorkflowCommunicationData));

    //envoie des données au Workflow (validation)
    communicationDataService.RedemarreWorkflow(new Guid(tb_resumeWK.Text), true);        
}

protected void bt_refuse_Click(object sender, EventArgs e)
{
    Type t = typeof(ExternalDataExchangeService);
    ExternalDataExchangeService dataService = (ExternalDataExchangeService)WorkflowWebRequestContext.Current.WorkflowRuntime.GetService(t);
    WorkflowCommunicationData communicationDataService = (WorkflowCommunicationData)dataService.GetService(typeof(WorkflowCommunicationData));

    //envoie des données au Workflow (refus)
    communicationDataService.RedemarreWorkflow(new Guid(tb_resumeWK.Text), false);    
}

.....

// Message passé entre l'application host et le workflow (doit etre Serializable)
[Serializable]
public class workflowDataEventArgs : ExternalDataEventArgs
{
    bool _accepte;

    public workflowDataEventArgs(Guid instanceId, bool accepte)
        : base(instanceId)
    {
        _accepte = accepte;
    }

    public bool Accepte
    {
        get
        {
            return this._accepte;
        }
        set
        {
            this._accepte = value;
        }
    }
}

// service d'echange des donnees
[ExternalDataExchange]
public interface IWorkflowData
{
    event EventHandler<workflowDataEventArgs> RepriseWorkflow;
}

....

/// <summary>
/// Summary description for StartDataExchangeService
/// </summary>
public static class StartDataExchangeService
{
    public static void StartOrNot()
    {
        //recuperation du runtime courant
        WorkflowRuntime workflowRuntime = WorkflowWebRequestContext.Current.WorkflowRuntime;

        //si jamais le service de communication n'existe pas
        if (workflowRuntime.GetService(typeof(ExternalDataExchangeService)) == null)
        {

            //on cree un nouveau service de communication et on l'ajoute au runtime
            ExternalDataExchangeService dataService = new ExternalDataExchangeService();
            workflowRuntime.AddService(dataService);

            //on specifie notre service de communication de donnees
            WorkflowCommunicationData communicationDataService = new WorkflowCommunicationData();
            dataService.AddService(communicationDataService);
        }
    }
}

/// <summary>
/// Implementation de IWorkflowData representant les données echangées
/// </summary>
public class WorkflowCommunicationData : WorkflowComm.IWorkflowData
{
    public event EventHandler<WorkflowComm.workflowDataEventArgs> RepriseWorkflow;

    public void RedemarreWorkflow(Guid instanceID, bool validation)
    {
        if (RepriseWorkflow != null)
            RepriseWorkflow(null, new WorkflowComm.workflowDataEventArgs(instanceID, validation));
    }
}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
19
Date d'inscription
mardi 27 février 2007
Statut
Membre
Dernière intervention
23 janvier 2009

bonjour, je suis un nouveau membre...
j'ai essayé d'utiliser cet exemple pour commencer avec workflow foundation, mais il comporte des erreurs...
"The type or namespace name 'ExternalDataEventArgs' could not be found (are you missing a using directive or an assembly reference?)"
et
"The type or namespace name 'WorkflowComm' could not be found (are you missing a using directive or an assembly reference?)"...
merci pour votre aide...j'en ai besoin de ça...
Messages postés
425
Date d'inscription
mercredi 22 janvier 2003
Statut
Modérateur
Dernière intervention
13 juillet 2007

Bonjour,

Cet exemple est obsolete, je tente de le mettre à jour rapidement
Messages postés
1
Date d'inscription
jeudi 4 janvier 2007
Statut
Membre
Dernière intervention
4 janvier 2007

Ok
Messages postés
1
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
2 novembre 2006

salut,

j'ai le meme soucis que OURTI!!
Pourrait on avoir des explications?
Merci de répondre.
Messages postés
14
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
11 septembre 2008

salut,
j ai essayé de deployer votre solution, mais une erreur dont je connais pas la source se presente:
Error 1 The name 'WorkflowWebRequestContext' does not exist in the current context E:\Documents and Settings\Administrateur\Bureau\WF Web Exemple\ASPNETWorkflowExemple\App_Code\StartDataExchangeService.cs 22 43 E:\...\ASPNETWorkflowExemple\
merci de m'indiquer le correctif.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.