Partager via


Runtime

Paramètres de configuration qui déterminent le comportement d’exécution.

Paramètres de pagination

Property Default Description
runtime.pagination.max-page-size Définit le nombre maximal d’enregistrements par page
runtime.pagination.default-page-size Définit les enregistrements par défaut par réponse

Paramètres REST

Property Default Description
runtime.rest.path "/api" Chemin d’accès de base pour les points de terminaison REST
runtime.rest.enabled true Autorise l’activation ou la désactivation des requêtes REST pour toutes les entités
runtime.rest.request-body-strict true Interdit les champs superflus dans le corps de la demande quand la valeur est true

Paramètres GraphQL

Property Default Description
runtime.graphql.allow-introspection true Permet l’interrogation du schéma GraphQL sous-jacent
runtime.graphql.path "/graphql" Chemin d’accès de base pour le point de terminaison GraphQL
runtime.graphql.enabled true Autorise l’activation ou la désactivation des requêtes GraphQL pour toutes les entités
runtime.graphql.depth-limit null Profondeur maximale autorisée d’une requête GraphQL
runtime.graphql.multiple-mutations.create.enabled false Permet de créer plusieurs mutations pour toutes les entités

Paramètres de l’hôte

Property Default Description
runtime.host.max-response-size-mb 158 Taille maximale (Mo) de la réponse de base de données autorisée dans un résultat unique
runtime.host.mode "production" Mode en cours d’exécution ; "production" ou "development"

Paramètres CORS

Property Default Description
runtime.host.cors.origins [] Origines CORS autorisées
runtime.host.cors.allow-credentials false Définit la valeur de l’en-tête Access-Control-Allow-Credentials

Paramètres d’authentification

Property Default Description
runtime.host.authentication.provider null Fournisseur d’authentification
runtime.host.authentication.jwt.audience null Audience JWT
runtime.host.authentication.jwt.issuer null Émetteur JWT

Paramètres du cache

Property Default Description
runtime.cache.enabled false Active la mise en cache des réponses globalement
runtime.cache.ttl-seconds 5 Durée de vie (secondes) du cache global

Paramètres de télémétrie

Property Default Description
runtime.telemetry.application-insights.connection-string null Chaîne de connexion Application Insights
runtime.telemetry.application-insights.enabled false Active ou désactive la télémétrie Application Insights
runtime.telemetry.open-telemetry.endpoint null URL du collecteur OpenTelemetry
runtime.telemetry.open-telemetry.headers {} En-têtes d’exportation OpenTelemetry
runtime.telemetry.open-telemetry.service-name "dab" Nom du service OpenTelemetry
runtime.telemetry.open-telemetry.exporter-protocol "grpc" Protocole OpenTelemetry (« grpc » ou « httpprotobuf »)
runtime.telemetry.open-telemetry.enabled true Active ou désactive OpenTelemetry
runtime.telemetry.log-level.namespace null Remplacement au niveau du journal spécifique à l’espace de noms
runtime.health.enabled true Active ou désactive le point de terminaison de contrôle d’intégrité globalement
runtime.health.roles null Rôles autorisés pour le point de terminaison d’intégrité complet
runtime.health.cache-ttl-seconds 5 Durée de vie (secondes) de l’entrée du cache du rapport de contrôle d’intégrité
runtime.health.max-query-parallelism 4 Nombre maximal de requêtes de contrôle d’intégrité simultanées (plage : 1 à 8)

Vue d’ensemble du format

{
  "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`),
    "max-query-parallelism": <integer> (default: `4`)
  }
}

Mode (runtime d’hôte)

Parent Property Type Required Default
runtime host enum (production | development) ❌ Non production

Comportement de développement

  • Enabled Nitro (anciennement Banana Cake Pop) pour les tests GraphQL
  • Activation de l’interface utilisateur Swagger pour les tests REST
  • Vérifications d’intégrité anonymes activées
  • Augmentation du détail de journalisation (débogage)

Format

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

Taille de réponse maximale (runtime de l’hôte)

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

