如何在ASP.Net Core中使用条件中间件

ASP.Net Core是Microsoft提供的开源,跨平台,可扩展,精益和模块化的框架,可用于构建高性能的Web应用程序。 可以在ASP.Net Core请求管道中使用中间件组件来自定义处理请求和响应的方式。

ASP.Net Core中间件组件也可以用于检查,路由或修改流经管道的请求和响应消息。 本文讨论了如何使用ASP.Net Core中的中间件执行一些高级操作。

[Microsoft .Net 5将.Net Framework和.Net Core结合在一起:了解.Net Standard和.Net Core的合并对开发人员意味着什么 | 从InfoWorld的Microsoft Architect博客中了解如何从.Net Framework和.Net Core中获得最大收益。 | 通过InfoWorld的App Dev Report新闻通讯了解编程方面的热门话题。 ]

创建一个ASP.Net Core MVC项目

首先,让我们在Visual Studio中创建一个ASP.Net Core项目。 假设系统中已安装Visual Studio 2017或Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的ASP.Net Core项目。

  1. 启动Visual Studio IDE。
  2. 点击“创建新项目”。
  3. 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.Net Core Web应用程序”。
  4. 点击下一步。
  5. 在“配置新项目”窗口中,指定新项目的名称和位置。
  6. 单击创建。
  7. 在接下来显示的“创建新的ASP.Net Core Web应用程序”中,从顶部的下拉列表中选择.Net Core作为运行时,并选择ASP.Net Core 2.2(或更高版本)。
  8. 选择“ Web应用程序(Model-View-Controller)”作为项目模板,以创建一个新的ASP.Net Core应用程序。
  9. 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
  10. 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
  11. 点击创建,

按照这些步骤应该在Visual Studio中创建一个新的ASP.Net Core项目。 我们将在本文的后续部分中使用该项目。

ASP.Net Core中的Use,Run和Map方法

Use,Map和Run方法用于在ASP.Net Core中配置HTTP管道。 以下是这些方法及其用途的简要介绍。

  • 使用-此方法将执行委托,然后移至管道中的下一步。 Use方法也可以用于使管道短路。
  • 运行-此方法将执行委托并返回结果。
  • Map —此方法将有条件地执行委托并返回结果。

在ASP.Net Core中注册中间件

ASP.Net Core中的中间件组件已在Startup类的Configure方法中注册。 Use *扩展方法用于注册中间件。 这是注册中间件组件的语法。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseMyCustomMiddleware<MyCustomMiddleware>();
}

应该注意的是,中间件组件是按照它们注册的顺序执行的。

ASP.Net Core中的Invoke方法

每个中间件组件都包含一个Invoke方法。 此方法接受对HttpContext实例的引用作为参数。 中间件组件可以在调用下一个中间件组件之前和之后执行操作。 这是典型的Invoke方法的示例:

public async Task Invoke(HttpContext context)
{
    // Write code here that will be executed before the
    // next middleware is called
        await _next.Invoke(context); // call next middleware
    // Write code here that will be executed after the
    //next middleware is called 
}

在ASP.Net Core中分支HTTP管道

Map扩展方法(即Map和MapWhen)用于分支管道。 虽然Map用于根据给定的请求路径进行分支,但是MapWhen用于根据给定的谓词的结果进行分支。

以下代码段说明了如何将Map方法用于分支请求管道。

public class Startup
{
    private static void MapRequestA(IApplicationBuilder app)
    {
        app.Run(async context =>
        {
            await context.Response.WriteAsync("This is MapRequestA");
        });
    }
    private static void MapRequestB(IApplicationBuilder app)
    {
        app.Run(async context =>
        {
            await context.Response.WriteAsync("This is MapRequestB");
        });
    }
    private static void MapRequestC(IApplicationBuilder app)
    {
        app.Run(async context =>
        {
            await context.Response.WriteAsync("This is MapRequestC");
        });
    }
    public void Configure(IApplicationBuilder app)
    {
        app.Map("/mapRequestPathA", MapRequestA);
        app.Map("/mapRequestPathB", MapRequestB);
        app.Map("/mapRequestPathB", MapRequestC);
        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
   //Other methods
}

MapWhen方法接受两个参数:

  • Func <HttpContext,bool>谓词
  • 委托行动

您可以在Startup类的Configure方法中使用以下代码片段来禁止内容类型“ text / html”。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.MapWhen(context => context.Request.ContentType.Equals
            ("text/xml", StringComparison.InvariantCultureIgnoreCase),
            (IApplicationBuilder applicationBuilder) =>
            {
                applicationBuilder.Run(async context =>
                {
                    await Task.FromResult(context.Response.StatusCode = StatusCodes.Status406NotAcceptable);
                });
            });
            app.UseMvc();
        }

ASP.Net Core中的UseWhen方法

UseWhen方法可用于有条件地执行中间件。 以下代码段说明了如果请求路径以“ / api”开头的情况,可以使用UseWhen方法执行中间件组件。

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>
{
    applicationBuilder.UseCustomMiddleware();
});

请注意,与MapWhen不同,UseWhen方法将继续执行更高版本的中间件,而不管UseWhen谓词是true还是false。 让我们通过一个例子来理解这一点。 考虑以下代码:

app.UseMiddlewareA();
app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>
{
    applicationBuilder.UseMiddlewareB();
});
app.UseMiddlewareC();

如果中间件没有短路,将始终执行中间件A和C。 仅当请求路径以“ / api”开头时,才会执行中间件B。

在ASP.Net Core中,请求处理管道中有一系列中间件组件。 所有请求和响应都通过此管道进行。 当新请求到达时,这些中间件组件可以处理该请求,也可以将请求传递给管道中的下一个组件。 对于更复杂的请求处理,我们可以使用Map和MapWhen方法分支管道,并使用UseWhen有条件地执行中间件。

-

在ASP.Net Core中了解有关中间件以及请求和响应处理的更多信息:

From: https://www.infoworld.com/article/3429602/how-to-use-conditional-middleware-in-aspnet-core.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值