.NET 8 Web API部署时如何仅发布V1版本并屏蔽V2版本
.NET 8 Web API 仅部署V1版本端点的实现方案
以下几种方法可以帮你彻底限制V2版本端点不被部署,按需选择:
方法一:编译层面排除V2代码(最彻底)
直接通过条件编译指令,让Release部署时不编译V2控制器的代码,从根源上移除V2端点。
- 给V2控制器类添加条件编译标记:
#if !EXCLUDE_V2 [ApiController] [Route("api/v2/[controller]")] public class SampleV2Controller : ControllerBase { // V2端点的业务逻辑 } #endif
- 在项目文件(.csproj)中配置Release模式下的编译常量:
<PropertyGroup Condition="'$(Configuration)' == 'Release'"> <DefineConstants>$(DefineConstants);EXCLUDE_V2</DefineConstants> </PropertyGroup>
这样发布Release版本时,编译器会自动跳过V2控制器的代码,最终部署的程序集里完全没有V2相关内容。
方法二:启动时筛选控制器(运行时屏蔽)
如果不想修改代码结构,可以在Program.cs中配置控制器筛选逻辑,让应用启动时只加载V1的控制器。
方式A:按命名空间筛选
假设V1控制器都在YourNamespace.Api.V1命名空间下,V2在YourNamespace.Api.V2:
builder.Services.AddControllers(options => { // 添加筛选器,只包含命名空间含V1的控制器 options.Filters.Add(new ControllerTypeFilterAttribute(type => type.Namespace?.Contains(".V1.") == true)); });
方式B:自定义控制器特性筛选
先给V1控制器加自定义特性[IncludeInDeployment],然后筛选加载带该特性的控制器:
// 自定义特性 [AttributeUsage(AttributeTargets.Class)] public class IncludeInDeploymentAttribute : Attribute { } // V1控制器标记特性 [IncludeInDeployment] [ApiController] [Route("api/v1/[controller]")] public class SampleV1Controller : ControllerBase { } // Program.cs中配置筛选 builder.Services.AddControllers() .ConfigureApplicationPartManager(apm => { var originalProvider = apm.FeatureProviders.OfType<ControllerFeatureProvider>().First(); apm.FeatureProviders.Remove(originalProvider); apm.FeatureProviders.Add(new FilteredControllerProvider()); }); // 自定义控制器提供类 public class FilteredControllerProvider : ControllerFeatureProvider { protected override bool IsController(TypeInfo typeInfo) { // 只加载带IncludeInDeployment特性的控制器 return base.IsController(typeInfo) && typeInfo.GetCustomAttribute<IncludeInDeploymentAttribute>() != null; } }
方法三:拆分项目单独部署(适合长期版本维护)
如果V1和V2的业务逻辑差异较大,建议直接将V1和V2拆分成两个独立的Web API项目,部署时只发布V1项目即可,这种方式最清晰,也方便后续版本迭代。
内容的提问来源于stack exchange,提问作者swara
相关产品推荐
相关产品推荐

