.NET Core HttpClient是否具有拦截器的概念?

Chr*_*lew 6 .net-core asp.net-core

我想围绕从我的ASP.NET核心应用程序通过HttpClient进行的所有调用包含一些时序逻辑,包括从第三方库调用.

HttpClient在.NET Core中是否有我可以插入的东西来在每个请求上运行一些代码?

Ily*_*kov 5

是的,它确实。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");
Run Code Online (Sandbox Code Playgroud)

实现方式:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)