Compartir a través de


Runtime

Opciones de configuración que determinan el comportamiento en tiempo de ejecución.

Configuración de paginación

Property Default Description
runtime.pagination.max-page-size Define el máximo de registros por página
runtime.pagination.default-page-size Establece registros predeterminados por respuesta

Configuración de REST

Property Default Description
runtime.rest.path "/api" Ruta de acceso base para puntos de conexión REST
runtime.rest.enabled true Permite habilitar o deshabilitar solicitudes REST para todas las entidades
runtime.rest.request-body-strict true No permite campos extraños en el cuerpo de la solicitud cuando es true

Configuración de GraphQL

Property Default Description
runtime.graphql.allow-introspection true Permite consultar el esquema de GraphQL subyacente.
runtime.graphql.path "/graphql" Ruta de acceso base para el punto de conexión de GraphQL
runtime.graphql.enabled true Permite habilitar o deshabilitar solicitudes de GraphQL para todas las entidades
runtime.graphql.depth-limit null Profundidad máxima permitida de una consulta GraphQL
runtime.graphql.multiple-mutations.create.enabled false Permite mutaciones de creación múltiple para todas las entidades

Configuración del host

Property Default Description
runtime.host.max-response-size-mb 158 Tamaño máximo (MB) de la respuesta de base de datos permitida en un único resultado
runtime.host.mode "production" Modo de ejecución; "production" o "development"

Configuración de CORS

Property Default Description
runtime.host.cors.origins [] Orígenes de CORS permitidos
runtime.host.cors.allow-credentials false Establece el valor del encabezado Access-Control-Allow-Credentials

Configuración de autenticación

Property Default Description
runtime.host.authentication.provider null Proveedor de autenticación
runtime.host.authentication.jwt.audience null Audiencia de JWT
runtime.host.authentication.jwt.issuer null Emisor de JWT

Configuración de caché

Property Default Description
runtime.cache.enabled false Habilita el almacenamiento en caché de respuestas globalmente
runtime.cache.ttl-seconds 5 Período de vida (segundos) para la caché global

Configuración de telemetría

Property Default Description
runtime.telemetry.application-insights.connection-string null Cadena de conexión de Application Insights
runtime.telemetry.application-insights.enabled false Habilita o deshabilita la telemetría de Application Insights
runtime.telemetry.open-telemetry.endpoint null Dirección URL del recopilador de OpenTelemetry
runtime.telemetry.open-telemetry.headers {} Encabezados de exportación de OpenTelemetry
runtime.telemetry.open-telemetry.service-name "dab" Nombre del servicio OpenTelemetry
runtime.telemetry.open-telemetry.exporter-protocol "grpc" Protocolo OpenTelemetry ("grpc" o "httpprotobuf")
runtime.telemetry.open-telemetry.enabled true Habilita o deshabilita OpenTelemetry
runtime.telemetry.log-level.namespace null Invalidación del nivel de registro específico del espacio de nombres
runtime.health.enabled true Habilita o deshabilita el punto de conexión de comprobación de estado globalmente.
runtime.health.roles null Roles permitidos para el punto de conexión de mantenimiento completo
runtime.health.cache-ttl-seconds 5 Período de vida (segundos) para la entrada de caché del informe de comprobación de estado
runtime.health.max-query-parallelism 4 Número máximo de consultas de comprobación de estado simultáneas (intervalo: 1-8)

Introducción al formato

{
  "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`)
  }
}

Modo (tiempo de ejecución del host)

Parent Property Type Required Default
runtime host enumeración (production | development) ❌ No production

Comportamiento de desarrollo

  • Nitro habilitado (anteriormente Banana Cake Pop) para las pruebas de GraphQL
  • Interfaz de usuario de Swagger habilitada para pruebas REST
  • Comprobaciones de estado anónimas habilitadas
  • Mayor detalle de registro (depuración)

Format

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

Tamaño máximo de respuesta (tiempo de ejecución del host)

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

Establece el tamaño máximo (en megabytes) para cualquier resultado determinado. Como las respuestas grandes pueden tensar el sistema, max-response-size-mb limita el tamaño total (diferente del recuento de filas) para evitar la sobrecarga, que es especialmente con columnas grandes como texto o JSON.

Value Result
no establecido Usar el valor predeterminado
null Usar el valor predeterminado
integer Entero positivo de 32 bits
<= 0 No está soportado

Format

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

GraphQL (runtime)

Parent Property Type Required Default
runtime graphql object ❌ No -

Configuración global de GraphQL.

