菜的像徐坤
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

中间件(2)

3977人阅读 2022/2/10 10:19 总访问:882904 评论:0 收藏:0 手机
分类: .net core

前言

接着上一篇

开发中间件

基于约定的中间件开发

在 ASP.NET Core 官网上面提供了一个简单的例子,通过中间件来设置应用的区域信息,代码如下:

public void Configure(IApplicationBuilder app){
    app.Use((context, next) =>
    {   
        var cultureQuery = context.Request.Query["culture"]; 
        if (!string.IsNullOrWhiteSpace(cultureQuery))
        {            var culture = new CultureInfo(cultureQuery);

            CultureInfo.CurrentCulture = culture;
            CultureInfo.CurrentUICulture = culture;
        }      
       // Call the next delegate/middleware in the pipeline
        return next();
    });

    app.Run(async (context) =>
    {        await context.Response.WriteAsync(  
                  $"Hello {CultureInfo.CurrentCulture.DisplayName}");
    });
}

通过这段代码,我们可以通过QueryString的方式设置应用的区域信息。但是这样的代码怎样复用呢?注意,中间件一定要是可复用、方便复用的。我们来改造这段代码:

public class RequestCultureMiddleware{   

private readonly RequestDelegate _next;  

public RequestCultureMiddleware(RequestDelegate next)
    {
        _next = next;
    }

public async Task InvokeAsync(HttpContext context)
    {        //......

        // Call the next delegate/middleware in the pipeline
        await _next(context);
    }
}

这里定义一个委托,用于执行具体的业务逻辑,然后在Configure中调用这个委托:

app.UseMiddleware<RequestCultureMiddleware>();

这样还是不太方便,不像我们使用app.UseMvc()这么方便,那么我们来添加一个扩展方法,来实现更方便的复用:

public static class RequestCultureMiddlewareExtensions{  
public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
    {   
     return builder.UseMiddleware<RequestCultureMiddleware>();
    }
}

然后我们就可以这样使用中间件了:

app.UseRequestCulture();

通过委托构造中间件,应用程序在运行时创建这个中间件,并将它添加到管道中。这里需要注意的是,中间件的创建是单例的,每个中间件在应用程序生命周期内只有一个实例。

原:ASP.NET Core 中间件基本用法 - 拓荒者-NET - 博客园 (cnblogs.com)

评价