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. P>
Comment puis-je savoir si un client déconnecté? p>
merci! p>
3 Réponses :
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. P>
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> < p> Alors j'ai géré cette solution de contournement: p>
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: pour implémenter ceci par réfection, j'ai trouvé le bit suivant du code est un peu plus compliqué: p> cette réflexion crée un 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é: appeler Tout ce qui est adressé dans le Source complète . P > p> httplistener code> 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 code>, la structure
httplistener code> utilise des notifications de déconnexion client exceptionnelles, pour appuyer sur ce code en dehors de son objectif recherché. P> < P> Pour chaque demande, il y a un
connecteurId code> utilisé par
http.sys code>. Ce code utilise la réflexion et crée un
Func <> code> pour obtenir cet identifiant pour tout
httplistenerrequest code>: p>
FUNC <> code> dont l'entrée est un
connecteurId code> et Renvoie un
iAsyncResult code> contenant l'état de la demande d'intégrité. En interne, cela appelle une méthode privée sur
HTTplistener code>: p>
void httplistener.disconnectedasynconnect.FinishOwningDisconnectHandling () code>, 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 code> sur la haquetable
code>. Intercepter cet appel s'avère être assez simple - Créez un type dérivé et une substitution
Supprimer code>: p>
Annuler code> 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 code>. P> P>
HTTplistenerHashTable Code> Type dérivé Li>
AnnellationTokensource Code> Instances Li>
HASHTABLE CODE> de HTTplistener avec le
httplistenerhashable code> (il est préférable de faire cela juste après la création de l'instance
HTTplistener CODE>) li>