vipwan/Biwen.QuickApi

请求中间件和筛选器

Closed this issue · 2 comments

 internal interface IQuickApiMiddlewareHandler
    {
        /// <summary>
        /// 请求QuickApi前的操作
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        Task InvokeBeforeAsync(HttpContext context);
        /// <summary>
        /// 请求QuickApi后的操作
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        Task InvokeAfterAsync(HttpContext context);
    }
    /// <summary>
    /// QuickApiMiddleware
    /// </summary>
    public sealed class QuickApiMiddleware
    {
        private readonly RequestDelegate _next;

        public QuickApiMiddleware(RequestDelegate next)
        {
            _next = next;
        }
        public async Task Invoke(HttpContext context)
        {
            var md = context.GetEndpoint()?.Metadata.GetMetadata<QuickApiMetadata>();
            if (md == null || md.QuickApiType == null)
            {
                await _next(context);
                return;
            }
            var handler = context.RequestServices.GetRequiredService(md.QuickApiType) as IQuickApiMiddlewareHandler;
            if (handler == null)
            {
                await _next(context);
                return;
            }
            await handler.InvokeBeforeAsync(context);
            await _next(context);
            await handler.InvokeAfterAsync(context);
        }
    }

提供 QuickApi执行管道的前和执行请求后的 中间件支持 :

    [QuickApi("middleware")]
    public class MiddlewareApi : BaseQuickApi
    {
        public override Task InvokeBeforeAsync(HttpContext context)
        {
            return base.InvokeBeforeAsync(context);
        }

        public override Task InvokeAfterAsync(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.WriteAsync("middleware");
            return Task.CompletedTask;
        }
        public override RouteHandlerBuilder HandlerBuilder(RouteHandlerBuilder builder)
        {
            builder.WithTags("custom");
            return base.HandlerBuilder(builder);
        }
    }

筛选器请重写 RouteHandlerBuilder 添加:

        public override RouteHandlerBuilder HandlerBuilder(RouteHandlerBuilder builder)
        {
            //自定义筛选器
            builder.AddEndpointFilter(async (context, next) =>
            {
                context.HttpContext.Response.Headers.TryAdd("X-Powered-By", "Biwen.QuickApi");
                Console.WriteLine("自定义过滤器!");
                return await next(context);
            });
            return base.HandlerBuilder(builder);
        }

推荐使用筛选器AddEndpointFilter替代执行管道(IQuickApiMiddlewareHandler)的行为.

MSDN:
https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/minimal-apis/min-api-filters?view=aspnetcore-7.0