我想在ASP.NET 5/MVC6中使用管道分支,这样只有命名空间xxx.yyy.Pipe1.Controllers中的控制器才“可用于”在'Startup.cs‘app.Map("/pipe1",ConfigurePipe1)中映射的分支;
什么是首选的和/或正确的方法?与其说是关于控制器发现,不如说是关于限制可以在请求处理期间解析的控制器集。我这样做的原因是需要对每个管道使用不同的身份验证方案,从而对每个控制器集使用不同的身份验证方案。谢谢!
发布于 2016-01-06 09:08:54
如果我理解正确的话,您想通过相应控制器的名称空间来映射应用程序吗?
我认为这是不可能的。有一种是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配置。但这样做之后,您会错过将该请求映射到应用程序的机会,因为它已经这样做了:(
发布于 2016-01-06 21:20:49
我找到了一种解决方法。它使用一个自定义的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));
});https://stackoverflow.com/questions/34576616
复制相似问题