2010-07-29 4 views
3

Je développe une solution hôte générique très simple qui nous permettra d'héberger des assemblages en tant que services Windows (al NServiceBus). Je rencontre l'exception suivante (semblable aux commentaires mentionnés sur blog post de Dru). J'ai besoin que cela fonctionne pour que je puisse héberger des services dans différents AppDomains.Exécution du service Topshelf à l'aide de ConfigureServiceInIsolation - Hôte générique

"Type 'MyProject.WindowsServices.GenericHost.Program + <> c__DisplayClass5' à l'Assemblée 'MyProject.WindowsServices.GenericHost, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' est pas marqué comme sérialisable." J'utilise les binaires Topshelf 1.0 RC disponibles à partir du lien de téléchargement sur la page d'accueil de topshelf (topshelf-project.com). J'ai essayé la dernière version (29/07/2010), et les versions disponibles en téléchargement depuis google code et github! Je ne peux pas faire travailler l'un d'entre eux pour moi!

Cela fonctionne dans la bibliothèque NServiceBus avec une version antérieure de Topshelf (la version dll est la version 0.8.0.96). Avec quelques modifications de code mineures à ce que j'ai ci-dessous (utilisez CreateServiceLocator à la place de HowToBuildService) cela fonctionne pour moi avec ces anciens binaires, mais je préfère m'en tenir au dernier code pour tirer parti des corrections ou améliorations planifiées.

Voici mon code.

static void Main(string[] args) 
{ 
    ArgumentParser arguments = new ArgumentParser(args); 
    string configFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, 
     arguments.ServiceType.Assembly.ManifestModule.Name + ".config"); 

    RunConfiguration cfg = RunnerConfigurator.New(x => 
    { 
     x.SetServiceName(arguments.ServiceName); 
     x.SetDisplayName(arguments.DisplayName); 
     x.SetDescription(arguments.Description); 

     if (string.IsNullOrEmpty(arguments.UserName)) 
     { 
      x.RunAsLocalSystem(); 
     } 
     else 
     { 
      x.RunAs(arguments.UserName, arguments.Password); 
     } 

     x.ConfigureServiceInIsolation<GenericHost>(c => 
     { 
      c.ConfigurationFile(configFile); 
      c.Named(arguments.ServiceType.AssemblyQualifiedName); 
      c.HowToBuildService(name => new GenericHost(arguments.ServiceType)); 
      c.WhenStarted(tc => tc.Start()); 
      c.WhenStopped(tc => tc.Stop()); 
     }); 
    }); 

    Runner.Host(cfg, args); 
} 

Il faut également noter que ma classe GenericHost et la classe identifiée par arguments.ServiceType à la fois mettre en œuvre MarshalByRefObject et moi avons également fait ces classes Serializable pour voir si cela pouvait aider. Ce ne sont pas ces classes qui causent le problème, cependant, il semble se plaindre d'un type anonyme généré par le compilateur C# pour un ou plusieurs des lambda que j'ai configurés.

Quelqu'un d'autre voit-il ce problème lors de l'utilisation de ConfigureServiceInIsolation()? Si non, est-ce que quelqu'un sait ce qui me manque ici? Faites-moi savoir si vous avez besoin de plus d'informations, par ex. pile trace ou plus de code.

Répondre

0

Si vous n'utilisez qu'un service à l'intérieur de l'hôte, je supprimerais le "InIsolation". Cela ne fonctionne pas bien mais dans une future version de TopShelf (nous y travaillons actuellement) je pense que nous avons une meilleure réponse à ce problème. En plus de la possibilité de déposer des fichiers dans un hôte et de faire tourner votre service dans un nouveau AppDomain automatiquement.

Je dirais que cela relève d'un problème connu et à moins qu'il y ait une raison impérieuse d'utiliser l'InIsolation, évitez-le pour le moment. Vous ne pouvez pas rassembler les expressions lambda à travers les barrières de domaine d'application, d'où le problème que vous voyez. Si le problème d'InIsolation est suffisamment important, je peux me pencher sur les efforts pour corriger ce problème par rapport à la chronologie avant de publier la nouvelle version. [Vous pouvez saisir le dernier dev. bits d'ici: http://github.com/legomaster/Topshelf - attention, nous sommes encore en développement actif mais je pense que tous les bugs majeurs sont maintenant écrasés].

Si vous voulez discuter davantage, il pourrait être plus facile à afficher sur la liste des MassTransit où tous les développeurs regardent: http://groups.google.com/group/masstransit-discuss

J'espère que cela aide!

+0

Merci pour votre réponse Travis! On dirait que les futures versions auront une sorte d'hôte générique uber. Déposer des fichiers pour faire fonctionner les services Windows serait une fonctionnalité très intéressante. Pour l'instant, je vais voir si je peux créer quelque chose sans la partie InIsolation. Je peux juste revenir à avoir un exécutable personnalisé par service, ce sera bien comme une solution à court terme. Une idée quand la prochaine version pourrait être prête? – Sam

+0

Je l'ai fait cibler pour une version d'octobre 2010, pour répondre à ma version interne.Je m'attends à ce que nous atteignions toujours ce délai même si mon délai a été repoussé par nos parties prenantes. – Travis

+0

Une fois que nous aurons tous ceci publié, nous allons travailler avec Udi pour l'intégrer dans la NServiceBus principale. Donc, si vous le faites fonctionner sans isolation, cela vous servira peut-être juste jusqu'à ce qu'Udi ait mélangé tous les nouveaux éléments. Mais c'est à vous de décider. Je sais qu'Udi nous demande quelques autres fonctionnalités que j'espère pouvoir offrir cette année. – Travis

Questions connexes