endpoint filters为c# minimal api提供统一请求响应处理机制,支持iendpointfilter接口实现、lambda内联注册、特性声明式应用、di服务注入及短路响应五种方式。

如果您在使用C# Minimal API时希望在不修改端点逻辑的前提下统一处理请求或响应,Endpoint Filters提供了一种轻量、可复用的拦截机制。以下是实现端点过滤器的具体方法:
一、使用IEndpointFilter接口实现自定义过滤器
通过实现IEndpointFilter接口,可以创建一个可注入的过滤器类,该类在端点执行前后介入调用链,适用于需要跨多个端点共享逻辑的场景。
1、定义一个类并实现IEndpointFilter接口,重写InvokeAsync方法。
2、在InvokeAsync方法中,可选择在调用next前执行前置逻辑(如日志记录、权限检查),或在await next(context)后执行后置逻辑(如响应头添加、结果包装)。
3、在Program.cs中,对特定端点调用AddEndpointFilter方法注册该过滤器实例。
二、使用Lambda表达式注册内联过滤器
对于简单、一次性使用的逻辑,可直接通过Func
1、在MapGet/MapPost等路由配置后链式调用AddEndpointFilter方法。
2、传入一个lambda表达式,参数为context和next,其中context包含HttpContext及参数绑定信息。
3、在lambda体内调用await next(context)以继续执行原端点,并可在其前后插入任意同步或异步操作。
三、使用属性标记方式应用过滤器
通过自定义特性继承EndpointFilterAttribute,可将过滤器以声明式方式附加到Minimal API端点上,提升代码可读性与复用性。
1、创建一个类继承EndpointFilterAttribute,并重写CreateFilter方法,返回IEndpointFilter实例。
2、在CreateFilter中构造并返回具体过滤器对象,支持依赖注入(如通过IServiceProvider获取服务)。
3、在端点委托前添加该特性的实例,例如[MyAuthFilter],框架会自动解析并应用。
四、利用依赖注入传递服务到过滤器
Endpoint Filter支持从DI容器解析服务,使日志、缓存、数据库上下文等资源可在过滤器中直接使用。
1、确保所需服务已在Program.cs中通过AddScoped/AddSingleton等方式注册。
2、在IEndpointFilter实现类的构造函数中声明对应服务参数,框架将自动注入。
3、若使用Lambda方式注册,可通过闭包捕获ServiceProvider,再调用GetRequiredService获取实例,注意需确保服务生命周期兼容。
五、处理短路与返回自定义响应
当过滤器需要终止端点执行并直接返回响应(如身份验证失败返回401),可通过设置context.Result实现短路。
1、在过滤器逻辑中判断条件是否满足,例如检查请求头中的Token有效性。
2、若校验失败,创建一个新的IResult实例(如Results.Unauthorized()或Results.Problem())。
3、将该实例赋值给context.Result,此时next不会被调用,端点主体逻辑被跳过。










