6

Könnte jemand mich auf eine Ressource verweisen, die erklären würde, wie Web API (speziell unter Verwendung von Owin Self Host) Anfrage Aufhebung behandelt?OWIN SelfHost Web Api - Stornierung anfragen - Wie wird es gemacht? Thread bricht ab?

Hier ist die Abfolge der Ereignisse Ich beobachte:

  • jemand einen GET aus Chrom
  • Api macht Controller (durch einige Schichten) feuert eine Asynchron-SQL-Abfrage
  • jemand die X-Taste trifft in Chrom (ich weiß nicht genau, was passiert am Sockel dafür)

Was passiert als nächstes in Web Api ??

In einem Controller wurde Code ausgeführt, wird der laufende Thread abgebrochen? Wenn es sich um einen asynchronen Controller handelt, der auf eine andere Task wartet, hat diese Task noch einen Warner, falls sie mit einer Ausnahme zurückkehrt?

Für den Kontext: Ich habe eine async Controller wartet auf eine Aufgabe (dies ist die einzige Call-Site), die eine unbeobachtete Ausnahme in einigen Edge Fällen werfen scheint. Ich war noch nicht in der Lage zu isolieren oder neu zu produzieren :)

Ich habe etwas gefunden HttpResponse.ClientDisconnectedToken, aber weiß nicht gut, dass in Owin Selfhost unterstützt wird + ist es sogar die gute Sache für alle Benutzer zu stornieren .

+0

Wir können Ihnen nicht helfen, wenn Sie Ihren Code nicht verloren haben. Das scheint so zu sein, als ob jemand eine Aufgabe abfeuert, die unbeobachtet bleibt, wie die Ausnahme sagt. Ich nehme an, das ist .NET 4.0 –

+0

@YuvalItzchakov: Sorry, wenn die Ausnahme Teil ist verwirrend (bearbeitet, um es zu entfernen). Ich habe es nur als Kontext dafür angegeben, warum ich verstehen möchte, was Web-API mit der Anfrage macht, meine eigentliche Frage ist immer noch, was macht Web-API? – Vivek

+0

ist dies nur ein weiterer Weg, um die gleiche Frage zu stellen Sie zuvor gefragt: http://stackoverflow.com/questions/30109260/owen-selfhost-webapi-client-closing-the-connection-during-response-raises-an-e ? – Claies

Antwort

0

Wie Sie festgestellt, dass Ihr async Controller für eine Task wartet, die manchmal etwas Ausnahme bekam, empfehle ich Ihnen ContinueWith Erweiterungsmethode für eine Aufgabe, die nur dann ausgeführt werden kann Ihre Aufgabe bemängelt wird, wie folgt aus:

task.ContinueWith(
     t => 
     logger.Error(t.Exception.Message, t.Exception); 
     , TaskContinuationOptions.OnlyOnFaulted); 

Dies ist ein Standardmechanismus zur Behandlung der Ausnahmen, und dies wird in OWIN-Anwendung funktionieren.

Zweitens, wie für die Stornierung: Aufgabe kann mit einer CancellationToken Struktur gestartet werden, die für eine Aufgabe während der Ausführung verwendet werden kann. You can read more in the MSDN article.

HttpResponse.ClientDisconnectedToken wird für eine Situation verwendet, wenn der Client getrennt wurde und die Anforderung nicht in der Ausführung fortfahren werden soll.

können Sie dieses Token verwenden, oder erstellen Sie eigene mit CancellationTokenSource, wie folgt aus:

var source = new CancellationTokenSource(); 
var token = source.Token; 

var task = Task.Factory.StartNew(() => 
{ 

    // Were we already canceled? 
    ct.ThrowIfCancellationRequested(); 

    var moreToDo = true; 
    while (moreToDo) 
    { 
     // Poll on this property if you have to do 
     // other cleanup before throwing. 
     if (ct.IsCancellationRequested) 
     { 
      // Clean up here, then... 
      ct.ThrowIfCancellationRequested(); 
     } 

    } 
}, token); 
+0

Vielen Dank für die Verwendung dieses Tokens, aber das ist weit nach unten. Ich habe noch nicht einmal bestätigt, was gerade passiert :( – Vivek

+0

Versuchen Sie, die Ausnahmebehandlung hinzuzufügen – VMAtm

+0

> HttpResponse.ClientDisconnectedToken wird für eine Situation verwendet, in der der Client getrennt wurde und die Anforderung nicht ausgeführt werden sollte. Sie können dieses Token verwenden ... Aber wie Sie dieses Token erreichen? 'HttpContext.Current == null' für OWIN selbst gehostete App ... – greatvovan

2

ich damit beschäftigt haben, indem die System.OperationCanceledException in einer benutzerdefinierten Middleware reichte ich vor registriert haben WebApi.

public class ExceptionHanldingMiddleware : OwinMiddleware 
{ 
    public override async Task Invoke(IOwinContext context) 
    { 
     try 
     { 
      await Next.Invoke(context); 
     } 
     catch (OperationCanceledException) when (context.Request.CallCancelled.IsCancellationRequested) 
     { 
      //swallow user-agent cancelling request. 
      _log.Trace($"client disconnected on request for: {context.Request.Path}."); 
     } 
     catch (Exception ex) 
     { 
      _log.Error(ex); 
      context.Response.StatusCode = (int) HttpStatusCode.InternalServerError; 
      context.Response.ReasonPhrase = "Internal Server Error"; 
     } 
    } 
} 
Verwandte Themen