管理 自动给 Asp.Net Core WebApi 增加 ApiVersionNeutral

 

自动给 Asp.Net Core WebApi 增加 ApiVersionNeutral

Intro

ApiVersionNetural

apiversionneutral

ApiVersionNeutralAttribute

ApiVersionNeutralAttribute

ApiVersionActionSelector

ApiVersionActionSelector

ControllerApiVentionBuilder

ControllerApiVentionBuilder

总结如下:

如果 Controller 的 Attribute 定义的有 ApiVersionNeutralAttribute 就会忽略 ApiVersion 的限制,即使没有使用 ApiVersion 或者使用任意一个 ApiVersion 都可以路由到 Action,都可以访问得到,也不会出现开篇提到的错误。

解决方案#

可以自己实现一个 IControllerModelConvention,去给没有定义 ApiVersion 的控制器加 ApiVersionNeutralAttribute,实现代码如下:

Copy
public class ApiControllerVersionConvention : IControllerModelConvention { public void Apply(ControllerModel controller) { if (!(controller.ControllerType.IsDefined(typeof(ApiVersionAttribute)) || controller.ControllerType.IsDefined(typeof(ApiVersionNeutralAttribute)))) { if (controller.Attributes is List<object> attributes) { attributes.Add(new ApiVersionNeutralAttribute()); } } } }

在注册 Mvc 服务的时候,配置 MvcOptions

Copy
services.AddMvc(options => { options.Conventions.Add(new ApiControllerVersionConvention()); });

启动项目,这时候再访问原来因为没有定义 ApiVersion 的控制器下的路由,这时就不会再报错了,使用任意一个 ApiVersion 也都不会有问题了,问题解决啦~~~

扩展方法#

为了方便使用,你也可以加一个扩展方法,在扩展方法里配置 MvcOptions,根据自己的需要,我觉得两种方式都 OK 的,扩展方法示例如下:

Copy
public static class MvcBuilderExtensions { public static IMvcBuilder AddApiControllerVersion(this IMvcBuilder builder) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } builder.Services.Configure<MvcOptions>(options=> options.Conventions.Add(new ApiControllerVersionConvention())); return builder; } }

使用的时候可以直接在 AddMvc 之后加上扩展方法就可以了

Copy
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信