ASP.NET Одата несколько под маршрутов - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь выставить несколько баз данных через Odata Web API. Теперь я хочу разделить каждую из моих баз данных на отдельный суб-URL. Я уже определил необходимые модели IEdm и контроллеры. API работает так, как задумано, в то время как я использую только один URL-адрес Odata.

Мой подход к использованию нескольких под URL-адресов заключается в следующем:

    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();
        }
    }

Я могу получить доступ к метаданным и всем функциям контроллера для URL api/v1/Database1, но не могу получить доступ к метаданным илифункции контроллера для api/v1/Database2 url.

1 Ответ

0 голосов
/ 04 ноября 2019

Решение для нескольких под 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();
    }
}   
...