Définit la taille maximale (en mégaoctets) pour un résultat donné. Comme les réponses volumineuses peuvent forcer le système, max-response-size-mb limite la taille totale (différente du nombre de lignes) pour empêcher la surcharge, ce qui est particulièrement avec de grandes colonnes telles que du texte ou JSON.

Value Result
non défini Utiliser la valeur par défaut
null Utiliser la valeur par défaut
integer Entier 32 bits positif
<= 0 Non prise en charge

Format

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

GraphQL (runtime)

Parent Property Type Required Default
runtime graphql object ❌ Non -

Configuration globale de GraphQL.

Propriétés imbriquées

Parent Property Type Required Default
runtime.graphql enabled boolean ❌ Non None
runtime.graphql path string ❌ Non "/graphql"
runtime.graphql depth-limit integer ❌ Non Aucun (illimité)
runtime.graphql allow-introspection boolean ❌ Non True
runtime.graphql multiple-mutations.create.enabled boolean ❌ Non False

Notes de propriété

  • Les sous-chemins ne sont pas autorisés pour la path propriété.
  • Permet depth-limit de limiter les requêtes imbriquées.
  • Définissez cette option allow-introspection pour false masquer le schéma GraphQL.
  • Permet multiple-mutations d’insérer plusieurs entités dans une seule mutation.

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>
        }
    }
  }
}

Exemple : mutations multiples

Configuration

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

