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