自动给 Asp.Net Core WebApi 增加 ApiVersionNeutral
Intro
ApiVersionNetural

ApiVersionNeutralAttribute

ApiVersionActionSelector

ControllerApiVentionBuilder

总结如下:
如果 Controller 的 Attribute 定义的有 ApiVersionNeutralAttribute 就会忽略 ApiVersion 的限制,即使没有使用 ApiVersion 或者使用任意一个 ApiVersion 都可以路由到 Action,都可以访问得到,也不会出现开篇提到的错误。
解决方案#
可以自己实现一个 IControllerModelConvention,去给没有定义 ApiVersion 的控制器加 ApiVersionNeutralAttribute,实现代码如下:
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
services.AddMvc(options =>     {         options.Conventions.Add(new ApiControllerVersionConvention());     });启动项目,这时候再访问原来因为没有定义 ApiVersion 的控制器下的路由,这时就不会再报错了,使用任意一个 ApiVersion 也都不会有问题了,问题解决啦~~~
扩展方法#
为了方便使用,你也可以加一个扩展方法,在扩展方法里配置 MvcOptions,根据自己的需要,我觉得两种方式都 OK 的,扩展方法示例如下:
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 之后加上扩展方法就可以了
                        
                        
                    