2010-05-18 15 views
2

Ok, donc je vais peut-être aborder cette question de manière incorrecte, mais j'essaie essentiellement de jouer avec les nouveaux services WF de la version 4.0 pour créer un service Windows qui héberge un service WF. Pour le moment, j'ai construit un projet (contenant un simple XAML d'activité) et un service (un service WF implémenté dans un fichier XAMLX).Héberger des workflows avec WorkflowServiceHost

J'ai essayé des "mondes de salut" simples pour chacun. Le client a été hébergé dans un WorkflowApplication et j'ai initialement configuré le service en tant que modèle de projet de service WF par défaut. Les deux semblent être bien là.

Puisque je veux héberger un service sans IIS, naturellement ma prochaine tentative a été d'héberger mon service dans un WorkflowServiceHost. En faisant cela, je peux utiliser XamlServices.Load() et passer l'objet renvoyé au constructeur WorkflowServiceHost avec un URI pour le point de terminaison. J'étais inquiet parce qu'il n'y a pas de méthode de membre Run() comme il y a dans la classe WorkflowApplication. J'ai supposé que la méthode Open() ouvrirait l'objet hôte de service en tant que service et qu'il démarrerait une instance du flux de travail mais il n'y a aucune indication de celui-ci.

Au début, j'ai configuré le workflow de service pour écrire simplement dans un fichier texte quand il a commencé mais rien ne s'est passé. J'ai essayé de déboguer avec des points d'arrêt mais comme il charge un fichier XAMLX à l'exécution, VS ne me permet pas de déboguer le WF. J'ai donc essayé de modifier un peu le projet client pour utiliser un WorkflowServiceHost au lieu d'un WorkflowApplication. J'ai utilisé le même flux de travail utilisé pour tester le flux de travail hello world style et cette fois il n'y avait pas de sortie à la console et le WorkflowApplication a réussi avec cela précédemment.

Voici les principes de base de ce que j'ai fait avec le client pour héberger le service de workflow dans le projet console. Si quelqu'un veut voir le XAML pour le flux de travail, faites-le moi savoir et je mettrai à jour cette question. Voici le code d'hébergement dans Main().

const String clientAddress = "http://localhost:9998/Client";  
WorkflowServiceHost wfHost = new WorkflowServiceHost(new ClientWf(), new Uri(clientAddress)); 
wfHost.Open(); 

while(Console.ReadKey().KeyChar.ToString().ToUpper() != "X") { } 

wfHost.Close(); 

Répondre

2

Ce que j'ai découvert est que, puisque vous ne pouvez pas démarrer directement l'instance WF qui est enveloppé par l'objet WorkflowServiceHost, est un peu d'une douleur à l'exécuter et à peu près impossible par un simple appel de méthode comme vous pouvez accomplir avec un WorkflowApplication. Il y a un «truc» pour faire feu sur la WF mais il faut un peu de piratage auquel je n'ai pas donné le temps de jouer. MSDN a une référence obscure de ce que vous pouvez faire dans ce scénario here, sous Hosting Workflows non-service.

C'est la solution que j'ai utilisée: en utilisant à la fois WorkflowServiceHost et WorkflowApplication. Pourquoi demandes-tu? Eh bien parce que j'essayais de faire beaucoup de tout dans un tout petit paquet. Je construis également ceci comme un modèle de service personnalisé pour mon travail et il est préférable que je sépare la logique métier (WorkflowApplication) de toute l'implémentation de la communication (WorkflowServiceHost). Le service se déclenche très bien de cette façon parce que, bien sûr, maintenant ma communication sous-jacente. workflow commence par une activité de réception et WorkflowSericeHosts recherche un type d'activité de messagerie à la racine du flux de travail associé afin de démarrer une instance.

Maintenant, je suis un heureux campeur. Ma logique d'entreprise fait ce qu'elle est censée faire comme prévu et le service de flux de travail se développe bien. Ce qui est encore mieux, c'est que j'ai un modèle dans lequel je peux faire un saut dynamique dans la logique métier pour configurer et déployer dynamiquement des services de traitement/traitement de données personnalisés. Maintenant, juste pour perfectionner les rappels pour mettre à jour un tableau de bord à distance, c'est ce que je vais passer à la prochaine étape.