Propiedades anidadas

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

Notas de la propiedad

  • No se permiten subrutas para la path propiedad .
  • Use depth-limit para restringir las consultas anidadas.
  • Establézcalo allow-introspection en false para ocultar el esquema de GraphQL.
  • Se usa multiple-mutations para insertar varias entidades en una sola mutación.

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

Ejemplo: varias mutaciones

Configuration

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

Mutación de 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 (tiempo de ejecución)

Parent Property Type Required Default
runtime rest object ❌ No -

Configuración de REST global.

Propiedades anidadas

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

Notas de la propiedad

  • Si global enabled es false, el nivel enabled de entidad individual no importa.
  • La path propiedad no admite valores de subruta como /api/data.
  • request-body-strict se introdujo para ayudar a simplificar los objetos POCO de .NET.
request-body-strict Behavior
true Los campos adicionales del cuerpo de la solicitud provocan una BadRequest excepción.
false Se omiten los campos adicionales del cuerpo de la solicitud.

Format

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

Ejemplo: request-body-strict

  • Las columnas con un default() valor se omiten solo cuando INSERT su valor en la carga es null. Como consecuencia, INSERT las operaciones en default() columnas, cuando request-body-strict es true, no pueden dar lugar a valores explícitos null . Para lograr este comportamiento, se requiere una UPDATE operación.
  • Las columnas con un default() no se omiten durante independientemente UPDATE del valor de carga.
  • Las columnas calculadas siempre se omiten.
  • Las columnas generadas automáticamente siempre se omiten.

Tabla de ejemplo

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

Carga de solicitud

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

Insertar comportamiento cuando 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.

Carga de respuesta

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

Comportamiento de actualización cuando request-body-strict = false

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

Carga de respuesta

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

CORS (tiempo de ejecución de host)

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

Configuración de CORS global.

Tip

CORS significa "Uso compartido de recursos entre orígenes". Se trata de una característica de seguridad del explorador que controla si las páginas web pueden realizar solicitudes a un dominio diferente al que les ha servido.

Propiedades anidadas

Parent Property Type Required Default
runtime.host.cors allow-credentials boolean ❌ No False
runtime.host.cors origins matriz de cadena ❌ No None

Note

La allow-credentials propiedad establece el Access-Control-Allow-Credentials encabezado CORS.

Format

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

Note

El carácter comodín * es válido como un valor para origins.

Proveedor (entorno de ejecución del host de autenticación)

Parent Property Type Required Default
runtime.host.authentication provider enumeración (AppService | EntraId | Custom | Simulator) ❌ No None

Selecciona el método de autenticación. Cada proveedor valida la identidad de forma diferente. Para la configuración paso a paso, consulte las guías paso a paso vinculadas a continuación.

Resumen del proveedor

Provider Caso de uso Origen de identidad Guía paso a paso
(omitido) Acceso solo anónimo None
AppService Aplicaciones hospedadas en Azure (EasyAuth) Encabezado X-MS-CLIENT-PRINCIPAL Configuración de la autenticación de App Service
EntraID Microsoft Entra ID (Azure AD) Token de portador JWT Configurar la autenticación Entra ID
Custom IdP de terceros (Okta, Auth0) Token de portador JWT Configuración de la autenticación JWT personalizada
Simulator Solo pruebas locales Simulada Configuración de la autenticación del simulador

Note

Anteriormente, el EntraId proveedor se denominaba AzureAd. El nombre anterior sigue funcionando por compatibilidad.

Solo anónimo (sin proveedor)

Cuando se omite la authentication sección, DAB funciona en modo de solo anónimo. A todas las solicitudes se les asigna el rol del Anonymous sistema.

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

AppService

Confía en los encabezados de identidad insertados por EasyAuth de Azure App Service.

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

EntraID

Valida los tokens JWT emitidos por microsoft Entra ID.

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

Custom

Valida tokens JWT de proveedores de identidades de terceros.

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

Simulador

Simula la autenticación para el desarrollo y las pruebas locales.

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

Important

El Simulator proveedor solo funciona cuando runtime.host.mode es development. DAB no se inicia si el simulador está configurado en modo de producción.

Selección de roles

Para todos los proveedores excepto Simulador, el X-MS-API-ROLE encabezado selecciona qué rol se va a usar en las notificaciones del usuario autenticado. Si se omite, la solicitud usa el rol del Authenticated sistema. Para más información sobre la evaluación de roles, consulte Autorización y roles.

JWT (entorno de ejecución del host de autenticación)

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

Configuración global de JSON Web Token (JWT).

