Поделиться через


Runtime

Параметры конфигурации, определяющие поведение среды выполнения.

Параметры разбиения на страницы

Property Default Description
размер страницы runtime.pagination.max Определяет максимальные записи на страницу
runtime.pagination.default-page-size Задает записи по умолчанию на ответ

Параметры REST

Property Default Description
runtime.rest.path "/api" Базовый путь для конечных точек REST
runtime.rest.enabled true Разрешает включение или отключение запросов REST для всех сущностей
runtime.rest.request-body-strict true Запрещает лишние поля в тексте запроса, если значение true

Параметры GraphQL

Property Default Description
runtime.graphql.allow-introspection true Позволяет запрашивать базовую схему GraphQL
runtime.graphql.path "/graphql" Базовый путь для конечной точки GraphQL
runtime.graphql.enabled true Разрешает включение или отключение запросов GraphQL для всех сущностей
runtime.graphql.depth-limit null Максимальная допустимая глубина запроса GraphQL
runtime.graphql.multiple-mutations.create.enabled false Позволяет создавать несколько мутаций для всех сущностей

Параметры узла

Property Default Description
runtime.host.max-response-size-mb 100 Максимальный размер ответа базы данных (МБ), разрешенный в одном результате
runtime.host.mode "production" Режим выполнения; "production" или "development"

Параметры CORS

Property Default Description
runtime.host.cors.origins [] Разрешенные источники CORS
runtime.host.cors.allow-credentials false Задает значение заголовка Access-Control-Allow-Credentials

Параметры проверки подлинности

Property Default Description
runtime.host.authentication.provider null Поставщик проверки подлинности
runtime.host.authentication.jwt.audience null Аудитория JWT
runtime.host.authentication.jwt.issuer null Издатель JWT

Параметры кэша

Property Default Description
runtime.cache.enabled false Обеспечивает глобальное кэширование ответов
runtime.cache.ttl-seconds 5 Время жизни (в секундах) для глобального кэша

Настройки телеметрии

Property Default Description
runtime.telemetry.application-insights.connection-string null Строка подключения Application Insights
runtime.telemetry.application-insights.enabled false Включает или отключает данные телеметрии Application Insights
runtime.telemetry.open-telemetry.endpoint null URL-адрес сборщика OpenTelemetry
runtime.telemetry.open-telemetry.headers {} Заголовки экспорта OpenTelemetry
runtime.telemetry.open-telemetry.service-name "dab" Имя службы OpenTelemetry
runtime.telemetry.open-telemetry.exporter-protocol "grpc" Протокол OpenTelemetry ("grpc" или "httpprotobuf")
runtime.telemetry.open-telemetry.enabled true Включает или отключает OpenTelemetry
пространство имен runtime.telemetry.log уровня.namespace null Переопределение уровня журнала для конкретного пространства имен
runtime.health.enabled true Включает или отключает конечную точку проверки работоспособности глобально
runtime.health.role null Разрешенные роли для комплексной конечной точки работоспособности
runtime.health.cache-ttl-seconds 30 Время жизни (секунды) для записи кэша отчетов проверки работоспособности

Обзор формата

{
  "runtime": {
    "pagination": {
      "max-page-size": <integer|null> (default: `100000`),
      "default-page-size": <integer|null> (default: `100`)
    },
    "rest": {
      "path": <string> (default: "/api"),
      "enabled": <true>|<false>,
      "request-body-strict": <true>|<false> (default: `true`)
    },
    "graphql": {
      "path": <string> (default: "/graphql"),
      "enabled": <true>|<false>,
      "allow-introspection": <true>|<false>,
      "depth-limit": <integer|null> (default: `null`),
      "multiple-mutations": {
        "create": {
          "enabled": <true>|<false> (default: `false`)
        }
      }
    },
    "host": {
      "mode": <"production"> (default) | <"development">,
      "max-response-size-mb": <integer|null> (default: `158`),
      "cors": {
        "origins": [ "<string>" ],
        "allow-credentials": <true>|<false> (default: `false`)
      },
      "authentication": {
        "provider": <string> (default: "AppService"),
        "jwt": {
          "audience": "<string>",
          "issuer": "<string>"
        }
      }
    }
  },
  "cache": {
    "enabled": <true>|<false> (default: `false`),
    "ttl-seconds": <integer> (default: `5`)
  },
  "telemetry": {
    "application-insights": {
      "connection-string": "<string>",
      "enabled": <true>|<false> (default: `true`)
    },
    "open-telemetry": {
      "endpoint": "<string>",
      "headers": "<string>",
      "service-name": <string> (default: "dab"),
      "exporter-protocol": <"grpc"> (default) | <"httpprotobuf">,
      "enabled": <true>|<false> (default: `true`)
    },
    "log-level": {
      // namespace keys
      "<namespace>": <"trace"|"debug"|"information"|"warning"|"error"|"critical"|"none"|null>
    }
  },
  "health": {
    "enabled": <true>|<false> (default: `true`),
    "roles": [ "<string>" ],
    "cache-ttl-seconds": <integer> (default: `5`)
  }
}

