C# asp.net核心路由特定中间件 我和膝关节炎2号一起工作,开始测试ASP.NET核心。但找不到处理请求/url特定中间件的方法 在Koa,用路由器我可以实现如下: .post("/api/v1/user", Middleware1, Middleware2, RequestValidationMiddleware, SpecificAction); .get("/api/v1/user", Middleware1, Middleware2, RequestValidationMiddleware, SpecificAction1); .post("/api/v1/role", Middleware1, Middleware4, RequestValidationMiddleware2, SpecificAction2); 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(); }

C# asp.net核心路由特定中间件 我和膝关节炎2号一起工作,开始测试ASP.NET核心。但找不到处理请求/url特定中间件的方法 在Koa,用路由器我可以实现如下: .post("/api/v1/user", Middleware1, Middleware2, RequestValidationMiddleware, SpecificAction); .get("/api/v1/user", Middleware1, Middleware2, RequestValidationMiddleware, SpecificAction1); .post("/api/v1/role", Middleware1, Middleware4, RequestValidationMiddleware2, SpecificAction2); 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(); },c#,asp.net-core,C#,Asp.net Core,如何用asp.net内核实现它 尝试了以下方法: .post("/api/v1/user", Middleware1, Middleware2, RequestValidationMiddleware, SpecificAction); .get("/api/v1/user", Middleware1, Middleware2, RequestValidationMiddleware, SpecificAction1); .post("/api/v1/role", Middleware1, Mi

如何用asp.net内核实现它

尝试了以下方法:

.post("/api/v1/user", Middleware1, Middleware2, RequestValidationMiddleware, SpecificAction);
.get("/api/v1/user", Middleware1, Middleware2, RequestValidationMiddleware, SpecificAction1);
.post("/api/v1/role", Middleware1, Middleware4, RequestValidationMiddleware2, SpecificAction2);
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";
    }
}
[路由(“api/[控制器]”)]
公共类值控制器:控制器
{
//获取api/值
[HttpGet]
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
//获取api/values/5
[HttpGet(“test/get/{id}”)]
公共字符串Get(int-id)
{
返回“值”;
}
}
但我在这里迷路了

我想要的是,我想要在中间件中处理数据验证——这迫使我拥有每个url(几乎)特定的中间件

PS-我知道,模型验证可以在实际操作中完成,但我不希望这样


提前感谢您的帮助:)

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

    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(路由器)
使用路由器管理软件:

截图:

[更新]:

要与属性路由集成,只需添加一个
UseMvc()
而不是
Run()
,如下所示:

    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']

    private Func<RequestDelegate, RequestDelegate> Middleware1 = next=> {
        return async context =>
        {
            context.Items["mw-message1"] = "mw1";
            await next(context);
        };
    };
现在,当向
/api/v1/user
发出Get请求时,最终的响应是:

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

我在.NETCore3WebAPI中使用以下代码

在startup.cs configure方法中添加以下内容,以便为特定路由添加中间件

//用于检查授权密钥的中间件存在于请求标头中 //所有路线的地图

_ = app.UseHeaderKeyAuthorization();
_ = app.MapWhen(context => context.Request.Path.StartsWithSegments("/api/v1.0"), appBuilder =>
{
    _ = appBuilder.UseHeaderKeyAuthorization();
});
//所有路线的地图

_ = app.UseHeaderKeyAuthorization();
_ = app.MapWhen(context => context.Request.Path.StartsWithSegments("/api/v1.0"), appBuilder =>
{
    _ = appBuilder.UseHeaderKeyAuthorization();
});
创建中间件HeaderKeyAuthorizationMiddleware,下面的示例

//HeaderKeyAuthorizationMiddleware
public class HeaderKeyAuthorizationMiddleware
    {
        private readonly RequestDelegate next;

        public HeaderKeyAuthorizationMiddleware(RequestDelegate next)
        {
            this.next = next;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            var authHeader = httpContext.Request.Headers[ApiConstants.AuthHeaderName];
            //check authHeader logic
            if (!string.IsNullOrEmpty(authHeader))
            {
                await next.Invoke(httpContext);
                return;
            }

            //Reject request if there is no authorization header or if it is not valid
            httpContext.Response.StatusCode = 401;
            await httpContext.Response.WriteAsync("Unauthorized");
        }
    }

//Middleware extension to register middleware   
public static class HeaderKeyAuthorizationMiddlewareExtension
    {
        public static IApplicationBuilder UseHeaderKeyAuthorization(this IApplicationBuilder app)
        {
            if (app == null)
            {
                throw new ArgumentNullException(nameof(app));
            }

            return app.UseMiddleware<HeaderKeyAuthorizationMiddleware>();
        }
    }
//HeaderKeyAuthorizationMiddleware
公共类HeaderKeyAuthorizationMiddleware
{
私有只读请求委托下一步;
public HeaderKeyAuthorizationMiddleware(RequestDelegate下一步)
{
this.next=next;
}
公共异步任务调用(HttpContext HttpContext)
{
var authHeader=httpContext.Request.Headers[ApiConstants.AuthHeaderName];
//检查authHeader逻辑
如果(!string.IsNullOrEmpty(authHeader))
{
wait next.Invoke(httpContext);
返回;
}
//如果没有授权标头或请求无效,则拒绝请求
httpContext.Response.StatusCode=401;
等待httpContext.Response.WriteAsync(“未经授权”);
}
}
//注册中间件的中间件扩展
公共静态类HeaderKeyAuthorizationMiddlewareExtension
{
公共静态IApplicationBuilder UseHeaderKeyAuthorization(此IApplicationBuilder应用程序)
{
如果(app==null)
{
抛出新的ArgumentNullException(nameof(app));
}
返回app.useMediddleware();
}
}

在.net核心意义上的中间件中,中间件运行得很早——在路径已知之前。每个中间件用于每个请求。对于所需内容,可以使用动作过滤器。操作过滤器可以将服务注入其中,并且很可能对您来说就足够了。非常感谢。我还有一个问题。。。我可以集成属性路由<代码>[路由(“api/v1/user”)]用户控制器中的注释?如果是,请帮助我。@IndrajitDan我已经更新了答案。为此,只需将
运行(SpecificAction1)
替换为
UseMvc()
。然而,我不认为这是一个最佳实践。据我所知,最好使用Mvc过滤器和ModelBinder。请注意,这不适用于ASP.NET Core 3.0+中的端点路由(因为无法在分支管道上调用
UseEndpoints
)。据我所知,这可以通过使用
app.UseWhen(c=>c.Request.Path.StartsWithSegments(“/foo”),…
重新连接到主管道来解决。@HonzaR,你说得对:(这只在5.0rc中修复。)