ASP.NET 找不到核心 ODataController

ASP.NET Core ODataController not found

我正在尝试在现有 ASP.NET (.net5) api.

中构建一个非常简单的 odata 服务

使用:

   <PackageReference Include="Microsoft.AspNetCore.OData" Version="8.0.0-rc3" />

我以为会很简单(我只需要支持GET和Get-$count),但我肯定漏掉了什么。

这是我的:

型号:

public partial class MySuspension
{
        public long Id { get; set; }
  
        [Required]
        [StringLength(50)]
        public string AccountName { get; set; }
  
        [Column(TypeName = "datetime")]
        public DateTime RegisteredDate { get; set; }
        
        [StringLength(8)]
        public string Responder { get; set; }
        
        public long? UnblockPermissions { get; set; }
}

我将 entity framework 用于数据库访问,因此模型 class 是为 EF 生成的(因此有一些属性)。

启动:

这是“配置”方法的基本顺序:

 app.UseMiddleware<GlobalExceptionHandlerMiddleware>();

            app.UseHttpsRedirection();
            
            app.UseStaticFiles();

            app.UseODataRouteDebug();  ///// <----
            
            app.UseODataQueryRequest();///// <----
            
            app.UseODataBatching();///// <----

            app.UseCors("InternalApplications");

            app.UseAuthentication();

            app.UseRouting();

            app.UseAuthorization();

            app.UseRequestLocalization(app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value);

            UseSwagger(app);

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapHealthChecks("/health");
            });

我这样注册我的控制器:

var builder = new ODataConventionModelBuilder();
builder.EntitySet<MySuspension>("ActSus");
var model0 = builder.GetEdmModel();
 
services.AddControllers()
           .AddOData(opt =>
           {
                opt.AddModel("data",model0)
                  .Count().Filter().Expand()
                  .Select().OrderBy()
                  .SetMaxTop(null);
            });
           

以上设置非常适合“正常”api 方法,因此没有任何 auth/cors 问题。

控制器:


 public class AccountActionController : ODataController
    {
        private readonly MyDbContext _dbContext;

        public AccountActionController(MyDbContext dbContext)
        {
            _dbContext = dbContext;
        }

        [EnableQuery]
        [HttpGet]
        public IActionResult Get()
        {
            return Ok(_dbContext.AccountSuspensions);
        }
    }

据我了解,这应该可行。我继承自 OdataController - 这(我认为)意味着我不需要使用任何其他属性。我认为甚至 HttpGet 和 EnableQuery 属性也可能是多余的。

当我 运行 它时,odata 路由调试页面显示 ~/data 和 ~/data/$metadata 作为唯一的 OData 端点。

~/data/$metadata 显示了正确的 XML 文档,准确定义了我的 MySuspension 对象。

AccountActionController 未出现在 Odata 端点或非 Odata 端点中!!!

啊啊!!!沮丧!!!

我知道我是个白痴,但我一辈子都看不出自己做错了什么。

任何帮助将不胜感激。

谢谢。

The AccountActionController does not appear in either the Odata endpoint or in the non-odata endpoints!!!

var builder = new ODataConventionModelBuilder();
builder.EntitySet<MySuspension>("ActSus");
var model0 = builder.GetEdmModel();

问题与上述代码有关,由于Controller的名字是AccountAction,你应该把实体集的名字从ActSus改成AccountAction,代码如下:

    var builder = new ODataConventionModelBuilder(); 
    builder.EntitySet<MySuspension>("AccountAction"); //change the name.
    var model0 = builder.GetEdmModel();

    services.AddControllers().AddOData(opt =>
        opt.AddModel("odata", model0)
            .Count().Filter().Expand()
            .Select().OrderBy()
            .SetMaxTop(null)
    );

那么结果是这样的:

如果要更改请求 url,请尝试使用 Attribute Routing in ASP.NET Core OData 8.0 RC

参考:ASP.NET Core OData 8.0 Preview for .NET 5