【问题标题】:ASP.NET Odata multiple sub routesASP.NET Odata 多个子路由
【发布时间】:2019-11-04 20:09:18
【问题描述】:

我正在尝试通过 Odata Web API 公开多个数据库。 现在我想把我的每个数据库分成一个单独的子 url。 我已经定义了必要的 IEdm 模型和控制器。 当我只使用一个 Odata Url 时,API 正在按预期工作。

我使用多个子网址的方法是这样的:

    app.UseMvc(c =>
        {
            c.EnableDependencyInjection();
            c.Expand().Select().OrderBy().Filter().Count().MaxTop(null).SetTimeZoneInfo(timeZone);
            c.MapODataServiceRoute("Database1", "api/v1/Database1", Database1.GetModel());
            c.MapODataServiceRoute("Database2", "api/v1/Database2", Database2.GetModel());
        });

但是当我尝试访问数据库 2 的元数据时,我收到了InvalidOperationException,因为某些模板仅在数据库 1 的控制器中定义,而不是在数据库 2 的控制器中。

我的数据库 1 控制器如下所示:

    public class Database1Controller : ODataController
    {
        private Database1Context Context = new Database1Context();

        [EnableQuery]
        [ODataRoute(DB1Entity1.ApiSubUrl)]
        public IQueryable<DB1Entity1> GetEntity1()
        {
            return Context.Entity1.AsQueryable();
        }

        [EnableQuery]
        [ODataRoute(DB1Entity2.ApiSubUrl)]
        public IQueryable<DB1Entity2> GetEntity2()
        {
            return Context.Entity2.AsQueryable();
        }
    } 

我的数据库 2 控制器如下所示:

    public class Database2Controller : ODataController
    {
        private Database2Context Context = new Database2Context();

        [EnableQuery]
        [ODataRoute(DB2Entity1.ApiSubUrl)]
        public IQueryable<DB2Entity1> GetEntity1()
        {
            return Context.Entity1.AsQueryable();
        }
    }

我可以访问api/v1/Database1 url 的元数据和所有控制器功能,但无法访问api/v1/Database2 url 的元数据或控制器功能。

【问题讨论】:

    标签: c# asp.net-core odata


    【解决方案1】:

    多个sub url的解决方案是将一个控制器方法的odata路由验证限制在特定的路由。

    所以控制器 1 看起来像这样:

    public class Database1Controller : ODataController
    {
        private Database1Context Context = new Database1Context();
    
        [EnableQuery]
        [ODataRoute(DB1Entity1.ApiSubUrl, RouteName = "Database1")]
        public IQueryable<DB1Entity1> GetEntity1()
        {
            return Context.Entity1.AsQueryable();
        }
    
        [EnableQuery]
        [ODataRoute(DB1Entity2.ApiSubUrl, RouteName = "Database1")]
        public IQueryable<DB1Entity2> GetEntity2()
        {
            return Context.Entity2.AsQueryable();
        }
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 2016-06-17
      • 1970-01-01
      相关资源
      最近更新 更多