Режим (среда выполнения узла)

Parent Property Type Required Default
runtime host перечисление (production | development) ❌ Нет production

Поведение разработки

  • Включено Nitro (ранее банановый торт pop) для тестирования GraphQL
  • Включенный пользовательский интерфейс Swagger для тестирования REST
  • Включена анонимная проверка работоспособности
  • Повышенная детализация ведения журнала (отладка)

Format

{
  "runtime": {
    "host": {
      "mode": "production" (default) | "development"
    }
  }
}

Максимальный размер ответа (среда выполнения узла)

Parent Property Type Required Default
runtime.host max-response-size-mb integer ❌ Нет 158

Задает максимальный размер (в мегабайтах) для любого заданного результата. Так как большие ответы могут напрягать систему, max-response-size-mb заголовок общего размера (отличается от количества строк), чтобы предотвратить перегрузку, которая особенно с большими столбцами, такими как текст или JSON.

Value Result
не задано Использовать по умолчанию
null Использовать по умолчанию
integer Любое положительное 32-разрядное целое число
<= 0 Не поддерживается

Format

{
  "runtime": {
    "host": {
      "max-response-size-mb": <integer; default: 158>
    }
  }
}

GraphQL (среда выполнения)

Parent Property Type Required Default
runtime graphql object ❌ Нет -

Конфигурация Global GraphQL.

Вложенные свойства

Parent Property Type Required Default
runtime.graphql enabled boolean ❌ Нет None
runtime.graphql path string ❌ Нет "/graphql"
runtime.graphql depth-limit integer ❌ Нет Нет (без ограничений)
runtime.graphql allow-introspection boolean ❌ Нет True
runtime.graphql multiple-mutations.create.enabled boolean ❌ Нет False

Заметки о свойствах

  • Вложенные пути не допускаются для path свойства.
  • Используется depth-limit для ограничения вложенных запросов.
  • Установите для allow-introspectionfalse скрытия схемы GraphQL.
  • Используется multiple-mutations для вставки нескольких сущностей в одну мутацию.

Format

