繁体   English   中英

ASP.NET 5 / MVC 6管道分支和控制器名称空间约束

[英]ASP.NET 5/MVC 6 pipeline branching and controller namespace constraint

我想以这样一种方式在ASP.NET 5 / MVC 6中使用管道分支:只有名称空间xxx.yyy.Pipe1.Controller中的控制器才“可用”到在“ Startup.cs” app.Map中这样映射的分支中(“ / pipe1”,ConfigurePipe1);
这样做的首选和/或正确方法是什么? 与其说控制器发现,不如说是限制在请求处理期间可以解析的控制器集合。 我这样做的原因是需要对每个管道使用不同的身份验证方案,从而对每个控制器使用不同的身份验证方案。 谢谢!

如果我理解正确,那么您想按相应控制器的名称空间来映射应用程序吗?

我认为这是不可能的。 MapWhen方法。 我试图在调用控制器时解决它,但是我没有运气(我知道那是没有希望的)。

app.MapWhen(context => {
    var shouldWeMap = ... // here I tried many things but it was impossible to resolve the controller.
    return shouldWeMap;
}, ConfigurePipe1);

如果要了解将要命中哪个控制器,则必须让asp.net将此请求映射到mvc配置。 但是这样做之后,您就错过了将请求映射到应用程序的机会:(

我找到了解决方法。 它使用自定义IActionFilter来检查每个请求中使用的配置。

只需按照您之前建议的那样映射新配置:

app.Map("/pipe1", ConfigurePipe1);

然后在ConfigurePipe1使用不同的签名(唯一名称?)使MVC到MapRoute。 通过这种方式,您可以实现自己的全局IActionFilter并强制其检查已使用的RouteData。

在这里您可以做任何您想做的事。 检查控制器的名称空间,等等。

因此, ConfigurePipe1可能类似于:

public void ConfigurePipe1(IApplicationBuilder app)
{
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "CustomPipeRoute",
            template: "{controller}/{action}/{id?}",
            defaults: new { controller = "Home", action = "Index" }
        );
    });
}

在自定义IActionFilter我们可以像这样检查它们:

public class GlobalActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        var controllerNamespace = context.Controller.GetType().Namespace;
        var pipeRoute = context.RouteData.Routers.OfType<TemplateRoute>().FirstOrDefault(x => x.Name == "CustomPipeRoute");
        if (pipeRoute != null)
        {
            // We are using /pipe1
        }
        if (.....)
        {
            // You can redirect to somewhere else if you want.
            var controller = (Controller)context.Controller;
            context.Result = controller.RedirectToAction("Index", "Controller");
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
    }
}

另外,不要忘记将自定义过滤器注册为:

services.AddMvc(config =>
{
    config.Filters.Add(typeof(GlobalActionFilter));
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM