.NET 6 WebAPI中OData $select查询请求无响应问题排查
问题分析与解决方案
核心问题:缺少OData EDM模型注册
你当前的配置仅启用了OData查询功能,但没有为MyType注册EDM(Entity Data Model)模型。$select这类需要依赖元数据识别实体属性的查询操作,会因为缺少模型定义,导致OData在处理投影时无法正确解析,进而出现请求挂起的情况——虽然Get方法返回了IQueryable,但后续的OData查询处理/序列化环节无法完成。
修复步骤
1. 创建并注册OData EDM模型
首先添加生成EDM模型的方法,可放在Program.cs或单独的模型类中:
using Microsoft.OData.Edm; using Microsoft.OData.ModelBuilder; public static IEdmModel GetEdmModel() { var modelBuilder = new ODataConventionModelBuilder(); // 将MyType注册为OData实体集,名称需与控制器名匹配(ExtendedController对应实体集名Extended) modelBuilder.EntitySet<MyType>("Extended"); return modelBuilder.GetEdmModel(); }
然后在Program.cs的OData配置中添加模型:
builder.Services.AddControllers() .AddOData(options => options.EnableQueryFeatures(null) // 注册EDM模型,指定路由前缀与控制器路由匹配 .AddModel("ext", GetEdmModel())) .AddNewtonsoftJson(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
2. 调整控制器路由(可选但推荐)
OData控制器推荐使用OData路由约定,可保留原有[Route]或改用OData专属路由特性,确保与模型匹配:
[Authorize] [ODataRoutePrefix("Extended")] public class ExtendedController : ODataController { private readonly IExtendedManager<MyType> _myTypeExtManager; private readonly ILogger<ExtendedController> _logger; public ExtendedController(IExtendedManager<MyType> myTypeExtManager, ILogger<ExtendedController> logger) { _myTypeExtManager = myTypeExtManager; _logger = logger; } [HttpGet] [EnableQuery] [ODataRoute] public IQueryable<MyType> Get() { return _myTypeExtManager.GetAll(); } }
3. 验证查询操作
重启项目后,调用带$select的请求测试,例如:GET /ext/Extended?$select=Property1,Property2
此时OData可基于EDM模型正确解析$select,生成对应的EF Core投影查询,不会再出现请求挂起的情况。
内容的提问来源于stack exchange,提问作者ImproveSoftware
相关产品推荐
相关产品推荐

