如何仅为OData控制器禁用ApiVersioning?ASP.NET Core 3.1问题
解决ASP.NET Core 3.1中OData控制器因ApiVersioning导致的404问题
这个场景我之前处理过,ApiVersioning的路由约束确实会和OData路由产生冲突,导致OData控制器无法被正确匹配。下面给你几种可行的方案,让你可以单独为OData控制器禁用ApiVersioning:
方案1:给OData控制器添加[ApiVersionNeutral]特性
这是最直接的方式,只要在你的OData控制器类上标记这个特性,ApiVersioning就会完全忽略该控制器的版本检查,请求可以正常路由到它:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.OData.Routing.Controllers; [ApiVersionNeutral] public class ProductsODataController : ODataController { // 你的OData操作方法,比如Get、Post等 }
这个特性会告诉版本控制系统,该控制器不参与任何版本匹配逻辑,无论请求中是否带有版本信息,都会被正确路由。
方案2:全局配置ApiVersioning以排除OData控制器
如果你的OData控制器都是继承自ODataController,可以在ApiVersioning的全局配置中一次性排除所有OData控制器,不用逐个加特性:
serviceCollection.AddApiVersioning(options => { options.ReportApiVersions = true; options.AssumeDefaultVersionWhenUnspecified = true; // 标记所有ODataController的子类为无版本要求 options.Conventions.Controller<ODataController>().IsApiVersionNeutral(); });
这种方式适合有多个OData控制器的场景,能减少重复代码。如果你的OData控制器集中在某个特定命名空间下,还可以自定义规则来排除整个命名空间的控制器:
options.Conventions.Add(new VersionByNamespaceConvention()); // 假设你的OData控制器在YourApp.OData命名空间下 options.Conventions.ControllerNamespace("YourApp.OData").IsApiVersionNeutral();
方案3:调整路由匹配顺序
ApiVersioning会给REST控制器的路由添加版本约束,可能会抢占OData路由的匹配优先级。你可以在Configure方法中,把OData路由的配置放在REST控制器路由之前,确保OData请求先被匹配:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger) { ... app.UseEndpoints(endpoints => { // 先配置OData路由 endpoints.EnableDependencyInjection(); endpoints.MapODataRoute("odata", "/odata", ODataConfiguration.GetEdmModel()); // 再配置REST控制器的路由 endpoints.MapControllers(); ... }); ... }
路由匹配是按照配置顺序执行的,先定义的路由会优先匹配请求,这样OData的请求就不会被带版本约束的REST路由拦截了。
建议先尝试方案1,因为它最直观且改动最小,测试确认OData控制器能正常响应后,再根据你的项目规模选择是否用方案2或3来优化。
内容的提问来源于stack exchange,提问作者Lukáš Vlček
相关产品推荐
相关产品推荐