{
  "runtime": {
    "graphql": {
      "enabled": <true> (default) | <false>
      "depth-limit": <integer|null> (default: `null`),
      "path": <string> (default: /graphql),
      "allow-introspection": <true> (default) | <false>,
      "multiple-mutations": {
        "create": {
          "enabled": <true> (default) | <false>
        }
    }
  }
}

Пример: несколько мутаций

Configuration

{
  "runtime": {
    "graphql": {
      "multiple-mutations": {
        "create": {
          "enabled": true
        }
      }
    }
  },
  "entities": {
    "User": {
      "source": "dbo.Users",
      "permissions": [
        {
          "role": "anonymous",
          "actions": ["create"] // entity permissions are required
        }
      ]
    }
  }
}

Мутация GraphQL

mutation {
  createUsers(input: [
    { name: "Alice", age: 30, isAdmin: true },
    { name: "Bob", age: 25, isAdmin: false },
    { name: "Charlie", age: 35, isAdmin: true }
  ]) {
    id
    name
    age
    isAdmin
  }
}

REST (среда выполнения)

Parent Property Type Required Default
runtime rest object ❌ Нет -

Глобальная конфигурация REST.

Вложенные свойства

Parent Property Type Required Default
runtime.rest enabled boolean ❌ Нет None
runtime.rest path string ❌ Нет "/api"
runtime.rest request-body-strict boolean ❌ Нет True

Заметки о свойствах

  • Если глобальный enabledfalse, отдельный уровень enabled сущности не имеет значения.
  • Свойство path не поддерживает такие значения подпаток, как /api/data.
  • request-body-strict был представлен для упрощения объектов POCO .NET.
request-body-strict Behavior
true Дополнительные поля в тексте BadRequest запроса вызывают исключение.
false Дополнительные поля в тексте запроса игнорируются.

Format

{
  "runtime": {
    "rest": {
      "enabled": <true> (default) | <false>,
      "path": <string> (default: /api),
      "request-body-strict": <true> (default) | <false>
    }
  }
}

Note

При развертывании построителя API данных с помощью статических веб-приложений (предварительная версия) служба Azure автоматически внедряет в URL-адрес другую подпатку /data-api . Это поведение обеспечивает совместимость с существующими функциями статического веб-приложения. Результирующая конечная точка будет /data-api/api/<entity>. Это примечание относится только к статическим веб-приложениям.

Пример: request-body-strict

  • Столбцы со default() значением игнорируются только в INSERT том случае, если их значение в полезных данных nullравно. В результате INSERT операции с default() столбцами, когда request-body-strict они есть true, не могут привести к явным null значениям. Для этого UPDATE требуется операция.
  • Столбцы с ней default() не игнорируются во время UPDATE независимо от значения полезных данных.
  • Вычисляемые столбцы всегда игнорируются.
  • Автоматически созданные столбцы всегда игнорируются.

Пример таблицы

CREATE TABLE Users (
    Id INT PRIMARY KEY IDENTITY, -- auto-generated column
    Name NVARCHAR(50) NOT NULL,
    Age INT DEFAULT 18, -- column with default
    IsAdmin BIT DEFAULT 0, -- column with default
    IsMinor AS IIF(Age <= 18, 1, 0) -- computed column
);

Тело запроса

{
  "Id": 999,
  "Name": "Alice",
  "Age": null,
  "IsAdmin": null,
  "IsMinor": false,
  "ExtraField": "ignored"
}

Вставка поведения при request-body-strict = false

INSERT INTO Users (Name) VALUES ('Alice');
-- Default values for Age (18) and IsAdmin (0) are applied by the database.
-- IsMinor is ignored because it’s a computed column.
-- ExtraField is ignored.
-- The database generates the Id value.

Полезная нагрузка ответа

{
  "Id": 1,          // Auto-generated by the database
  "Name": "Alice",
  "Age": 18,        // Default applied
  "IsAdmin": false, // Default applied
  "IsMinor": true   // Computed
}

Обновление поведения при request-body-strict = false

UPDATE Users
SET Name = 'Alice Updated', Age = NULL
WHERE Id = 1;
-- IsMinor and ExtraField are ignored.

Полезная нагрузка ответа

{
  "Id": 1,
  "Name": "Alice Updated",
  "Age": null,
  "IsAdmin": false,
  "IsMinor": false // Recomputed by the database (false when age is `null`)
}

CORS (среда выполнения узла)

Parent Property Type Required Default
runtime.host cors object ❌ Нет -

Глобальная конфигурация CORS.

Tip

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

Вложенные свойства

Parent Property Type Required Default
runtime.host.cors allow-credentials boolean ❌ Нет False
runtime.host.cors origins массив строк ❌ Нет None

Note

Свойство allow-credentials задает Access-Control-Allow-Credentials заголовок CORS.

Format

{
  "runtime": {
    "host": {
      "cors": {
        "allow-credentials": <true> (default) | <false>,
        "origins": ["<array-of-strings>"]
      }
    }
  }
}

Note

Подстановочный знак * действителен в качестве значения origins.

Поставщик (среда выполнения узла проверки подлинности)

Parent Property Type Required Default
runtime.host.authentication provider перечисление (AppServiceSimulator | EntraId | ) ❌ Нет AppService

Определяет метод проверки подлинности, используемый построителем API данных.

Provider Description
AppService EasyAuth через статические веб-приложения Azure. X-MS-CLIENT-PRINCIPAL внедряется только в запросы, прошедшие проверку подлинности; Если он отсутствует, DAB обрабатывает запрос как анонимный. Проверка маркеров не выполняется DAB в этом режиме. Необязательный X-MS-API-ROLE заголовок может выбрать определенную роль.
StaticWebApps [ Не рекомендуется ] Функционально идентично AppService. Используйте AppService.
EntraId Прямая проверка JWT с помощью DAB (без интерфейсной части EasyAuth). Требуется Authorization: Bearer <JWT> для проверки подлинности доступа. Если заголовок отсутствует или недопустим, пользователь рассматривается как анонимный. Необязательный X-MS-API-ROLE заголовок может выбрать определенную роль.
AzureAd [ Не рекомендуется ] Функционально идентично EntraId. Будущие версии DAB, возможно, удалите это значение.
Simulator Только разработка и тестирование. Заголовки проверки подлинности не требуются; DAB создает контекст, прошедший проверку подлинности. Необязательный параметр X-MS-API-ROLE по-прежнему может быть отправлен для имитации роли. Не для использования в рабочей среде. См. локальную проверку подлинности.

Tip

Поставщики StaticWebApps проверки подлинности построителя данных (не рекомендуется) и AppService поддерживают EasyAuth. EasyAuth не является формальным стандартом; Это псевдоним для проверки подлинности и авторизации службы приложений Azure, встроенной функции службы приложений Azure, функций Azure и статических веб-приложений Azure. Он не является частью OAuth, OIDC, SAML или любого другого открытого стандарта, хотя он использует эти протоколы под капюшоном. EasyAuth обрабатывает потоки входа с помощью поставщиков удостоверений, таких как Идентификатор Microsoft Entra, Google и GitHub.

"Простая" часть заключается в том, что вы включите его на портале Azure или с помощью шаблонов ARM без написания пользовательского ПО промежуточного слоя проверки подлинности. Распространенное недоразумение заключается в том, чтобы рассматривать EasyAuth как кроссплатформенный стандарт, когда, на самом деле, это функция Microsoft PaaS, основанная на существующих стандартах идентификации. В DAB оба StaticWebApps (нерекомендуемые) и поставщики считывают одни и AppService те же заголовки EasyAuth. Они ведут себя так же в DAB, но называются отдельно, чтобы разрешить различия в средах размещения Azure.

Format

{
  "runtime": {
    "host": {
      "authentication": {
        "provider": "AppService" | ...
      }
    }
  }
}

Note

Если поставщик имеет значение EntraId, JWT требуется раздел.

Пример: Служба приложений

{
 "host": {
  "authentication": {
   "provider": "AppService"
   }
  }
 }
}

