当前位置: 首页 > 编程语言 > C#

在ASP.NET Core中限制到控制器命名空间的路由分享

时间:2023-04-10 17:52:22 C#

C#学习教程:限制路由到ASP.NETCore中的控制器命名空间共享到一个命名空间。在以前版本的ASP.NETMVC中,有一个重载在添加路由时提供了一个string[]命名空间参数。这在ASP.NETMVC6中是缺失的。所以在谷歌搜索之后,我尝试了类似app.UseMvc(routes=>{vardataTokens=newRouteValueDictionary{{"Namespaces",new[]{"ProjectA.SomeNamespace.Controllers"}}};routes.MapRoute(name:"default",template:"{controller=Home}/{action=Index}/{id?}",defaults:null,constraints:null,dataTokens:dataTokens);});但它似乎没有做我想要的。有没有办法将路由引擎限制在某个命名空间?更新我刚刚意识到它可能与我在每个控制器上使用属性路由这一事实有关?属性路由会影响app.UseMvc()定义的路由吗?更新2更多细节:我有两个完全独立的WebAPI项目。顺便说一下,有些路由在两者中是相同的(即~/api/ping)。这些项目在Production中是独立的,一个是用户的端点,一个是管理员的端点。我还使用Microsoft.AspNet.TestHost进行单元测试。其中一些单元测试需要这两个WebAPI项目的功能(即需要“管理员”端点才能为“用户”完全设置测试用例)。但是,当我引用这两个API项目时,TestHost会因为相同的路由而感到困惑,并抱怨“多个匹配路由”:Microsoft.AspNet.Diagnostics.DeveloperExceptionPageMiddleware:Error:AnunhandledexceptionhasoccurredwhileexecutingtherequestMicrosoft.AspNet.Mvc.Infrastructure.AmbiguousActionException:多个动作匹配。以下操作匹配路由数据并满足所有约束:ProjectA.SomeNamespace.Controllers.PingController.PingProjectB.SomeNamespace.Controllers.PingController.PingatMicrosoft.AspNet.MInfrastructure.DefaultActionSelector.SelectAsync(RouteContextcontext)atMicrosoft.AspNet。Mvc.Infrastructure.MvcRouteHandler.d__6.MoveNext()更新:我通过使用ActionConstraint找到了解决方案。您必须在重复操作上添加自定义操作约束属性。重复索引方法的示例。第一个HomeControllernamespaceWebApplication.Controllers{publicclassHomeController:Controller{[NamespaceConstraint]publicIActionResultIndex(){returnView();}}}第二个HomeControllernamespaceWebApplication{publicclassHomeController:Controller{[NamespaceConstraint]publicIActionResultIndex(){returnView();}}}配置路径由app.UseMvc(cR=>cR.MapRoute("default","{controller}/{action}",null,null,new{Namespace="WebApplication.Controllers.HomeController"}));行约束namespaceWebApplication{publicclassNamespaceConstraint:ActionMethodSelectorAttribute{publicoverrideboolIsValidForRequest(RouteContextrouteContext,ActionDescriptoraction){vardataTokenNamespace=(string)routeContext.RouteData.DataTokens.FirstOrDefault(dt=>dt.Key=="Namespace").价值;varactionNamespace=((ControllerActionDescriptor)action).MethodInfo.DeclaringType.FullName;返回dataTokenNamespace==actionNamespace;}}}第一个答案:属性路由会影响app.UseMvc()定义的路由吗?属性路由和基于约定的路由(routes.MapRoute(...)独立工作属性路由比常规路由好。但它似乎并没有按照我的意愿进行。有没有办法将路由引擎限制为某个命名空间?开发人员回答:我们建议使用区域而不是使用命名空间列表来对控制器进行分组。您可以将控制器(无论它们在哪个组件中)归属于特定区域,然后为该区域创建路径。您可以在此处执行此操作请参阅显示在MVC6中使用区域的示例的测试站点:https://github.com/aspnet/Mvc/tree/dev/test/WebSites/RoutingWebSite。使用Area和基于约定的路由的示例控制器://通过/admin/users到达//必须位于:project_root/Areas/Admin/[Area("Admin")]publicclassUsersController:Controller{}Configureconvention-based路由:app.UseMvc(routes=>{routes.MapRoute("areaRoute","{area:exists}/{controller}/{action}",new{controller="Home",action="Index"});}使用Area和基于属性的路由的例子以上是C#学习教程:RoutingrestrictedtothecontrollernamespaceinASP.NETCore分享所有内容,如果对大家有用,还需要进一步了解C#学习教程,希望大家多多关注——//通过/admin/users到达//必须定位到:project_root/Areas/Admin/[Area("Admin")][Route("[area]/[controller]/[action]",Name="[area]_[controller]_[action]")]publicclassUsersController:Controller{}本文整理自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: