2017-02-09 4 views
5

Ich möchte einige Zeitlogik um alle Anrufe einbetten, die über HttpClient von meiner ASP.NET Core-App aus getätigt werden, einschließlich von Anrufen, die von Bibliotheken von Drittanbietern stammen.Hat .NET Core HttpClient das Konzept der Interzeptoren?

Gibt es in .NET Core HttpClient etwas, das ich anschließen kann, um bei jeder Anforderung Code auszuführen?

+0

Beziehen Sie sich auf Middle? https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware – Adrian

+0

Nein. Wenn ich eine ASP.NET Core-App habe, die eine Bibliothek enthält, die einen anderen Server über HTTP aufruft, wie kann ich wissen, wie Es dauerte lange, bis diese Bibliothek den anderen Server anrief. Andere Technologien (Angular) haben das Konzept von Interzeptoren, bei denen Sie einen Rückruf erhalten können, wenn eine ausgehende HTTP-Anfrage gestellt wird. Hat .NET Core das? Danke – ChrisBellew

Antwort

4

Ja, tut es. HttpClient erzeugt eine HTTP-Anfrage über DelegatingHandler Kette. Um die Anforderung HttpClient abzufangen, können Sie einen abgeleiteten Handler mit der überlagerten Methode SendAsync zu dieser Kette hinzufügen.

Verbrauch:

var handler = new ExampleHttpHandler(fooService); 

var client = new HttpClient(new ExampleHttpHandler(handler)); 

var response = await client.GetAsync("http://google.com"); 

Umsetzung:

public class ExampleHttpHandler : DelegatingHandler 
{ 
    //register the handler itself in DI to inject dependencies 
    public ExampleHttpHandler(FooService service) : this(service, null) 
    { 
    } 

    public ExampleHttpHandler(FooService service, HttpMessageHandler innerHandler) 
    { 
     //default handler should be the last! 
     InnerHandler = innerHandler ?? new HttpClientHandler(); 
    } 

    protected override async Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) 
    { 
     //add any logic here 
     return await base.SendAsync(request, cancellationToken); 
    } 
} 
+0

Ich bin mir nicht sicher, wie das für die gesamte Frage gilt. Es sieht nach einer Möglichkeit aus, einen Rückruf für jede Anfrage in Ihrem eigenen Code zu erhalten, der ExampleHttpHandler verwenden würde. Aber ich sehe nicht, wie es das Verhalten der Interna einer von Ihnen verwendeten Bibliothek von Dritten beeinflussen würde. – Zastai

+0

@Zastai Es kommt auf die Bibliothek an. Ein guter sollte eine externe "HttpClient" -Instanz oder einen Handler als optionalen Parameter akzeptieren. Zum Beispiel gibt 'Flurl' eine solche Möglichkeit. –

Verwandte Themen