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