Mutation 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 (temps d'exécution)

Parent Property Type Required Default
runtime rest object ❌ Non -

Configuration REST globale.

Propriétés imbriquées

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

Notes de propriété

  • Si global enabled est false, le niveau enabled d’entité individuel n’a pas d’importance.
  • La path propriété ne prend pas en charge les valeurs de sous-chemin comme /api/data.
  • request-body-strict a été introduit pour simplifier les objets .NET POCO.
request-body-strict Behavior
true Des champs supplémentaires dans le corps de la requête provoquent une BadRequest exception.
false Les champs supplémentaires dans le corps de la demande sont ignorés.

Format

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

Exemple : request-body-strict

  • Les colonnes avec une default() valeur sont ignorées uniquement INSERT lorsque leur valeur dans la charge utile est null. Par conséquent, INSERT les opérations en default() colonnes, quand c’est request-body-strictle castrue, ne peuvent pas entraîner de valeurs explicitesnull. Pour accomplir ce comportement, une UPDATE opération est requise.
  • Les colonnes avec un default() ne sont pas ignorées pendant UPDATE quelle que soit la valeur de la charge utile.
  • Les colonnes calculées sont toujours ignorées.
  • Les colonnes générées automatiquement sont toujours ignorées.

Exemple de table

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

Charge utile de la demande

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

Comportement d’insertion lorsque 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.

Charge utile de la réponse

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

Mettre à jour le comportement quand request-body-strict = false

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

Charge utile de la réponse

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

CORS (runtime d’hôte)

Parent Property Type Required Default
runtime.host cors object ❌ Non -

Configuration CORS globale.

Tip

CORS signifie « Partage de ressources cross-origin ». Il s’agit d’une fonctionnalité de sécurité du navigateur qui contrôle si les pages web peuvent effectuer des requêtes à un domaine différent de celui qui les a servis.

Propriétés imbriquées

Parent Property Type Required Default
runtime.host.cors allow-credentials boolean ❌ Non False
runtime.host.cors origins tableau de chaînes ❌ Non None

Note

La allow-credentials propriété définit l’en-tête Access-Control-Allow-Credentials CORS.

Format

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

Note

Le caractère générique * est valide comme valeur pour origins.

Fournisseur (runtime d’hôte d’authentification)

Parent Property Type Required Default
runtime.host.authentication provider enum (AppServiceSimulator | | EntraId | Custom) ❌ Non None

Sélectionne la méthode d’authentification. Chaque fournisseur valide l’identité différemment. Pour une configuration pas à pas, consultez les guides pratiques liés ci-dessous.

Résumé du fournisseur

Provider Cas d’utilisation Source d’identité Guide pratique
(omis) Accès anonyme uniquement None
AppService Applications hébergées par Azure (EasyAuth) En-tête X-MS-CLIENT-PRINCIPAL Configurer l’authentification App Service
EntraID Microsoft Entra ID (Azure AD) Jeton du porteur JWT Configurer l’authentification Entra ID
Custom Fournisseurs d’identité tiers (Okta, Auth0) Jeton du porteur JWT Configurer l’authentification JWT personnalisée
Simulator Tests locaux uniquement Simulé Configurer l’authentification du simulateur

Note

Le EntraId fournisseur a été précédemment nommé AzureAd. L’ancien nom fonctionne toujours pour la compatibilité.

Anonyme uniquement (aucun fournisseur)

Lorsque la authentication section est omise, DAB fonctionne en mode anonyme uniquement. Toutes les requêtes sont affectées au Anonymous rôle système.

{
  "host": {
    // authentication section omitted
  }
}

AppService

Approuve les en-têtes d’identité injectés par Azure App Service EasyAuth.

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

EntraID

Valide les jetons JWT émis par l’ID Microsoft Entra.

{
  "host": {
    "authentication": {
      "provider": "EntraId",
      "jwt": {
        "audience": "<application-id>",
        "issuer": "https://login.microsoftonline.com/<tenant-id>/v2.0"
      }
    }
  }
}

Coutume

Valide les jetons JWT des fournisseurs d’identité tiers.

{
  "host": {
    "authentication": {
      "provider": "Custom",
      "jwt": {
        "audience": "<api-audience>",
        "issuer": "https://<your-idp-domain>/"
      }
    }
  }
}

Simulateur

Simule l’authentification pour le développement et les tests locaux.

{
  "host": {
    "authentication": {
      "provider": "Simulator"
    }
  }
}

Important

Le Simulator fournisseur fonctionne uniquement lorsque runtime.host.mode c’est development. DAB ne parvient pas à démarrer si Le simulateur est configuré en mode de production.

Sélection de rôle

Pour tous les fournisseurs, à l’exception du simulateur, l’en-tête X-MS-API-ROLE sélectionne le rôle à utiliser à partir des revendications de l’utilisateur authentifié. Si elle est omise, la requête utilise le Authenticated rôle système. Pour plus d’informations sur l’évaluation des rôles, consultez Autorisation et rôles.

JWT (runtime d’hôte d’authentification)

Parent Property Type Required Default
runtime.host.authentication jwt object ❌ Non -

Configuration JWT (Global JSON Web Token).

Diagramme des jetons web JSON pris en charge dans le générateur d’API de données.

Propriétés imbriquées

Parent Property Type Required Default
runtime.host.authentication.jwt audience string ❌ Non None
runtime.host.authentication.jwt issuer string ❌ Non None

Format

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

Pagination (runtime)

Parent Property Type Required Default
runtime pagination object ❌ Non -

Limites de pagination globales pour les points de terminaison REST et GraphQL.

Propriétés imbriquées

Parent Property Type Required Default
runtime.pagination max-page-size int ❌ Non 100,000
runtime.pagination default-page-size int ❌ Non 100
runtime.pagination next-link-relative boolean ❌ Non false

Valeurs prises en charge par la taille maximale de page

Value Result
integer Tout entier 32 bits positif est pris en charge.
0 Non pris en charge.
-1 Correspond par défaut à la valeur maximale prise en charge.
< -1 Non pris en charge.

Valeurs prises en charge par défaut de la taille de page

Value Result
integer Entier positif inférieur à l'max-page-sizeactuel .
0 Non pris en charge.
-1 La valeur par défaut est le paramètre de max-page-size actuel.
< -1 Non pris en charge.

Quand next-link-relative c’est truele cas, les valeurs de pagination nextLink utilisent des URL relatives au lieu d’URL absolues.

Value Example
false (valeur par défaut) "nextLink": "https://localhost:5001/api/users?$after=..."
true "nextLink": "/api/users?$after=..."

Format

{
  "runtime": {
    "pagination": {
      "max-page-size": <integer; default: 100000>,
      "default-page-size": <integer; default: 100>,
      "next-link-relative": <boolean; default: false>
    }
  }
}

Note

Lorsque la valeur est supérieure max-page-sizeà , les résultats sont limités à max-page-size.

Exemple : Pagination dans REST

Request

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

Charge utile de la réponse

{
  "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=="
}

Page Suivante de la demande

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

Exemple : Pagination dans GraphQL

Charge utile de la requête (requête)

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

Charge utile de la réponse

{
  "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=="
    }
  }
}

