ASP.NET Core OData中如何为IEdmModel未绑定函数指定路由前缀
问题根因
你配置的my_route_prefix路由前缀对未绑定函数不生效,核心是两个问题:
- 你在Action上硬编码了
[HttpGet("CalculateSalary(minSalary={min})")]路由模板,绕开了OData组件自动拼接路由前缀的逻辑,模板会被直接注册到应用根路径下 - Action入参名
min和Edm模型中注册的参数名minSalary不一致,会导致参数绑定失败
正确配置方法
不需要在每个未绑定函数的特性上手动拼接路由前缀,按下面的方式调整即可让所有未绑定函数自动继承配置的路由前缀:
推荐写法:使用OData约定路由,不硬编码路由模板
直接去掉HttpGet特性中自定义的路由模板,保证Action名称、入参名和Edm模型中注册的函数完全匹配即可,OData组件会自动完成路由注册和前缀拼接:
public class ProductsController : ODataController { [HttpGet] [EnableQuery] public IActionResult Get() { return Ok( new List<Product>() { new Product() { Id = 1, Category = "Foo" } } ); } // 无需写路由模板,参数名和Edm注册的minSalary保持一致 [HttpGet] public string CalculateSalary( int minSalary ) { return $"Unbound function call on CalculateSalary: min={minSalary}"; } }
如果遇到路由匹配冲突,可以给未绑定函数加上无参数的[ODataRoute]特性,显式告知组件这是OData路由端点,组件会自动从Edm模型匹配对应函数签名,拼接配置的路由前缀:
[ODataRoute] [HttpGet] public string CalculateSalary( int minSalary ) { return $"Unbound function call on CalculateSalary: min={minSalary}"; }
配置完成后,未绑定函数的路由会自动生成为~/my_route_prefix/CalculateSalary(minSalary={minSalary}),所有Edm中注册的未绑定函数都遵循这个规则,不需要逐个手动加前缀。
自定义模板场景的写法
如果你确实需要在HttpGet特性中自定义路由模板,不要写根路径级别的绝对模板,直接写函数对应的路由片段即可,OData会自动为其拼接配置的路由前缀,同时保证参数名和Edm注册的名称一致:
// 模板不要以/开头,不要硬编码前缀 [HttpGet("CalculateSalary(minSalary={minSalary})")] public string CalculateSalary( int minSalary ) { return $"Unbound function call on CalculateSalary: min={minSalary}"; }
路由验证
你已经在中间件管道中添加了app.UseODataRouteDebug(),启动应用后访问~/$odata路由调试页,就能看到所有OData端点的最终注册路径,可以直接确认未绑定函数是否正确带上了my_route_prefix前缀。
内容的提问来源于stack exchange,提问作者dotjpg3141
相关产品推荐
相关产品推荐

