[英]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.