我正在尝试在 WebAPI .NET 6 项目中实现一个非常简单和基本的 OData 支持,遵循这个论坛https://devblogs.microsoft.com/odata/up-running-w-odata-in-asp- net-6/ 建议。
我在 Program.cs 中配置 OData 是这样的:
builder.Services.AddControllers()
.AddOData(options =>
options.EnableQueryFeatures(null))
.AddNewtonsoftJson(options =>
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
并添加了一个基本的特定控制器如下:
[Authorize]
[Route("ext/[controller]")]
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]
public IQueryable<MyType> Get()
{
return _myTypeExtManager.GetAll();
}
}
“IExtendedManager”作为作用域服务注入“Program.cs”中的应用程序构建器,并包含一个 EF Core 上下文实例。
该应用程序可以很好地构建和运行。 Swagger 正确显示,按预期路由 ext/Extended。 不过,当我尝试使用 PostMan 向 WebApi 请求时,$select 功能根本不起作用。它不会给我任何结果,但会无限挂起请求(尽管调试我可以看到该方法被调用并返回结果)。有趣的是,$top 和 $skip 选项在同一条路线上正常工作。
更新
根据要求,这是注入管理器的实现:
public class MyTypeExtManager : IExtendedManager<MyType>
{
private readonly MyContext _context;
public MyTypeExtManager(MyContext context)
{
_context = context;
}
public IQueryable<MyType> GetAll()
{
return _context.MyType;
}
}
有什么我想念的吗?