2017-02-09 420 views
5

我想在我的ASP.NET Core应用程序中包含通过HttpClient进行的所有调用的一些时序逻辑,包括从第三方库创建的调用。.NET Core HttpClient是否具有拦截器的概念?

.NET Core中的HttpClient有什么我可以插入运行一些代码在每个请求?

+0

你指的是中间件? https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware – Adrian

+0

不可以。如果我有一个ASP.NET Core应用程序包含一个通过HTTP调用另一个服务器的库,我怎么知道只要图书馆打电话给其他服务器就花了很长时间。其他技术(Angular)具有拦截器的概念,只要发出HTTP请求,您就可以收到回调。 .NET Core有这个吗?谢谢 – ChrisBellew

回答

4

是的,它的确如此。 HttpClient通过DelegatingHandler链产生HTTP请求。要拦截HttpClient请求,可以将带有覆盖SendAsync方法的派生处理程序添加到该链。

用法:

var handler = new ExampleHttpHandler(fooService); 

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

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

实现:

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

我不确定这是如何适用于整个问题。它看起来像是一种对自己的代码中的每个请求进行回调的方式,它将使用ExampleHttpHandler。但我不明白它会如何影响你使用的第三方库的内部行为。 – Zastai

+0

@ Zastai它取决于图书馆。一个好的应该接受一个外部的'HttpClient'实例或一个处理程序作为可选参数。例如,“Flurl”给出了这种可能性。 –