11
votes

Détecter la déconnexion du client avec HTTplistener

J'ai une application qui utilise HTTplistener, j'ai besoin de savoir quand le client déconnecté, j'ai maintenant tout mon code à l'intérieur d'un bloc d'essai / attraper qui est assez laid et pas une bonne pratique.

Comment puis-je savoir si un client déconnecté?

merci!


0 commentaires

3 Réponses :


10
votes

Réponse courte: vous ne pouvez pas. Si un client cesse de parler, la prise sous-jacente peut rester ouverte et ne fermera jamais; Ça va juste du temps d'attente. Le moyen de détecter cela est d'essayer d'effectuer une action sur cette connexion et si la connexion n'est plus valide, elle lancera une sorte d'exception en fonction de ce qui s'est passé. Si vous utilisez HTTplistener asynchrone, il peut nettoyer votre code un peu en termes d'essais / attraper mais malheureusement c'est ce que vous êtes coincé avec. Il n'y a pas d'événement qui va tirer si le client déconnecte.


0 commentaires

0
votes

J'ai le même problème, je fais une longue requête SQL, et si l'utilisateur continue à appuyer sur F5, il souffle.

httplistener n'expose pas sa prise sous-jacente afin que vous puissiez interroger. < p> Alors j'ai géré cette solution de contournement: xxx


0 commentaires

1
votes

Vous pouvez! Deux options que j'ai trouvées sont avec Réflexion ou Code dangereux . Les deux options vous donnent un jeton de déconnexion client à partir d'une méthode qui ressemble à ceci: xxx

pour implémenter ceci par réfection, j'ai trouvé httplistener implémente réellement les notifications de déconnexion du client pour le Mise en œuvre d'authentification intégrée. J'ai créé un type qui dérive de hashtable , la structure httplistener utilise des notifications de déconnexion client exceptionnelles, pour appuyer sur ce code en dehors de son objectif recherché. < P> Pour chaque demande, il y a un connecteurId utilisé par http.sys . Ce code utilise la réflexion et crée un Func <> pour obtenir cet identifiant pour tout httplistenerrequest : xxx

le bit suivant du code est un peu plus compliqué: xxx

cette réflexion crée un FUNC <> dont l'entrée est un connecteurId et Renvoie un iAsyncResult contenant l'état de la demande d'intégrité. En interne, cela appelle une méthode privée sur HTTplistener : xxx

Comme son nom l'indique, cette méthode appelle une API Win32 à notifier une déconnexion client . Immédiatement après, en utilisant le résultat de cette méthode, j'appelle une méthode privée sur un type imbriqué: void httplistener.disconnectedasynconnect.FinishOwningDisconnectHandling () , si la connexion est toujours ouverte. Cette méthode change l'état de cette structure de «dans la maintenante» à «normal», qui est l'état nécessaire pour invoquer le rappel d'achèvement de l'IO qui appellera supprimer sur la haquetable . Intercepter cet appel s'avère être assez simple - Créez un type dérivé et une substitution Supprimer : xxx

appeler Annuler Pour lancer, nous invoquons cela à l'aide de TPL afin que vous puissiez attraper une exception projetée pendant Annuler en vous abonnant à Taskscheduler.unobservedTaskexception .

  • Création du HTTplistenerHashTable Type dérivé
  • Stockage de Vol AnnellationTokensource Instances
  • Ensemble ou remplacez le champ HASHTABLE de HTTplistener avec le httplistenerhashable (il est préférable de faire cela juste après la création de l'instance HTTplistener )
  • Poignez la demande d'un jeton de déconnexion et le client déconnecte alors que le code est exécuté

    Tout ce qui est adressé dans le Source complète .


0 commentaires