Пример: идентификатор Microsoft Entra

{
 "host": {
  "authentication": {
   "provider": "AzureAD",
   "jwt": {
    "audience": "00001111-aaaa-2222-bbbb-3333cccc4444",
    "issuer": "https://login.microsoftonline.com/98765f43-21ba-400c-a5de-1f2a3d4e5f6a/v2.0"
   }
  }
 }
}

Пример: симулятор (только для разработки)

{
 "host": {
  "mode": "development", // Simulator is not intended for production
  "authentication": {
   "provider": "Simulator"
  }
 }
}

JWT (среда выполнения узла проверки подлинности)

Parent Property Type Required Default
runtime.host.authentication jwt object ❌ Нет -

Конфигурация глобального веб-маркера JSON (JWT).

поддержка веб-маркеров JSON в построителе API данных.

Вложенные свойства

Parent Property Type Required Default
runtime.host.authentication.jwt audience string ❌ Нет None
runtime.host.authentication.jwt issuer string ❌ Нет None

Format

{
  "runtime": {
    "host": {
      "authentication": {
        "jwt": {
          "audience": "<client-id>",
          "issuer": "<issuer-url>"
        }
      }
    }
  }
}

Разбиение на страницы (среда выполнения)

Parent Property Type Required Default
runtime pagination object ❌ Нет -

Глобальные ограничения на страницы для конечных точек REST и GraphQL.

Вложенные свойства

Parent Property Type Required Default
runtime.pagination max-page-size int ❌ Нет 100,000
runtime.pagination default-page-size int ❌ Нет 100

