• 自定义中间件


    中间件是一种装配到应用管道以处理请求和响应的软件。
    通常,中间件封装在类中,并且通过扩展方法公开。

    约定模式

    自定义类-扩展-注册

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Logging;
    using System;
    using System.Diagnostics;
    using System.Threading.Tasks;
    /// <summary>
    /// 访问接口耗时
    /// </summary>
    public class CustomInvokeElapseTime
    {
        private readonly RequestDelegate _next;
        private readonly ILogger _logger;
        private readonly Stopwatch _stopwatch;
    
        public CustomInvokeElapseTime(RequestDelegate next)
        {
            _next = next;
            _stopwatch = new Stopwatch();
        }
        public CustomInvokeElapseTime(RequestDelegate next, ILogger logger) : this(next)
        {
            _logger = logger;
        }
        public async Task InvokeAsync(HttpContext context)
        {
            _stopwatch.Restart();
            context.Response.OnCompleted(() =>
            {
                _stopwatch.Stop();
    #if DEBUG
                Console.WriteLine($"ElaspedTime:{_stopwatch.ElapsedMilliseconds} ms");
                _logger.LogInformation($"执行耗时:{_stopwatch.ElapsedMilliseconds} ms");
    #endif
                return Task.CompletedTask;
            });
            await _next(context);
        }
    }
    /// <summary>
    /// 扩展中间件
    /// </summary>
    public static class CustomInvokeElapseTimeExtensions
    {
        public static IApplicationBuilder UseCustomInvokeElapseTime(this IApplicationBuilder app)
        {
            return app.UseMiddleware<CustomInvokeElapseTime>();
        }
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
    
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();
        app.UseSession();
    
        logger.LogInformation("自定义中间件添加到管道中");
        app.UseCustomInvokeElapseTime();
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "XXX.dll");
        });
    }
    

    基于工厂

    第三方容器

  • 相关阅读:
    敏捷开发
    Response.Write(js脚本)后 Response.redirect(...),为什么js脚本不执行,怎么解决!
    kaixin.com一波三折看SNS
    JavaScript数组的自定义 sort方法
    简单明了的SQL join解释
    [官方资料] 介绍 JSON
    SQL UNION 和 UNION ALL 操作符
    JavaScript frames 对象
    理解hasOwnProperty
    asp.net网站安全常见问题与防范
  • 原文地址:https://www.cnblogs.com/wesson2019-blog/p/14379173.html
Copyright © 2020-2023  润新知