首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到ASP.NET核心ODataController

找不到ASP.NET核心ODataController
EN

Stack Overflow用户
提问于 2021-06-21 14:31:45
回答 1查看 1.2K关注 0票数 1

我正在尝试将一个非常简单的odata服务构建到现有的ASP.NET (.net5) api中。

使用:

代码语言:javascript
复制
   <PackageReference Include="Microsoft.AspNetCore.OData" Version="8.0.0-rc3" />

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

以下是我所拥有的:

模型:

代码语言:javascript
复制
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生成的(因此产生了一些属性)。

启动:

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

代码语言:javascript
复制
 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");
            });

我把我的控制器注册如下:

代码语言:javascript
复制
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问题。

控制器:

代码语言:javascript
复制
 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路由调试页面显示~/ OData和~/data /$元数据是唯一的端点。

~/data/$元数据显示了一个正确的XML文档,它准确地定义了我的MySuspension对象。

AccountActionController既不会出现在Odata端点中,也不会出现在非数据端点中!

啊!沮丧!

我知道我是个白痴,但我不能从我的生活中看出我做错了什么。

任何帮助都会很感激的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-22 06:56:46

AccountActionController既不会出现在Odata端点中,也不会出现在非数据端点中! var builder =新的ODataConventionModelBuilder();builder.EntitySet("ActSus");var model0 = builder.GetEdmModel();

这个问题与上面的代码有关,因为控制器的名称是AccountAction,所以您应该将实体集名称从ActSus更改为AccountAction,代码如下:

代码语言:javascript
复制
    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.0RC中的属性路由

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68069798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档