Нечетное поведение Web.Contents при выполнении нескольких вызовов API в зависимости от времени загрузки - PullRequest
0 голосов
/ 16 апреля 2020

Для ясности синтаксиса и логики у нас нет проблем. Требуемое пояснение основано на вызовах API, которые от источника требуют много времени. Из того, что мы можем сказать, когда PowerQuery использует Web.Contents для получения пакета JSON, он будет кэшировать набор данных внутри, если он настроен правильно. Имеется ввиду один вызов и одна загрузка на сервер. Мы испытали это на производстве и получили желаемый эффект.

Однако, если загрузка API занимает слишком много времени, PowerBI игнорирует кэшированный набор данных и снова отправляет идентичный запрос. Это НЕ желаемый эффект. Тот же точный PowerQuery, тот же API (те же данные, только расширенный набор), другое поведение.

Кэш, похоже, игнорируется при отметке 4 минуты. Если мы статически размещаем одни и те же данные и вызываем их (не задействуя сервер для refre sh), они работают отлично, кеш используется. Эта проблема возникает только в том случае, если второй запрос некоторое время ждал.

Короткий запрос загрузки -> один вызов. Длинный запрос загрузки -> один вызов для каждого.

Может кто-нибудь предоставить решение или понять, почему? Это нормальная процедура?

Ниже приведены все настройки, которые мы включили / отключили, и наши PowerQueries

В этом блоге мы настроили PowerQuery со следующими параметрами: https://blog.crossjoin.co.uk/2019/10/13/why-does-power-bi-query-my-data-source-more-than-once/

  • Параллельная загрузка отключена
  • Фон refre sh отключен
  • Web.Contents имеет установленный тайм-аут и IsRetry = false
  • Все в настройках конфиденциальности установлено игнорирование
  • Использование Fx в качестве базового запроса

Структура запроса выглядит следующим образом (игнорируйте ошибку в таблице заголовков, которую я вынул из intr anet):

enter image description here

SvcOrderFx:

() as table=>
let
    WebCall = Web.Contents("http://intranetapi.com?request=serviceorders",
        [Timeout=#duration(0, 0, 30, 0), IsRetry=false]),
    Source = Json.Document(WebCall),
    #"Converted to Table" = Record.ToTable(Source)
in
    #"Converted to Table"

ServiceOrderHeader:

let
    Source = SVCOrderFX(),
    Value = Source{0}[Value],
    #"Converted to Table" = Table.FromList(Value, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    #"Converted to Table"

ServiceOrderDetail :

let
    Source = SVCOrderFX(),
    Value = Source{1}[Value],
    #"Converted to Table" = Table.FromList(Value, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    #"Converted to Table"
...