首页 > 解决方案 > 找不到 ASP.NET Core ODataController

问题描述

我正在尝试在现有的 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; }
}

我正在为 db-access 使用实体框架,因此为 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 端点中!!!

啊啊啊!!!挫折!!!

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

任何帮助将非常感激。

谢谢。

标签: asp.net-corecontrollerodata

解决方案


AccountActionController 不会出现在 Odata 端点或非 Odata 端点中!!!

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

问题与上述代码有关,由于Controller的名称是AccountAction,您应该将实体集名称从 更改ActSusAccountAction,代码如下:

    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,请尝试使用ASP.NET Core OData 8.0 RC 中的属性路由

参考:.NET 5 的 ASP.NET Core OData 8.0 预览版


推荐阅读