HttpListener GetContextAsync() abbrechen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    HttpListener GetContextAsync() abbrechen

    Hallo zusammen,

    ich benutze aktuell den HttpListener weil GitHub per redirect_uri einen access_token an meine Applikation schicken soll. Der Flow ist folgender:

    Meine Applikation startet den Browser des Endbenutzers in dem sich eine GitHub Seite öffnet wo er meiner Applikation Zugriff auf sein GitHub Profil gewähren soll. Tut er das, wird per redirect_uri welche localhost ist der access_token an die Applikation zurückgeleitet. Localhost, weil die Applikation einen HttpListener auf localhost erstellt und auf dieses Callback wartet.

    Aktuell tue ich das mit HttpListener.GetContextAsync().
    Das funktionert alles prima so, solange der Benutzer den Zugriff dann auch gewährt.
    Würde er das nicht tun, den Tab einfach schließen und die Applikation doch nicht nutzen wollen, würde meine Applikation ewig bei GetContextAsync() hängen, weil ja nie localhost aufgerufen wird.

    Daher wollte ich dann, im Form Close Event der Form die den Listener startet, den Listener abort()'en. Doch das wirft mir dann eine ObjectDisposedException eben genau beim GetContextAsync().

    Wie kann ich einen await sozusagen canceln? Geht das in diesem Fall? (Wäre toll, weil es aktuell echt simpel gehalten ist).

    Edit: Ich sehe gerade, der HttpListener hat einen Timeout Manager, allerdings kommt ein Timeout auch nicht in Frage, das würde schon wieder so rüberkommen als müsste ich den Benutzer zu irgendwas schnell schnell drängen. Es soll einfach manuell abgebrochen werden.

    Danke im Voraus :thumbsup:
    Ich seh grad das Problem nicht. Dann mach einen Try-Catch-Block drum, fang explizit die ObjectDisposedException ab und lass sie verschlucken. Sollte eine andere Ex fliegen, diese unbehandelt lassen:

    VB.NET-Quellcode

    1. Try
    2. HttpListener.GetContextAsync()
    3. Catch ODEx As ObjectDisposedException
    4. End Try
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @seh Du musst den HttpListener von einem anderen Thread aus stoppen.
    Falls der async arbeitet, nimm den GUI-Thread.
    Falls nicht, lass ihn in einem anderen Thread laufen.
    Diesen Thread kannst Du dann immer noch abwürgen, was aber nicht die feine englische Art ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ach ja, richtig. Da war ja was mit CancellationTokenSource, siehe Mikrosaft-Doc
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Ich seh grad das Problem nicht. Dann mach einen Try-Catch-Block drum, fang explizit die ObjectDisposedException ab und lass sie verschlucken. Sollte eine andere Ex fliegen, diese unbehandelt lassen:

    VB.NET-Quellcode

    1. Try
    2. HttpListener.GetContextAsync()
    3. Catch ODEx As ObjectDisposedException
    4. End Try

    Hi, ja genau mit dem Try-Catch hab ich es auch schon gelöst, aber das ist wohl nicht so sauber wie so ein mir noch unbekannter CancellationToken. Danke für das Keyword, ich schau mir den CancellationToken mal an. Allerdings sieht mir das beim HttpListener so aus, als würde er CancellationTokens nicht unterstützen.

    VB.NET-Quellcode

    1. Dim cts As New Threading.CancellationTokenSource
    2. '...
    3. Await Task.Run(Sub() HttpListener.GetContextAsync(), cts.Token)
    4. '...
    5. 'Stopsignal irgendwo anders
    6. cts.Cancel
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.