Diagrama de compatibilidad con tokens web JSON en Data API Builder.

Propiedades anidadas

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

Format

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

Paginación (tiempo de ejecución)

Parent Property Type Required Default
runtime pagination object ❌ No -

Límites de paginación global para puntos de conexión REST y GraphQL.

Propiedades anidadas

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

Valores admitidos de tamaño máximo de página

Value Result
integer Se admite cualquier entero positivo de 32 bits.
0 No está soportado.
-1 El valor predeterminado es el valor máximo admitido.
< -1 No está soportado.

Valores admitidos de tamaño de página predeterminado

Value Result
integer Cualquier entero positivo menor que el max-page-sizeactual.
0 No está soportado.
-1 El valor predeterminado es el valor de max-page-size actual.
< -1 No está soportado.

Cuando next-link-relative es true, los valores de paginación nextLink usan direcciones URL relativas en lugar de direcciones URL absolutas.

Value Example
false (valor predeterminado) "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

Cuando el valor es mayor que max-page-size, los resultados se limitan a max-page-size.

Ejemplo: Paginación en REST

Request

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

Carga de respuesta

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

Página Siguiente de solicitud

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

Ejemplo: Paginación en GraphQL

Carga de solicitud (consulta)

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

Carga de respuesta

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

Página Siguiente de solicitud

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

Ejemplo: Acceso max-page-size en solicitudes

Use el max-page-size valor estableciendo $limit (REST) o first (GraphQL) en -1.

REST

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

GraphQL

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

Caché (tiempo de ejecución)

Parent Property Type Required Default
runtime cache object ❌ No -

Configuración de caché global.

Propiedades anidadas

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

Tip

La propiedad de nivel cache.ttl-seconds de entidad tiene como valor predeterminado este valor global.

Format

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

Important

Si global enabled es false, el nivel enabled de entidad individual no importa.

Telemetría (tiempo de ejecución)

Parent Property Type Required Default
runtime telemetry object ❌ No -

Configuración de telemetría global.

Propiedades anidadas

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

Configura el nivel de detalle del registro por espacio de nombres. Esto sigue las convenciones de registro de .NET estándar y permite un control pormenorizado, aunque supone cierta familiaridad con los internos del Generador de API de datos. Data API Builder es de código abierto: https://aka.ms/dab

Format

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

Tip

log-level se puede volver a cargar en caliente tanto en desarrollo como en producción. Actualmente es la única propiedad que admite la recarga activa en producción.

Example

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

Application Insights (telemetría)

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

Configura el registro en Application Insights.

Propiedades anidadas

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

Format

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

OpenTelemetry (telemetría)

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

Configura el registro en Abrir telemetría.

Propiedades anidadas

Parent Property Type Required Default
runtime.telemetry.open-telemetry enabled boolean ❌ No true
runtime.telemetry.open-telemetry endpoint string ✔️ Sí None
runtime.telemetry.open-telemetry headers string ❌ No None
runtime.telemetry.open-telemetry service-name string ❌ No "dab"
runtime.telemetry.open-telemetry exporter-protocol enumeración (grpc | httpprotobuf) ❌ No grpc

Hay varios encabezados separados (comas , ).

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

Obtenga más información sobre OTEL_EXPORTER_OTLP_HEADERS.

Note

gRPC (4317) es más rápido y admite el streaming, pero requiere más pasos de configuración. HTTP/protobuf (4318) es más sencillo y fácil de depurar, pero menos eficaz.

Estado (tiempo de ejecución)

Parent Property Type Required Default
runtime health object ❌ No -

Configuración del punto de conexión de comprobación de estado global ()./health

Propiedades anidadas

Parent Property Type Required Default Rango/Notas
runtime.health enabled boolean ❌ No true
runtime.health roles matriz de cadena ✔️ Sí* null *Obligatorio en modo de producción
runtime.health cache-ttl-seconds integer ❌ No 5 Min: 0
runtime.health max-query-parallelism integer ❌ No 4 Min: 1, Max: 8 (abrazado)

Comportamiento en desarrollo frente a producción

Condition Comportamiento de desarrollo Comportamiento de producción
health.enabled = falso 403 estado 403 estado
health.enabled = verdadero Depende del rol Depende del rol
roles omitido o null Estado mostrado 403 estado
rol actual no en roles 403 estado 403 estado
rol actual en roles Estado mostrado Estado mostrado
roles Incluye anonymous Estado mostrado Estado mostrado

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 es false, el nivel enabled de entidad individual no importa.

Example

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