.NET Core TODO: ActionFilterAttribute & IOperationFilter & HandlerMiddleware
.NET Core TODO: ActionFilterAttribute & IOperationFilter & HandlerMiddleware
ActionFilterAttribute
public class MyActionFilter : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { //.... } public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { //.... } } //Startup.cs public void ConfigureServices(IServiceCollection services) { services.AddControllers(o => { o.Filters.Add(typeof(MyActionFilter)); }).AddJsonOptions(o => { }); }
参考:wcf - Execute code before (EVERY) Web API action - Stack Overflow
HandlerMiddleware
public class XfhMiddleware { private readonly RequestDelegate _next; //在应用程序的生命周期中,中间件的构造函数只会被调用一次 public XfhMiddleware(RequestDelegate next) { this._next = next; } public async Task InvokeAsync(HttpContext context) { // Do something... await _next(context); } } //startup.cs public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseMiddleware<XfhMiddleware>(); }
参考:ASP.NET Core Middleware - 雪飞鸿 - 博客园 (cnblogs.com)
OperationFilter 给你的 API 添加或者删除参数:c# - How to selectively add OperationFilter to API endpoint in Swagger? - Stack Overflow
public class AuthenticationHeadersFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { if (operation.Parameters == null) operation.Parameters = new List<OpenApiParameter>(); operation.Parameters.Add(new OpenApiParameter { Name = "AccountName", In = ParameterLocation.Header, Required = true }); operation.Parameters.Add(new OpenApiParameter { Name = "ApiKey", In = ParameterLocation.Header, Required = true }); } } //startup.cs public void ConfigureServices(IServiceCollection services) { services.AddSwaggerGen(c => { // ... // other Swagger configurations // ... c.OperationFilter<AuthenticationHeadersFilter>(); }); }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseSwagger(); app.UseSwaggerUI(c => { // }); }