locked
[WF4] Hoster un service WF en console ou service windows (sans Xamlx, ni IIS ni BasicHttpBinding)

    一般討論

  • Dans un environnement WF4 réel, il arrive que l’on ait à se passer de :

    • IIS qui ne peut pas être installé
    • Fichier de configuration interdit
    • Binding évolué ex: canaux nommés 

    Enfin bref, vous êtes dans une situation courante : héberger un workflow exposé via les canaux nommés (NetNamedPipeBinding) dans une application ou un service windows. Mais vu que vous êtes sur du WF vous ne pouvez pas vous fier à un contrat de service, il faut donc aussi mettre à disposition la metadata du service pour générer le proxy de votre client via Visual Studio.

    Si vous vous êtes renseigné vous avez peut-être une paire de soucis :

    • Le type MexNetNamedPipeBinding n’existe pas, donc l’exposition de la metadata du service ne serra pas possible.
    • Les workflow exposés doivent être de type Xamlx. Dommage si vous aviez prévu de passer par un designer de workflows custom hors de Visual Studio.
    • Les workflow Xamlx ne peuvent pas être instanciés comme des objets. Il faut passer par un reader xaml pour charger un fichier Xamlx… dnc pas de comilation L
    • … etc …

    STOP ! Tout ceci est faut. Ce ne sont que des suppositions basées sur le fait que vous n’avez pas trouver d’autres solutions sur la toile.

    Pour illustrer mes propos, je suis parti sur un nième workflow HelloWorld tel que celui-ci :

    wcfwf_server_pipe_0

    Ce workflow (xaml et non pas xamlX) expose une méthode expose une méthode Hello(name) qui retournera au client une string contenant le message : Hello + name + !

    Et le code qui permet d’héberger ce service est le suivant (simple à condition d’aimer WCF et WF):

    using System;
    using System.Linq;
    using System.Activities;
    using System.Activities.Statements;
    using System.ServiceModel.Activities;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    namespace Demo.WF4.Server
    {
    
      class Program
      {
        static void Main(string[] args)
        {
          // Nom de mon contrat de service (juste pour les yeux)
          String contractName = "IService";
    
          // Addresse du service
          Uri uri = new Uri("net.pipe://localhost/Server");
    
          // Création de l'hôte
          WorkflowServiceHost host = new WorkflowServiceHost(
            new WorkflowService()
            {
              // Le Workflow exsposé via le service
              Body = new WorkflowServer(),
              // Endpoints du workflows
              Endpoints = 
              {
                new Endpoint()
                { 
                  ServiceContractName = contractName,
                  Binding = new NetNamedPipeBinding(),
                  AddressUri = uri
                }
              }
            }, 
            uri);
    
          // Ajout d'un behavior pour la mise à disposition des metadata via WCF
          host.Description.Behaviors.Add(new ServiceMetadataBehavior());
    
          // Ajout du endpoint servant aux metadatas
          host.AddServiceEndpoint(
            ServiceMetadataBehavior.MexContractName, 
            MetadataExchangeBindings.CreateMexNamedPipeBinding(),
            "mex");
          
          // Passage de l'hôte de service en écoute
          host.Open();
    
          // Le service est en ligne
          Console.WriteLine("Service en ligne");
          Console.Read();
        }
      }
    }
    

    Si je lance l’application, tout ce passe bien Clignement d'œil

    wcfwf_server_pipe_00

    Et si je prends un autre projet et que je tente d’y ajouter une référence à mon service. Visual Studio découvre bien mon service.

     wcfwf_server_pipe_01

     

    Lien vers l'article original :

    http://blogs.codes-sources.com/jeremyjeanson/archive/2010/08/23/wf4-wcf-hoster-un-service-wf-sans-xamlx-ni-iis-ni-basichttpbinding.aspx

     


    Jérémy Jeanson MCP, MCTS http://blogs.codes-sources.com/JeremyJeanson/ (French or English spoken)
    2010年8月24日 上午 08:58
    版主

所有回覆

  • Bonjours

    Bonne approche surtout si le host est un service windows au lieu d'une application console


    The complexity resides in the simplicity Follow me at: http://smartssolutions.blogspot.com
    2011年6月5日 下午 12:13