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

时间:2016-01-03 12:40:14

标签: c# asp.net-core asp.net-core-mvc

我想在ASP.NET 5 / MVC 6中使用管道分支,只有命名空间xxx.yyy.Pipe1.Controllers中的控制器“可用”到“Startup.cs”中这样映射的分支中app.Map(“/ pipe1”,ConfigurePipe1);
这样做的首选和/或正确方法是什么? 控制器发现与限制在请求处理期间可以解析的控制器集的关系不大。我这样做的原因是需要为每个管道使用不同的认证方案,从而需要每组控制器。 谢谢!

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望通过相应的控制器命名空间映射应用程序?

我认为这是不可能的。有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配置。但是在这样做之后,您错过了将该请求映射到已经完成的应用程序的机会:(

答案 1 :(得分:0)

我找到了解决方法。它使用自定义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));
});