asp.net核心路由特定的中间件 [英] asp.net core route specific middleware

查看:82
本文介绍了asp.net核心路由特定的中间件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用KOA 2.0,并开始测试asp.net核心.但是找不到处理请求/URL特定中间件的方法

I was working with KOA 2.0 and started to test asp.net core. But can't find a way to handle request/url specific middleware

在Koa中说,借助路由器,我可以实现以下目标:

Say in Koa, with router I can achieve the below:

.post("/api/v1/user", Middleware1, Middleware2, RequestValidationMiddleware, SpecificAction);
.get("/api/v1/user", Middleware1, Middleware2, RequestValidationMiddleware, SpecificAction1);
.post("/api/v1/role", Middleware1, Middleware4, RequestValidationMiddleware2, SpecificAction2);

如何使用asp.net核心实现它?

How to achieve it with asp.net core?

尝试了以下内容:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    //app.UseApiLog();
    app.Map("/api", ApiLogApps);
    app.Map("/exlog", ExceptionLogApps);

    //app.UseMvc(routes =>
    //{
    //    routes.MapRoute(
    //                    name: "default",
    //                    template: "apilog/{controller}/{action}");
    //    routes.MapRoute(
    //                    name: "default2",
    //                    template: "exlog/{controller=Home}/{action=Index}/{id:int}");
    //});
}

private static void ApiLogApps(IApplicationBuilder app)
{
    //app.Run(() => )
    app.UseApiLog();
    app.UseMvc();
}

在控制器中,我有

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    [HttpGet("test/get/{id}")]
    public string Get(int id)
    {
        return "value";
    }
}

但是我在这里迷路了.

我想要的是,我想让DataValidation在中间件中进行处理-迫使我必须针对每个url(几乎)使用特定的中间件.

What I want is, I want to have DataValidation to be handled in a middleware - that forces me to have per url (almost) specific middleware.

PS-我知道,可以在实际中进行模型验证,但我不希望这样做.

PS - I know, model validation can be done in action, but I don't want that.

在此先感谢您的帮助:)

Thanks in advance for your help :)

推荐答案

要使用像Koa2这样的中间件,您可以配置一系列中间件来构建路由:

To use middlewares like Koa2 , you can configure a sequence of middlewares to build a route :

    public IRouter BuildRouter(IApplicationBuilder applicationBuilder)
    {
        var builder = new RouteBuilder(applicationBuilder);

        // use middlewares to configure a route
        builder.MapMiddlewareGet("/api/v1/user", appBuilder => {
            // your Middleware1
            appBuilder.Use(Middleware1);
            appBuilder.Use(Middleware2);
            appBuilder.Use(RequestValidationMiddleware);
            appBuilder.Run(SpecificAction);
        });

        builder.MapMiddlewarePost("/api/v1/user", appBuilder => {
            // your Middleware1
            appBuilder.Use(Middleware1);
            appBuilder.Use(Middleware2);
            appBuilder.Use(RequestValidationMiddleware);
            appBuilder.Run(SpecificAction1);
        });
        // ....

        return builder.Build();
    }

,然后通过 UseRouter(router)使用RouterMiddleware:

and then use RouterMiddleware via UseRouter(router) :

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // ...
    app.UseRouter(BuildRouter(app));
    // ...
    app.UseMvc();
}

屏幕截图:

[更新]:

要与属性路由集成,只需添加 Run() UseMvc()指令,如下所示:

To integrate with attribute routing, just add a UseMvc() insteand of Run() as below :

    public IRouter BuildRouter(IApplicationBuilder applicationBuilder)
    {
        var builder = new RouteBuilder(applicationBuilder);

        // use middlewares to configure a route
        builder.MapMiddlewareGet("/api/v1/user", appBuilder => {
            appBuilder.Use(Middleware1);
            appBuilder.Use(Middleware2);
            appBuilder.Use(RequestValidationMiddleware);
            appBuilder.UseMvc();          // use a MVC here ...
        });

        builder.MapMiddlewarePost("/api/v1/user", appBuilder => {
            appBuilder.Use(Middleware1);
            appBuilder.Use(Middleware2);
            appBuilder.Use(RequestValidationMiddleware);
            appBuilder.UseMvc();
        });
        // ....

        return builder.Build();
    }

就演示而言,Middleware1是一个虚拟中间件,它添加了 HttpContext.Items ['mw-message1'] :

Just for a demo , the Middleware1 is a dummy middleware that adds a HttpContext.Items['mw-message1']:

    private Func<RequestDelegate, RequestDelegate> Middleware1 = next=> {
        return async context =>
        {
            context.Items["mw-message1"] = "mw1";
            await next(context);
        };
    };

该控制器是一个普通的控制器,它将检索 HttpContext.Items ["mw-messages1"] :

the Controller is a plain controller that will retrieve the HttpContext.Items["mw-messages1"]:

[Route("api/v1/[controller]")]
[ApiController]
public class UserController : ControllerBase
{
    public IActionResult Index()
    {
        var x = (string)HttpContext.Items["mw-message1"];
        return new JsonResult(new {
            MW1 = x,
            Hello= "Hello",
        });
    }
}

现在,当向/api/v1/user 发出Get请求时,最终响应为:

and now , when make a Get request to /api/v1/user , the final response is :

{"mW1":"mw1","hello":"Hello"}

这篇关于asp.net核心路由特定的中间件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