in

DotNetSide

Dot Net South Italy Developers User Group

Latest post 19 Nov 2008 4:43 by Kintaro10. 5 replies.
Page 1 of 1 (6 items)
Sort Posts: Previous Next
  • 18 Nov 2008 7:01

    • Kintaro10
    • Top 50 Contributor
    • Joined on 18 Nov 2008
    • Posts 7
    • Points 80

    [C#] Workflow e Persistenza: problema per ricaricare

    Ciao a tutti! Smile

    Ho creato un'applicazione per il design rehosting di workflow, tutto funziona bene. Ora volevo implementare la persistenza, ed il salvataggio su database SQL l'ho fatto e funziona a dovere.

    Il problema è quando devo ricaricare il workflow dal db: in pratica se stoppo l'esecuzione del workflow, senza però chiudere l'applicazione, e dopo tento di ripristinarla, questa funziona a dovere. Se invece stoppo l'esecuzione, chiudo la mia applicazione, la riapro e tento di recuperare il workflow, mi da questo errore sulla funzione GetWorkflow(id):

    Impossibile caricare il file o l'assembly 'tmpBB38.tmp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' o una delle relative dipendenze. Puntatore non valido. (Eccezione da HRESULT: 0x80004003 (E_POINTER))

    Il nome tmpBB38.tmp non è fisso (solo la parte tmp rimane fissa, varia il resto tipo: tmp3A21.tmp), e varia ogni volta che io salvo un nuovo workflow sul database. Da quello che posso dedurre, crea dei file temporanei che cancella quando io chiudo la mia applicazione, quindi anche riaprendola questi non ci sono più. E' un errore che succede solo a me? Qualcuno sa come potrei risolvere?

    Grazie mille!

     

    Ciao! Smile

     

    Filed under: ,
    • Post Points: 20
  • 18 Nov 2008 13:56 In reply to

    Re: [C#] Workflow e Persistenza: problema per ricaricare

    Ciao Kintaro, premetto che non ho mai riscontrato l'errore da te riportato, ma per ragionare insieme(in realtà sono delle domande abbastanza banali):
    1)la chiamata al metodo GetWorkflow è all'interno di un blocco try catch? Se si hai già verificato il tipo di exception, che sò PersistenceException ecc(è possibile ricavare maggiori info),
    2)il
    WorkflowRuntime è instanziato,
    3/4)hai già verificato che la stringa di connessione passata al servizio WorkflowPersistenceService è la stessa che passi quando crei il flusso, ed inoltre hai già verificato che il flusso è stato persistito(tramite una semplice select sulla tabella InstanceState).

    http://addshare.blogspot.com/ Imparo, Imparo, Imparo

    • Post Points: 20
  • 19 Nov 2008 0:05 In reply to

    • Kintaro10
    • Top 50 Contributor
    • Joined on 18 Nov 2008
    • Posts 7
    • Points 80

    Re: [C#] Workflow e Persistenza: problema per ricaricare

    Ciao, grazie per la risposta!

    Allora:

    1) hai ragione, mi sono scordato di mettere l'eccezione: FileLoadException.

    2) Si, credo di aver fatto tutto a modo, ma dopo riporto il codice della mia funzione per sicurezza.

    3/4) La stringa di connessione è la stessa, e salva correttamente.

    Da quello che ho dedotto io, credo di capire che crei dei file temporanei che, una volta chiusa l'applicazione, vengono cancellati e quindi non riesce più a trovarli una volta riavviata l'applicazione e lanciato il servizio per recuperare il flusso.

    Comunque, ecco il codice:

    public void ResumeInstance(string workflowID) {

                WorkflowRuntime workflowRuntime2 = new WorkflowRuntime();

                bool unloadOnIdle = true;

                TimeSpan instanceOwnershipDuration = TimeSpan.MaxValue;

                TimeSpan loadingInterval = new TimeSpan(0, 2, 0);

                string connectionString = "Initial Catalog=Master;Data Source=localhost\\SQLEXPRESS;Integrated Security=SSPI;";

                WorkflowPersistenceService _persistence = new SqlWorkflowPersistenceService(connectionString, unloadOnIdle, instanceOwnershipDuration, loadingInterval);

                workflowRuntime2.AddService(_persistence);
                workflowRuntime2.StartRuntime();


                Guid id = new Guid(workflowID);
                WorkflowInstance _wfinstance = workflowRuntime2.GetWorkflow(id);
                _wfinstance.Load();
    }

    Vedi qualche inesattezza? Al limite, se l'hai sottomano, puoi riportare il codice della tua funzione?

    Ciao e grazie ancora

     

    Edit: Ora è sorto un altro bug, che prima non avevo notato: dopo aver rilevato l'errore sopracitato, se provo a rilanciare l'applicazione ed a ricaricare il wf, ora mi da un'altra eccezione:

    System.Workflow.Runtime.WorkflowOwnershipException was unhandled
    Message="Il flusso di lavoro non appartiene a WorkflowRuntime. La proprietà di WorkflowRuntime è scaduta oppure il flusso di lavoro appartiene a un altro WorkflowRuntime."

    [Edit2] Allora ho verificato queste cose:

    - quando lancio il mio flusso di lavoro, la prima volta, mi salva su SQL tutti i dati tranne due campi che rimangono null: ownerID e ownedUntil .

    - quando provo a ricaricarlo, mi da l'errore di load file exception, ma sul server SQL mi riempie i due campi lasciati null il precendenza.

    - a questo punto, se tento nuovamente di riprendere l'esecuzione, mi da l'eccezione ownership.

    Non ci capisco più...

    • Post Points: 5
  • 19 Nov 2008 2:49 In reply to

    • Kintaro10
    • Top 50 Contributor
    • Joined on 18 Nov 2008
    • Posts 7
    • Points 80

    Re: [C#] Workflow e Persistenza: problema per ricaricare

    Eccomi nuovamente qua, dunque sono arrivato alla conclusione che ho un problema alla creazione del runtime durante la prima esecuzione dello stesso.

    Qualcuno può cortesemente postarmi il codice di una funzione di avvio, quando in pratica si crea il runtime e sia avvia il workflow? Vorrei vedere le differenze.

    In pratica quando io creo il runtime, non so per qual motivo, mi crea nella cartella User/<nome_utente>/AppData/Local/Temp un file temporaneo (tra l'altro vuoto), ed è quello che poi mi da l'errore.

    Grazie e ciao.

    • Post Points: 20
  • 19 Nov 2008 3:41 In reply to

    Re: [C#] Workflow e Persistenza: problema per ricaricare

    Purtroppo in questo momento sono un pò sommerso dal lavoro quindi rispondo in modo telegrafico.
    Ad ogni modo credo che l'errore sia abbastanza chiaro(anche se in italiano), cioè l'eccezione viene scatenata perchè l'instanza del flusso è in una fase di lock(se vai nella tabella InstanceState vedrai come il campo OwnerId è popolato con un Guid, che identifica il runtime che ha bloccato quel preciso flusso).
    Se non ricordo male(ma guarda su msdn per una risposta più precisa) viene sbloccato quando il campo unlocked è impostato su 1 e ownerID risulta null oppure quando ownedUntil è expired(ma non è il tuo caso dato che passi il max di date).
    Se hai la necissità di sbloccarlo bisogna implementare opportunamente il metodo UnlockWorkflowInstanceState(non ho mai fatto prove a riguardo).
    Invece per un semplice esempio puoi guardare sul mio blog alla voce Workflow Foundation, ma se non ricordo male anche su DotnetSide nella sezione articoli trovi qualcosa.

    http://addshare.blogspot.com/ Imparo, Imparo, Imparo

    • Post Points: 20
  • 19 Nov 2008 4:43 In reply to

    • Kintaro10
    • Top 50 Contributor
    • Joined on 18 Nov 2008
    • Posts 7
    • Points 80

    Re: [C#] Workflow e Persistenza: problema per ricaricare

    Grazie per la risposta.

    Allora il problema non sorge dalla persistenza, ma bensì dal metodo che uso per compilare. In pratica io compilo il workflow, e gli assembly che creo li salvo in memoria. Ovviamente, una volta chiusa l'istanza del programma, la memoria viene liberata, ed è per quello che quando tento di recuperare il workflow mi dice che manca un file.

    *** Ho appena guardato il tuo blog ***

    Tu santo subito! :D

    Guardando nel tuo blog, c'è un esempio di un compilatore, mi è bastato mettere al posto di

    parameters.GenerateInMemory = true;

    la riga trovata sul tuo blog:

    parameters.OutputAssembly = System.IO.Path.Combine(Application.StartupPath, "Workflow1.dll");

    Grazie mille!!!

    Ciaooo!

    • Post Points: 5
Page 1 of 1 (6 items)
Powered by Community Server (Commercial Edition), by Telligent Systems