首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET 5/MVC6管道分支和控制器命名空间约束

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

Stack Overflow用户
提问于 2016-01-03 20:40:14
回答 2查看 514关注 0票数 0

我想在ASP.NET 5/MVC6中使用管道分支,这样只有命名空间xxx.yyy.Pipe1.Controllers中的控制器才“可用于”在'Startup.cs‘app.Map("/pipe1",ConfigurePipe1)中映射的分支;

什么是首选的和/或正确的方法?与其说是关于控制器发现,不如说是关于限制可以在请求处理期间解析的控制器集。我这样做的原因是需要对每个管道使用不同的身份验证方案,从而对每个控制器集使用不同的身份验证方案。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-01-06 09:08:54

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

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

代码语言:javascript
复制
app.MapWhen(context => {
    var shouldWeMap = ... // here I tried many things but it was impossible to resolve the controller.
    return shouldWeMap;
}, ConfigurePipe1);

如果你想知道哪个控制器会被击中,你必须让asp.net把这个请求映射到一个mvc配置。但这样做之后,您会错过将该请求映射到应用程序的机会,因为它已经这样做了:(

票数 0
EN

Stack Overflow用户

发布于 2016-01-06 21:20:49

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

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

代码语言:javascript
复制
app.Map("/pipe1", ConfigurePipe1);

然后在ConfigurePipe1中使用不同的签名(唯一名称?)将MVC转换为MapRoute。通过这种方式,您可以实现自己的全局IActionFilter,并强制它检查使用了哪个RouteData。

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

所以ConfigurePipe1可能是这样的:

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

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

代码语言:javascript
复制
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)
    {
    }
}

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

代码语言:javascript
复制
services.AddMvc(config =>
{
    config.Filters.Add(typeof(GlobalActionFilter));
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34576616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档