【问题标题】:ASP.NET Core ODataController not found找不到 ASP.NET Core ODataController
【发布时间】:2021-09-05 05:39:38
【问题描述】:

我正在尝试在现有的 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-core controller odata


    【解决方案1】:

    AccountActionController 没有出现在 Odata 中 端点或非odata端点!!!

    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

    【讨论】:

    • 只是补充一点,我遇到了完全相同的问题 - 我的控制器命名正确,但是因为我懒惰地将代码从非 OData 控制器复制/粘贴到我的新(正确命名的)OData 控制器中- 我仍然将我的“获取所有”方法命名为 Index() - 它必须命名为 Get()
    • @JamesLove 我会为这条评论点赞一千次......这终于解决了我的问题(我的 Get 方法被命名为 Query)。也许你想回答我的问题stackoverflow.com/q/70410729/642579。我将删除我的答案并接受你的答案。
    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2019-01-31
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多