Поддерживаемые значения максимального размера страницы

Value Result
integer Поддерживается любое 32-разрядное целое число.
0 Не поддерживается.
-1 По умолчанию используется максимальное поддерживаемое значение.
< -1 Не поддерживается.

Поддерживаемые значения размера страницы по умолчанию

Value Result
integer Любое положительное целое число меньше текущего max-page-size.
0 Не поддерживается.
-1 По умолчанию используется текущий параметр max-page-size.
< -1 Не поддерживается.

Format

{
  "runtime": {
    "pagination": {
      "max-page-size": <integer; default: 100000>,
      "default-page-size": <integer; default: 100>
    }
  }
}

Note

Если значение больше max-page-size, результаты будут ограничены max-page-size.

Пример: разбиение по страницам в REST

Request

GET https://localhost:5001/api/users

Полезная нагрузка ответа

{
  "value": [
    {
      "Id": 1,
      "Name": "Alice",
      "Age": 30,
      "IsAdmin": true,
      "IsMinor": false
    },
    {
      "Id": 2,
      "Name": "Bob",
      "Age": 17,
      "IsAdmin": false,
      "IsMinor": true
    }
  ],
  "nextLink": "https://localhost:5001/api/users?$after=W3siRW50aXR5TmFtZSI6InVzZXJzIiwiRmllbGROYW1lI=="
}

Следующая страница запроса

GET https://localhost:5001/api/users?$after=W3siRW50aXR5TmFtZSI6InVzZXJzIiwiRmllbGROYW1lI==

Пример. Разбиение по страницам в GraphQL

Полезные данные запроса (запрос)

query {
  users {
    items {
      Id
      Name
      Age
      IsAdmin
      IsMinor
    }
    hasNextPage
    endCursor
  }
}

Полезная нагрузка ответа

{
  "data": {
    "users": {
      "items": [
        {
          "Id": 1,
          "Name": "Alice",
          "Age": 30,
          "IsAdmin": true,
          "IsMinor": false
        },
        {
          "Id": 2,
          "Name": "Bob",
          "Age": 17,
          "IsAdmin": false,
          "IsMinor": true
        }
      ],
      "hasNextPage": true,
      "endCursor": "W3siRW50aXR5TmFtZSI6InVzZXJzIiwiRmllbGROYW1lI=="
    }
  }
}

Следующая страница запроса

query {
  users(after: "W3siRW50aXR5TmFtZSI6InVzZXJzIiwiRmllbGROYW1lI==") {
    items {
      Id
      Name
      Age
      IsAdmin
      IsMinor
    }
    hasNextPage
    endCursor
  }
}

Пример: доступ к запросам max-page-size

Используйте значение, задав max-page-size для параметра $limit REST или first (GraphQL).-1

REST

GET https://localhost:5001/api/users?$limit=-1

GraphQL

query {
  users(first: -1) {
    items {
      ...
    }
  }
}

Кэш (среда выполнения)

Parent Property Type Required Default
runtime cache object ❌ Нет -

Конфигурация глобального кэша.

Вложенные свойства

Parent Property Type Required Default
runtime.cache enabled boolean ❌ Нет False
runtime.cache ttl-seconds integer ❌ Нет 5

Tip

Свойство уровня cache.ttl-seconds сущности по умолчанию используется для этого глобального значения.

Format

{
  "runtime": {
    "cache":  {
      "enabled": <boolean>,
      "ttl-seconds": <integer>
    }
  }
}

Important

Если глобальный enabledfalse, отдельный уровень enabled сущности не имеет значения.

Телеметрия (среда выполнения)

Parent Property Type Required Default
runtime telemetry object ❌ Нет -

Глобальная конфигурация телеметрии.

Вложенные свойства

Parent Property Type Required Default
runtime.telemetry log-level dictionary ❌ Нет None
runtime.telemetry application-insights object ❌ Нет -
runtime.telemetry open-telemetry object ❌ Нет -

Настраивает детализацию ведения журнала для каждого пространства имен. Это следует стандартным соглашениям по ведению журналов .NET и позволяет детализировать управление, хотя предполагается, что некоторые знания о конструкторе API данных внутренние. Построитель API данных — это открытый исходный код: https://aka.ms/dab

