Entity Framework REST Services в Azure - удаленное получение Entity - PullRequest
0 голосов
/ 09 мая 2018

У меня есть некоторые REST-сервисы Entity Framework в C #, которые получают данные с сервера SQL. Эти службы будут размещены на Azure.

Невозможно открыть базу данных для удаленных подключений, я не хочу, чтобы каждый запрос проходил через ретранслятор служебной шины, и я не могу разместить базу данных в Azure.

Есть ли способ, чтобы соединение с БД проходило только через служебную шину, чтобы объект затем загружался в память в Azure, тогда запросы могут идти против этого?

Я пробую что-то вроде:

public class ATPublicRestContext : DbContext
{
    public ATPublicRestContext() : base("name=WEBEntities")
    {
        //do something here to call the dbcontext through a service bus? 
        //Is that even possible

        //or somehow get base("name-WEBEntities") to call the service bus 
        //binding instead of the connection string to the DB?
    }
}

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Я собираюсь опубликовать другой ответ, так как вы, кажется, не можете разрешить все запросы через гибридное соединение.Однако выполнимость этого действительно зависит от объема данных и от того, как часто они меняются.

Вы можете легко кэшировать объекты в память при запуске.Поэтому, когда ваше приложение запускается, оно попадает в базу данных и заполняет эти коллекции.Затем ваши фактические контроллеры API будут запрашивать эти коллекции, а не базу данных.Это довольно стандартный подход для небольших, в основном статических данных, но, конечно, небольших объемов данных, которые часто меняются.

Потенциальные проблемы:

  1. Можете ли вы разумно поместить все эти данныев память?
  2. Вам когда-нибудь понадобится масштабировать API?Если это так, теперь вам нужно несколько копий данных в памяти, в нескольких местах.
  3. Как часто данные изменяются?Если есть какие-либо изменения, вам нужно будет сделать недействительными данные в памяти и перезагрузить их из базы данных.

Еще один способ нарезать его - не загружать его при запуске, а отслеживатькакие объекты были загружены, так что первый запрос может инициировать загрузку.

Однако, как я уже говорил в своем первом ответе, я действительно попытался бы доказать, что гибридное соединение является проблемой, прежде чем делать что-то подобное.Но это способ выполнить то, что вы, кажется, хотите сделать.

ОБНОВЛЕНИЕ :

Основываясь на вашем комментарии, вот общая идея: где-то в вашемстартовый код, вы бы вызвали метод для заполнения ваших коллекций сущностей.Это могут быть просто общие списки, содержащиеся в классе, что-то вроде этого:

// in your startup code
EntityRepository.SaturateEntities();

...

// here is the entity repo
public class EntityRepository
{
    public static List<SomeEntity> SomeEntities { get; private set; }
    public static List<SomeOtherEntity> SomeOtherEntities { get; private set; }

    public static void SaturateEntities()
    {
        // _db is assumed to be your entity framework context
        // ToList() will actually execute the query and return the results
        SomeEntities = _db.SomeEntities.ToList();
        SomeOtherEntities = _db.SomeOtherEntities.ToList();
    }
}

Теперь в ваших контроллерах API вы будете запрашивать списки в EntityRepository вместо запроса контекста данных.Есть много разных способов сделать это, но, надеюсь, это даст вам общее представление.Также, вместо загрузки всех при запуске, вы можете подождать до первого запроса.Таким образом, хранилище будет просто отслеживать, какие списки уже инициализированы, и загружать их только тогда, когда они необходимы.

0 голосов
/ 10 мая 2018

Существует несколько способов обеспечить и открыть связь между On-Prem и Azure. Простой подход - использовать VPN-туннель, чтобы он защищал трафик. Другие способы включают в себя экспресс-маршруты, которые не являются дешевыми. https://docs.microsoft.com/en-us/azure/architecture/reference-architectures/hybrid-networking/

Однако, если это больше вопрос архитектуры программного обеспечения, то вы наверняка ограничены кэшированием данных в Azure и периодически обновляете кэш / хранилище, чтобы ограничить циклические переходы между Azure и On-Prem.

0 голосов
/ 10 мая 2018

Простое кэширование данных в памяти ограничит вашу возможность масштабирования (одно из преимуществ использования в Azure - это легко сделать). Чтобы сделать то, что вы хотите, а не предотвратить горизонтальное масштабирование, вы можете посмотреть на использование слоя распределенного кэширования. Это может помочь вам понять это:

http://blogs.alachisoft.com/ncache/using-distributed-cache-in-entity-framework-applications/

Однако, если вы сделаете это, вы добавите много сложности в свое приложение. Сначала я хотел бы спросить, есть ли у вас проблемы с предварительной базой данных? Вы тестировали и доказали, что он не работает? Я не буду пытаться решить эту проблему, пока она действительно не станет проблемой.

Сервисные гибридные подключения приложений (которые используют ретрансляторы служебной шины) просты в настройке и использовании и обеспечивают безопасное подключение к предварительным данным:

https://docs.microsoft.com/en-us/azure/app-service/app-service-hybrid-connections

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...