我想在我的ASP.NET Core应用程序中包含通过HttpClient进行的所有调用的一些时序逻辑,包括从第三方库创建的调用。.NET Core HttpClient是否具有拦截器的概念?
.NET Core中的HttpClient
有什么我可以插入运行一些代码在每个请求?
我想在我的ASP.NET Core应用程序中包含通过HttpClient进行的所有调用的一些时序逻辑,包括从第三方库创建的调用。.NET Core HttpClient是否具有拦截器的概念?
.NET Core中的HttpClient
有什么我可以插入运行一些代码在每个请求?
是的,它的确如此。 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);
}
}
我不确定这是如何适用于整个问题。它看起来像是一种对自己的代码中的每个请求进行回调的方式,它将使用ExampleHttpHandler。但我不明白它会如何影响你使用的第三方库的内部行为。 – Zastai
@ Zastai它取决于图书馆。一个好的应该接受一个外部的'HttpClient'实例或一个处理程序作为可选参数。例如,“Flurl”给出了这种可能性。 –
你指的是中间件? https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware – Adrian
不可以。如果我有一个ASP.NET Core应用程序包含一个通过HTTP调用另一个服务器的库,我怎么知道只要图书馆打电话给其他服务器就花了很长时间。其他技术(Angular)具有拦截器的概念,只要发出HTTP请求,您就可以收到回调。 .NET Core有这个吗?谢谢 – ChrisBellew