.netcore管道返回HellowWorld三种方式(管道配置,管道扩展方法,中间件)

在Startup中,我们看官网可以知道Configuration是注入服务和Configure配置管道,而我们的实现原理是在管道中直接返回HellowWorld,新建一个.netcoreMVC项目

一,第一种方法,最简单,我们直接在管道实现,在Configure添加一个直接返回的配置,如下代码

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            ///管道直接返回,不往下执行
            app.Run(async context =>
            {
                context.Response.ContentType = "text/plain";
                await context.Response.WriteAsync("Hello World!");
            });


            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

二,我们添加一个类,然后写一个管道的扩展方法,如下

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TestDoc.MiddleWare
{
    public static class HellowWorldExtension
    {
        public static IApplicationBuilder UseHellowWorldExtension(this IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync("HellowWorldExtension");
            });
            return app;
        }
    }
}

然后再管道cinfigure配置,如下

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            ///配置管道的扩展方法
            app.UseHellowWorldExtension();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

三,中简件的实现,我们添加中间件 ,如下(PS:1,中间件需要注册服务 2,配置管道)

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TestDoc.MiddleWare
{
    public class HellowWorldMiddleWare : IMiddleware
    {
        public Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            return context.Response.WriteAsync("Hellow World");
        }
    }
}

再Startup如下代码配置,要写两个地方

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using TestDoc.MiddleWare;

namespace TestDoc
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            ///中间件需要注册服务
            services.AddSingleton<HellowWorldMiddleWare>();
            services.AddControllersWithViews();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            ///中间件配置管道
            app.UseMiddleware<HellowWorldMiddleWare>();

            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

四,中间件的扩展,我们看第三点知道,注入中间件要配置ConfigureServices和Configure两步,现在我们用IStartupFilter升级扩展下,先添加一个类,如下

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TestDoc.MiddleWare
{
    public static class HellowWorldMiddleWareExtension
    {
        public static IServiceCollection AddHellowWorldMiddleWareExtension(this IServiceCollection services)
        {
            services.AddSingleton<HellowWorldMiddleWare>();
            services.AddTransient<IStartupFilter, HellowWorldMiddleWareExtensionFilter>();
            return services;
        }
    }
    /// <summary>
    /// 在core的文档中的解析是如下
    /// 使用 Startup 筛选器扩展 Startup 使用 IStartupFilter
    /// 在应用的 Configure 中间件管道的开头或末尾配置中间件,而无需显式调用 Use{Middleware}。 IStartupFilter 由 ASP.NET Core 用于将默认值添加到管道的开头,而无需使应用作者显式注册默认中间件。 IStartupFilter 允许代表应用作者使用不同的组件调用 Use{Middleware}。
    ///创建 Configure 方法的管道。 IStartupFilter.Configure 可以将中间件设置为在库添加的中间件之前或之后运行。
    /// </summary>
    public class HellowWorldMiddleWareExtensionFilter : IStartupFilter
    {
        public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
        {
            return app =>
            {
                app.UseMiddleware<HellowWorldMiddleWare>();
                next(app);
            };
        }
    }
}

Startup代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using TestDoc.MiddleWare;

namespace TestDoc
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            ///使用IStartupFilter对中间件的升级和扩展,这也是一半大牛自己写插件时候的逻辑
            ///直接注册服务即可,不必写配置管道,因为管道已经在注册服务已经配置管道了
            services.AddHellowWorldMiddleWareExtension();
            services.AddControllersWithViews();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

这样我们就完美使用IStartupFilter 升级了中间件,core文档地址

以上四种方法都可以用来学习管道和中间件的简单例子

 代码结构如下:

.netcore管道返回HellowWorld三种方式(管道配置,管道扩展方法,中间件)

 

.netcore管道返回HellowWorld三种方式(管道配置,管道扩展方法,中间件)

上一篇:【holm】ASP.NET期末复习指南


下一篇:weblogicSSRF漏洞复现