2016-04-13 2 views
2

ich die folgende Methode in meiner Web-api-Controller haben (die langen Lauf Methoden Kündigung Token ehren, dh sie wird nicht ausgeführt, wenn die Stornierung angefordert wurde):Kann ein Client eine Web API-Anfrage abbrechen?

public async Task<IHttpActionResult> ApiMethod(CancellationToken cancellationToken) 
{ 
    await LongRunningNetworkOperation1(cancellationToken); 
    await LongRunningNetworkOperation2(cancellationToken); 

    return Ok(); 
} 

Der Client der folgende Code mein zu nennen hat web api Controller:

using (var httpClient = new HttpClient()) 
{ 
    httpClient.Timeout = TimeSpan.FromMilliseconds(3000); 

    try 
    { 
     // Sending DELETE request 
     HttpResponseMessage deleteMessage = await httpClient. 
          DeleteAsync("http://localhost:80/api/apiMethod"); 
    } 
    catch (Exception e) 
    { 
     // Timeout occurred. 
    } 
} 

Wenn die Anfrage Zeiten des Kunden, bevor "LongRunningNetworkOperation2" genannt wird, wird die CancellationToken "LongRunningNetworkOperation2" nicht ausgeführt werden? Mit anderen Worten, kann der Client der Web-API signalisieren, eine bestimmte Anfrage nicht mehr auszuführen?

Antwort

2

Kann der Client der Web-API signalisieren, dass er keine bestimmte Anfrage mehr ausführt?

In der Theorie ja. Eine Aufhebung der HttpClient sollte die zugrunde liegende TCP/IP-Verbindung schließen. Als Reaktion darauf sollte der ASP.NET-Stack den Verlust seines Clients erkennen und die WebAPI CancellationToken abbrechen.

In der Praxis hängt es davon ab, wie vollständig die HttpClient und WebAPI Implementierungen sind, die Sie verwenden. Stornierung ist nicht unbedingt garantiert, aber ich erwarte, dass es zumindest für den Desktop HttpClient arbeiten würde.

+0

Kennen Sie irgendeinen Ort, an dem dieses spezifische Aufhebungsverhalten dokumentiert ist? – Nick

+0

@Nick: Die Suche auf der ASP.net-Website funktioniert derzeit nicht, also bin ich mir nicht sicher, ob es tatsächlich offiziell dokumentiert ist oder nicht. –