Клиент Fhir против сервера hapi никогда не возвращает более 2000 записей

Я использую клиент .NET Fhir против сервера Smile (hapi) CDR Fhir. У меня 3235 пациентов, которых я пытаюсь получить, используя приведенный ниже код, но никогда не набираю больше 2000 точно. Я пробовал добавлять заголовки, используя, а не используя параметр no-cache. Я знаю, что на сервере больше записей, потому что я выдаю Patient/?_summary=count, который дает мне общее количество ожидаемых записей (3235).

Я отключил кеш сервера, обновил индексы, но всегда получаю ровно 2000 записей. Я также пробовал разные методы поиска пациентов с помощью методов поиска () стихов Get (), но оба дали один и тот же результат. Может ли кто-нибудь предложить другой способ вернуть правильное количество пациентов или намекнуть, что я делаю неправильно?

var patients = new List<Patient>();
var bundle = (Bundle)client.Get("Patient");
while (bundle != null)
{
    patients.AddRange(bundle.Entry.Select(e => e.Resource as Patient));
    bundle = client.Continue(bundle);
}

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

client.OnBeforeRequest += (object sender, BeforeRequestEventArgs e) =>
{
    e.RawRequest.Headers.Clear();
    e.RawRequest.Headers.Add("Accept", "application/fhir+json;fhirVersion=4.0");
    e.RawRequest.Headers.Add("Cache-Control", "no-cache");
};

person Geekn    schedule 09.10.2019    source источник


Ответы (1)


Сервер имеет право устанавливать верхний предел данных, которые он будет возвращать за один вызов, независимо от того, сколько записей запрашивает клиент. Единственный способ получить больше данных - пролистать его, используя ссылку «следующая», как определено в спецификации FHIR.

person Lloyd McKenzie    schedule 09.10.2019
comment
Обратите внимание, что если вы тот, кто запускает сервер, должен быть параметр конфигурации, позволяющий настроить этот предел в зависимости от ожидаемых потребностей ваших клиентов и способности оборудования обрабатывать ожидаемую нагрузку. - person Lloyd McKenzie; 10.10.2019
comment
Оператор client.Continue в приведенном выше коде - это метод для перехода к следующему результату. Таким образом, если цикл завершается после 2000 пациентов, когда их должно быть больше, это похоже на ошибку сервера, но не результат ограничения размера страницы. - person Mirjam Baltus; 10.10.2019
comment
Да, сервер по умолчанию 50 на страницу и максимум 250 страниц (что намного меньше, чем я ожидаю). Я просматриваю страницы, как указал @MirjamBaltus, поэтому все еще задаюсь вопросом, откуда исходит ограничение. - person Geekn; 10.10.2019
comment
@Geekn: ограничение не исходит от FhirClient, который просто использует ссылку «следующий» в Bundle для получения результатов. Чтобы выйти из цикла, последний просмотренный пакет не будет иметь этого. Вы можете попытаться получить предпоследний Bundle с помощью Postman или curl и пролистать страницу вручную. Если на сервере установлен лимит, он быстро остановится. Если этого не происходит, и вы продолжаете получать пакеты со ссылкой «следующий» в нем, это, вероятно, будет означать, что ограничение выполняется где-то посередине. Или вы можете спросить SmileCDR, установили ли они такое ограничение. - person Mirjam Baltus; 10.10.2019