一、前言
在开发项目的过程中,我创建了一个新的控制器,发现vs会直接给控制器头加上前缀,比如[Route('api/[controller]')],也就是在访问接口的时候,会变成http://localhost 33608000/API/values,但是如果控制器很多,或者我们要迭代版本的话,就会发现痛苦的时候到了。
如果此时可以全局配置前缀,这确实是一个好处。只需修改一个地方。为了实现这个目标,让我们使用它。
二、配置
0.让我们在配置之前先看看接口的前缀。建立一张地图来证明它
昂首阔步地打开它
1.我们需要使用IApplicationModelConvention,它位于Microsoft . aspnetcore . MVC . application models的命令空间下.
MVC框架中有一些约定,这个接口主要用来定义一些MVC约定。我们可以通过Apply方法中的ApplicationModel修改或者增加一些约定,MV框架本身在启动的时候会注入这个接口,方便我们使用。
然而,我们仍然必须看看我们可以在这个ApplicationModel对象中使用什么。让我们更进一步:
为了看看这是否酷,我们可以看看每个属性给出的解释
ApiExplorerModel:包括描述信息、组信息、可见性等。
ControllerModel:主要与Comtroller的违约合同有关。这个里面有很多东西,包括控制器名、路由值、Actions等。我们的下一个配置也将在这里扩展
IFilterMetadata:空接口,主要起到标签的作用。
2.配置
步骤1:定义一个类来实现IApplicationModelConvention接口。
///summary////全局路由前缀配置////summary公共类路由约定:应用模型约定{///summary////定义一个路由前缀变量////summary private readonly属性routemodel _ central prefix///summary ///在调用///summary///param name=' route template provider '/param public route conventi on(iroutetetemplateprovider route templateprovider){ _ centralPrefix=new attributeroute model(route templateprovider);}//接口{//的Apply方法public void apply(应用模型应用)遍历应用中的所有控制器foreach (var控制器)。控制器){//1,请注意控制器//,该控制器已标有RouteAttribute。如果控制器中已经标记了路线,则指定的路线内容将被添加到路线之前。var matchedSelectors=控制器。选择器。其中(x=x。属性路由模型!=null)。to list();if(matched selecters。any()){ foreach(matched selectors中的var selector model){//添加路由前缀选择器模型。attributeroutermodel=attributeroutermodel。combintributeroutemol(_ centralprefix,选择器模型。attributeroutemodel)添加到当前路由;}} //2,controller var不匹配的选择器=controller . selectors . where(x=x . attributeroutermodel==null)。to list();If(不匹配的选择器. any ()) {foreach(不匹配的选择器中的var选择器模型){//添加路由前缀选择器模型. attributeroutermodel=_ centralprefix;}}}}}注意这里的代码分为两部分,一是控制器有路由配置,二是没有路由配置。因此需要根据具体情况进行选择。
步骤2:在添加了上面的内容之后,让我们定义一个类来插入我们的路径。
这个方法主要扩展了MVCoptions类
public static class mvcopyinsextensions {///summary///extension method/////summary///param name=' opts '/param///param name=' route attribute '/param public static void UseCentralRoutePrefix(此MvcOptions opts,iroutetetemplatprovider route attribute){//add route conventi on opts . conventi on . insert(0,new route conventi on(route attribute)),它通过我们自己的定义实现了IApplicationModelConvention}}描述:routeAttribute是我们自定义的前缀内容。
步骤3:在启动时的ConfigureServices方法中添加配置信息
# region configure global route//为每个控制器添加前缀(在没有特定路由之前添加前缀)services . addmvc(opt={ opt . usecentralrouteprefix(new route attribute(' LG/v1/[action]')));//opt。UseCentralRoutePrefix(新的RouteAttribute(' API/[控制器]/[操作]));});#endregion说明:上面的方括号在此有效。内容可以定制。
第四步:跑步
1、原控制器路由前缀预留
2.删除原始路由前缀
三.摘要
至此,全局路由配置前缀已经很好地实现了。你可以开心地玩。
Github代码地址:github
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。