Page Suivante de la demande

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

Exemple : accès max-page-size aux demandes

Utilisez la max-page-size valeur en définissant $limit (REST) ou first (GraphQL) sur -1.

REST

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

GraphQL

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

Cache (runtime)

Parent Property Type Required Default
runtime cache object ❌ Non -

Configuration globale du cache.

Propriétés imbriquées

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

Tip

La propriété au niveau cache.ttl-seconds de l’entité est définie par défaut sur cette valeur globale.

Format

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

Important

Si global enabled est false, le niveau enabled d’entité individuel n’a pas d’importance.

Télémétrie (runtime)

Parent Property Type Required Default
runtime telemetry object ❌ Non -

Configuration globale de la télémétrie.

Propriétés imbriquées

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

Configure la journalisation détaillée par espace de noms. Cela suit les conventions de journalisation .NET standard et permet un contrôle granulaire, bien qu’il suppose une certaine familiarité avec les internes du générateur d’API de données. Le générateur d’API de données est open source : https://aka.ms/dab

Format

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

Tip

log-level peut être rechargé à chaud dans le développement et la production. Il s’agit actuellement de la seule propriété qui prend en charge le rechargement à chaud en production.

Example

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

Application Insights (télémétrie)

Parent Property Type Required Default
runtime.telemetry application-insights object ❌ Non -

Configure la journalisation dans Application Insights.

Propriétés imbriquées

Parent Property Type Required Default
runtime.telemetry.application-insights enabled boolean ❌ Non False
runtime.telemetry.application-insights connection-string string ✔️ Oui None

Format

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

OpenTelemetry (télémétrie)

Parent Property Type Required Default
runtime.telemetry open-telemetry object ❌ Non -

Configure la journalisation sur Open Telemetry.

Propriétés imbriquées

Parent Property Type Required Default
runtime.telemetry.open-telemetry enabled boolean ❌ Non true
runtime.telemetry.open-telemetry endpoint string ✔️ Oui None
runtime.telemetry.open-telemetry headers string ❌ Non None
runtime.telemetry.open-telemetry service-name string ❌ Non « dab »
runtime.telemetry.open-telemetry exporter-protocol enum (grpc | httpprotobuf) ❌ Non grpc

Plusieurs en-têtes sont , séparés par des virgules.

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",
      }
    }
  }
}

En savoir plus sur OTEL_EXPORTER_OTLP_HEADERS.

Note

gRPC (4317) est plus rapide et prend en charge la diffusion en continu, mais nécessite davantage d’étapes de configuration. HTTP/protobuf (4318) est plus simple et plus facile à déboguer, mais moins efficace.

Intégrité (runtime)

Parent Property Type Required Default
runtime health object ❌ Non -

Configuration du point de terminaison de contrôle d’intégrité global (/health).

Propriétés imbriquées

Parent Property Type Required Default Plage/notes
runtime.health enabled boolean ❌ Non true
runtime.health roles tableau de chaînes ✔️ Oui* null *Obligatoire en mode de production
runtime.health cache-ttl-seconds integer ❌ Non 5 Min : 0
runtime.health max-query-parallelism integer ❌ Non 4 Min : 1, Max : 8 (limité)

Comportement dans le développement et la production

Condition Comportement de développement Comportement de production
health.enabled = faux 403 statut 403 statut
health.enabled = vrai Dépend du rôle Dépend du rôle
roles omis ou null Intégrité affichée 403 statut
rôle actuel non dans roles 403 statut 403 statut
rôle actuel dans roles Intégrité affichée Intégrité affichée
roles Comprend anonymous Intégrité affichée Intégrité affichée

Format

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

Note

Si global enabled est false, le niveau enabled d’entité individuel n’a pas d’importance.

Example

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