2010-04-05 5 views
18

Je souhaite créer un service Windows qui accède à ma base de données. Ma base de données est SQL Server 2005.Problème lors du test d'un service Windows

Actuellement, je travaille sur un site Web et ma base de données se trouve dans notre serveur. J'ai besoin d'accéder à ma base de données chaque seconde et mettre à jour les dossiers. Pour cela, j'ai besoin de faire un service Windows qui va s'installer dans notre serveur et effectuer la tâche.

J'ai accédé à la base de données à partir de mon ordinateur local puis à exécuter le service, mais le problème est que je ne suis pas certain de pouvoir tester ce service.

J'ai essayé d'installer dans ma machine locale. Il a installé et puis j'ai exécuté le service mais il n'a pas exécuté la tâche et je pense que le service n'est pas capable de se connecter à la base de données.

Il n'y a pas de problème dans le service ni dans son installateur. Le seul problème est comment tester mon service Windows.

Répondre

12

Vous pouvez joindre la solution Visual Studio à l'application de service Windows. Ensuite, vous pouvez déboguer le service Windows comme vous le faites pour un projet normal.

Déboguer -> Attacher au processus.

20

Vous pouvez toujours créer un hybride d'application de service/console et utiliser l'application de console à des fins de test.

Ce que vous devez faire est quelque chose comme ça - dans votre program.cs, changer la méthode Main soit exécuter le service, ou éventuellement exécuter comme une application de la console:

static class Program 
{ 
    static void Main(params string[] args) 
    { 
     string firstArgument = string.Empty; 

     if (args.Length > 0) 
     { 
      firstArgument = args[0].ToLowerInvariant(); 
     } 

     if (string.Compare(firstArgument, "-console", true) == 0) 
     { 
      new YourServiceClass().RunConsole(args); 
     } 
     else 
     { 
      ServiceBase[] ServicesToRun = new ServiceBase[] { new YourServiceClass() }; 
      ServiceBase.Run(ServicesToRun); 
     } 
    } 

puis sur votre classe de service, qui hérite de ServiceBase et a le OnStart et OnStop, ajoutez la méthode RunConsole comme ceci:

public void RunConsole(string[] args) 
    { 
     OnStart(args); 

     Console.WriteLine("Service running ... press <ENTER> to stop"); 

     //Console.ReadLine(); 
     while (true) 
     { } 

     OnStop(); 
    } 

maintenant, si vous voulez exécuter l'application pour tester son foncti nality, lancez simplement le fichier EXE avec un paramètre de ligne de commande -console et placez un point d'arrêt dans la méthode RunConsole.

+3

+1 cela devrait être la réponse acceptée car cela attire aussi des problèmes avant de pouvoir avoir une chance de attacher au processus. – Joe

+1

OnStop() est inaccessible, d'ailleurs. –

+1

Pourquoi Console.ReadLine() est-il mis en commentaire? Est-ce que c'est pas correct? Débarrassez-vous de la boucle infinie ... – Phil

2

Il y a deux façons:

1) Créer une application Windows standard qui appelle le même code, cela est plus facile à exécuter et déboguer. Cela garantit également que votre code de service n'est pas tout au sein du service mais refacturé à son propre assemblage.

2) Dans votre fichier programme serveur, détectez si le service est exécuté de manière interactive et appelez les méthodes de service du service pour les exécuter une seule fois. De cette façon, vous pouvez aussi simplement lancer à partir de Visual Studio. (vous devrez rendre publiques vos méthodes de service et créer une version de votre service)

3

Utilisez un enregistreur pour signaler des erreurs! Essayez de repérer toutes les erreurs possibles et consignez-les dans un fichier et/ou mieux envoyez un courriel: rappelez-vous que «personne n'entend un service en train de mourir»! Log4Net possède un enregistreur pour gérer les fichiers roulants, la persistance de la dabatase et même les messages SMTP. Par exemple, voir: http://logging.apache.org/log4net/release/config-examples.html Vous devrez probablement vérifier le fichier journal à la recherche d'erreurs assez régulièrement. Pour éviter ce genre de corvée, j'utilise souvent l'appender SMTP.

Cheers, B.

2

Je pense que tout le monde a fournir beaucoup de bonnes réponses. Ce serait mon approche ordonnée pour déboguer ce problème:

  • Vérifiez votre journal des événements.
  • Consignez toutes les erreurs (Log4Net, Enterprise Library, ou écrivez simplement dans le journal des événements), en particulier essayez try..catch dans votre méthode Main.
  • Écrivez des tests unitaires que vous pouvez exécuter dans l'environnement.
  • Vérifiez que votre fichier app.config est correct. Vous devrez peut-être fusionner les valeurs de différents projets en un seul.
  • Connectivité à la base de données de test. Ping le serveur. Telnet sur le port 1433 (si SQL Server par défaut). Ecrire une application de console simple à tester.
  • Déboguer en attachant au processus.
  • Utilisez l'approche hybride console/service (excellente technique et j'utilise pour diffuser les messages de débogage en temps réel).
3

La réponse de marc_s est parfaite, mais pour le fait que le thread principal du service ne soit pas mis en pause en attendant la saisie de l'utilisateur comme prévu. Je pense que c'est pourquoi il a mis dans une boucle infinie.

emprunt à partir du code Igal Serban's pour créer une console, voici une amélioration de la méthode RunConsole() qui ne s'arrête:

[DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool AllocConsole(); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool FreeConsole(); 

    public void RunConsole(string[] args) 
    { 
     OnStart(args); 

     AllocConsole(); 

     Console.WriteLine("Service running ... press <ENTER> to stop"); 

     Console.ReadLine(); 

     FreeConsole(); 

     OnStop(); 
    } 
+0

Merci, celui-ci ** est ** parfait! :-) –

Questions connexes