BeginEndContext de HTTPListener ne réagit pas au sein d'un service Windows
Razz999
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis nouveau sur ce forum. Je l'ai découvert par hasard. Je vois qu'il est actif. J'y viendrai plus souvent pour me tenir au courant pour parfaire mon apprentissage de C# et je répondrai à certaines questions que les gens se posent.
En ce moment, j'ai développé un serveur SOAP sous la forme d'un Windows Forms Application. Je suis à même d'écouter sur un port de communication, une transmission sécurisée sans aucun problème. Je démarre mon application avec l'aide d'un bouton « Démarrer » et je l'arrête avec un autre bouton « Arrêter ». Mon service est apte à rouler conformément à mes exigences, sans problème.
Afin d'améliorer celui-ci, je veux transformer mon application en service Windows. Ça donne l'avantage de rouler en arrière-plan et de démarrer dès que le poste redémarre. J'ai déjà expérimenté de nombreuses autres applications en service Windows. Malheureusement pour moi, j'ai un problème majeur. Le service écoute (j'ai fait un test), mais est incapable de récupérer le message SOAP envoyé.
En gros, j'utilise la classe HTTPListener. Afin de démarrer la capture du message entrant, j'utilise la méthode « BeginGetContext ». Je vous rappelle que je fais comme l'application qui fonctionne déjà admirablement ainsi. Normalement, il y a un déclencheur qui nous renverra vers une autre fonction de type « ListenerCallback ».
Je peux mettre le code essentiel au fonctionnement sans être spécifique à mes besoins de lecture du message.
Alors, contrairement à l'application Windows, le service Windows n'exécute rien à partir de ce moment. Il reste figé.
S'il y a une ou des personnes qui ont déjà expérimenté le même problème avec un HTTPListener à l'intérieur d'un service Windows, je peux répondre en mettant le code causant le problème. C'est pas très gros comme code au fond, mais c'est peut-être une cinquantaine de lignes environ. Je juge qu'à cette étape-ci, ça ne ferait qu'alourdir la discussion.
Passez tous une belle journée!
Je suis nouveau sur ce forum. Je l'ai découvert par hasard. Je vois qu'il est actif. J'y viendrai plus souvent pour me tenir au courant pour parfaire mon apprentissage de C# et je répondrai à certaines questions que les gens se posent.
En ce moment, j'ai développé un serveur SOAP sous la forme d'un Windows Forms Application. Je suis à même d'écouter sur un port de communication, une transmission sécurisée sans aucun problème. Je démarre mon application avec l'aide d'un bouton « Démarrer » et je l'arrête avec un autre bouton « Arrêter ». Mon service est apte à rouler conformément à mes exigences, sans problème.
Afin d'améliorer celui-ci, je veux transformer mon application en service Windows. Ça donne l'avantage de rouler en arrière-plan et de démarrer dès que le poste redémarre. J'ai déjà expérimenté de nombreuses autres applications en service Windows. Malheureusement pour moi, j'ai un problème majeur. Le service écoute (j'ai fait un test), mais est incapable de récupérer le message SOAP envoyé.
En gros, j'utilise la classe HTTPListener. Afin de démarrer la capture du message entrant, j'utilise la méthode « BeginGetContext ». Je vous rappelle que je fais comme l'application qui fonctionne déjà admirablement ainsi. Normalement, il y a un déclencheur qui nous renverra vers une autre fonction de type « ListenerCallback ».
Je peux mettre le code essentiel au fonctionnement sans être spécifique à mes besoins de lecture du message.
Alors, contrairement à l'application Windows, le service Windows n'exécute rien à partir de ce moment. Il reste figé.
S'il y a une ou des personnes qui ont déjà expérimenté le même problème avec un HTTPListener à l'intérieur d'un service Windows, je peux répondre en mettant le code causant le problème. C'est pas très gros comme code au fond, mais c'est peut-être une cinquantaine de lignes environ. Je juge qu'à cette étape-ci, ça ne ferait qu'alourdir la discussion.
Passez tous une belle journée!
A voir également:
- BeginEndContext de HTTPListener ne réagit pas au sein d'un service Windows
- Windows ne démarre pas - Guide
- Clé de produit windows 10 gratuit - Guide
- Service spouleur - Guide
- Montage video windows - Guide
- Windows movie maker - Télécharger - Montage & Édition
1 réponse
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
comment as-tu vérifié que le service écoutait? la session a-t-elle été acceptée par le service?
comment as-tu vérifié que le service écoutait? la session a-t-elle été acceptée par le service?
J'ai vérifié que le service écoute sur le bon port en tapant la commande suivante dans une fenêtre CMD de Windows :
telnet localhost 30010
parce que je développe sur mon ordinateur local. Lorsque j'exécute cette commande le curseur de cette fenêtre CMD, vide la fenêtre et va s'installer en haut et à gauche. Pour obtenir la commande « telnet », on doit activer cette option dans les paramètres de Windows. Cette commande fonctionnera partout. C'est une commande livrée par Microsoft.
Voici le code simplifié de mon service :
Le bout de code problématique se trouve dans la méthode « OnStart ». Elle ne génère aucune erreur, ni exception. C'est seulement que lorsque l'écoute débute, elle n'ouvre pas un « thread » en appelant la méthode « ListenerCallback ».
Ce code en C# fonctionne sans aucun problème depuis 3 ans en Windows Forms Application. Le code de la méthode « OnStart » est simplement écrit dans l'événement « OnClick » d'un bouton par exemple.
Tu peux le copier et l'essayer en quelques minutes. Si tu t'efforces de m'aider, tu as mon code en cadeau! :-)
J'ai aussi réalisé un code avec des événements « Wait », qui fonctionne en Windows Forms Application, mais non en Windows Service. Il réagit de façon identique. Il n'écoute pas (le petit garnement!).
Passe une belle journée mon ami! :-)
Tu fais l'hypothèse que tout se passe bien, et que le service n'écoute pas, ou ne récupère pas le message SOAP. Supposons plutôt qu'il ne le reçoive pas.
Je travaillerais ces pistes, pour récolter des information complémentaires:
1) le service a-t-il la même identité et les mêmes privilèges que l'application Forms?
2) tester avec http au lieu de https (l'app Form et le service)
3) quel client SOAP utilises-tu? ne te donne-t-il aucune possibilité de diagnostiquer ce qui se passe, où cela coince (TCPIP, SSL, HTTP, ...)?
4) il vaut mieux éviter de tester avec Telnet. à fortiori quand tu utilises SSL. si tu ne veux pas développer un client de test, il est simple d'utiliser PowerShell pour établir une connexion, avec ou sans SSL. Cela te donnera un meilleur contrôle de ton test. Comme tu fais de l'HTTP, utilise également un navigateur pour tester l'établissement d'une connexion et un échange HTTP, avec et sans SSL De nouveau, bien sûr, teste l'app Forms et le service.
5) tu as sans doute déjà vérifié via netsh http show sslcert
J'ai aussi testé cette version en Windows 7, 8 et 10. Ça fait le même effet!
C'est censé accepter un message SOAP, mais pour les besoins, n'importe quel chaîne de caractères serait très satisfaisante à cette étape-ci.
Afin de voir où ça bloque, j'ai écrit un fichier temporaire sur le disque. Naturellement, il ne dépasse pas le « BeginGetContext » en exécution. J'ai tenté de voir s'il entrait au moins une fois dans la méthode « ListenerCallback », en écrivant un autre fichier, mais jamais il ne l'écrit. Donc, il n'entre même pas à l'intérieur de cette dernière méthode.
Si tu veux écrire un fichier sur le disque, tu peux copier et coller le code suivant où tu voudras :