Format

{
  "runtime": {
    "telemetry": {
      "log-level": {
        "namespace": "log-level",
        "namespace": "log-level"
      }
    }
  }
}

Tip

log-level можно перезагрузить как в разработке, так и в рабочей среде. В настоящее время это единственное свойство, которое поддерживает горячую перезагрузку в рабочей среде.

Example

{
  "runtime": {
    "telemetry": {
      "log-level": {
        "Azure.DataApiBuilder.Core.Configurations.RuntimeConfigValidator": "debug",
        "Azure.DataApiBuilder.Core": "information",
        "default": "warning"
      }
    }
  }
}

Application Insights (телеметрия)

Parent Property Type Required Default
runtime.telemetry application-insights object ❌ Нет -

Настраивает ведение журнала в Application Insights.

Вложенные свойства

Parent Property Type Required Default
runtime.telemetry.application-insights enabled boolean ❌ Нет False
runtime.telemetry.application-insights connection-string string ✔️ Да None

Format

{
  "runtime": {
    "telemetry": {
      "application-insights": {
        "enabled": <true; default: true> | <false>
        "connection-string": <string>
      }
    }
  }
}

OpenTelemetry (телеметрия)

Parent Property Type Required Default
runtime.telemetry open-telemetry object ❌ Нет -

Настраивает ведение журнала для Open Telemetry.

Вложенные свойства

Parent Property Type Required Default
runtime.telemetry.open-telemetry enabled boolean ❌ Нет true
runtime.telemetry.open-telemetry endpoint string ✔️ Да None
runtime.telemetry.open-telemetry headers string ❌ Нет None
runtime.telemetry.open-telemetry service-name string ❌ Нет "dab"
runtime.telemetry.open-telemetry exporter-protocol перечисление (grpc | httpprotobuf) ❌ Нет grpc

Несколько заголовков разделены , запятыми.

Format

{
  "runtime": {
    "telemetry": {
      "open-telemetry": {
        "enabled": <true> (default) | <false>,
        "endpoint": <string>,
        "headers": <string>,
        "service-name": <string> (default: "dab"),
        "exporter-protocol": <"grpc" (default) | "httpprotobuf">
      }
    }
  }
}

Example

{
  "runtime": {
    "telemetry": {
      "open-telemetry": {
        "enabled": true,
        // a gRPC endpoint example
        "endpoint": "http://localhost:4317",
        // an HTTP/protobuf endpoint example
        "endpoint": "http://localhost:4318/v1/metrics",
        "headers": "api-key=key,other-config-value=value",
        "service-name": "dab",
      }
    }
  }
}

Дополнительные сведения о OTEL_EXPORTER_OTLP_HEADERS.

Note

gRPC (4317) быстрее и поддерживает потоковую передачу, но требует дополнительной настройки. HTTP/protobuf (4318) проще и проще отлаживать, но менее эффективно.

Работоспособность (среда выполнения)

Parent Property Type Required Default
runtime health object ❌ Нет -

Конфигурация конечной точки глобальной проверки работоспособности (/health).

Вложенные свойства

Parent Property Type Required Default
runtime.health enabled boolean ❌ Нет true
runtime.health roles массив строк ✔️ Да None
runtime.health cache-ttl-seconds integer ❌ Нет 5

Поведение в разработке и рабочей среде

Condition Поведение разработки Поведение рабочей среды
health.enabled = ложь 403 статус 403 статус
health.enabled = верно Зависит от роли Зависит от роли
roles опущен или null Отображается работоспособности 403 статус
текущая роль не в roles 403 статус 403 статус
текущая роль в roles Отображается работоспособности Отображается работоспособности
roles Включает anonymous Отображается работоспособности Отображается работоспособности

Format

{
  "health": {
    "enabled": <true> (default) | <false>,
    "roles": [ <string> ], // required in production
    "cache-ttl-seconds": <integer>
  }
}

Note

Если глобальный enabledfalse, отдельный уровень enabled сущности не имеет значения.

Example

{
  "health": {
    "enabled": true,
    "roles": ["admin", "support"],
    "cache-ttl-seconds": 10
  }
}