c# - 在 ASP.NET Core 5.0 Web API 中实现 DelegatingHandler?
问题描述
public class AuthenticationHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage req, CancellationToken cancellationToken)
{
Debug.WriteLine("Process request");
// Call the inner handler.
var response = await base.SendAsync(req, cancellationToken);
Debug.WriteLine("Process response");
return response;
}
}
解决方案文件:https ://i.stack.imgur.com/M4yv6.png
我能找到的唯一答案是旧版本的 Web API,其中解决方案的结构非常不同
解决方案
如果您使用 DelegatingHandler 为从您的 Web API 到另一个服务的出站请求实现横切关注点,则可以使用 HttpClientFactory 注册您的处理程序并将其附加到命名或类型化的 HttpClient:
HttpClient 具有委托处理程序的概念,这些处理程序可以为传出的 HTTP 请求链接在一起。IHttpClientFactory:
简化定义处理程序以应用于每个命名客户端。
支持注册和链接多个处理程序以构建传出请求中间件管道。这些处理程序中的每一个都能够在传出请求之前和之后执行工作。这种模式:
类似于 ASP.NET Core 中的入站中间件管道。提供一种机制来管理围绕 HTTP 请求的横切关注点,例如:缓存错误处理序列化日志记录
在这种方法下,您可以将启动中的处理程序注册到 DI 容器中,以便当它在服务中的某处注入或实例化时,它附加到使用客户端进行的任何调用:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddTransient<AuthenticationHandler>();
services.AddHttpClient<MyTypedHttpClient>(c =>
{
c.BaseAddress = new Uri("https://localhost:5001/");
})
.AddHttpMessageHandler<AuthenticationHandler>();
// ...
}
如果您将行为附加到来自 API 使用者对 Web API 的入站请求,则可以改用中间件:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore -5.0
推荐阅读
- android - 使用 GeoFire 将用户纬度和经度存储到我的数据库中 - 它没有持续更新
- android - 单击按钮时如何转到另一个活动(选项卡中的按钮)
- python - Matplotlib:采样数据时动态重新标记 x 轴
- javascript - 有什么方法可以等待 Dom 更新或异步更新 Dom?
- android - Android App Transfer 找不到交易 ID
- python - 如何将值打印到python中的相应键
- c# - 了解 UWP IoT Core 应用的调试和发布版本之间的差异
- python - Tkinter 命令:lambdas 中的函数参数?
- r - 从r打印短信到pdf
- c# - 如何使用 C# 获取共享打印机状态?