Expresiones de las directivas de API Management
SE APLICA A: todos los niveles de API Management
En este artículo se describe la sintaxis de expresiones de directiva en C# 7. Cada expresión tiene acceso a:
- La variable de contexto proporcionada implícitamente.
- Un subconjunto permitido de tipos de .NET Framework.
Sintaxis
- Expresiones de instrucción única:
- Se incluyen en
@(expression)
, dondeexpression
es una instrucción de expresión bien formada de C#.
- Se incluyen en
- Expresiones con varias instrucciones:
- Se incluyen en
@{expression}
. - Todas las rutas de código de las expresiones de múltiples declaraciones deben terminar con una declaración
return
.
- Se incluyen en
Ejemplos
@(true)
@((1+1).ToString())
@("Hi There".Length)
@(Regex.Match(context.Response.Headers.GetValueOrDefault("Cache-Control",""), @"max-age=(?<maxAge>\d+)").Groups["maxAge"]?.Value)
@(context.Variables.ContainsKey("maxAge") ? int.Parse((string)context.Variables["maxAge"]) : 3600)
@{
string[] value;
if (context.Request.Headers.TryGetValue("Authorization", out value))
{
if(value != null && value.Length > 0)
{
return Encoding.UTF8.GetString(Convert.FromBase64String(value[0]));
}
}
return null;
}
Uso
A menos que la referencia de la directiva especifique lo contrario, las expresiones pueden utilizarse como valores de atributos o valores de texto en cualquier directiva de API Management.
Importante
Cuando se define la directiva, las expresiones de la directiva solo tienen una comprobación limitada. La puerta de enlace ejecuta las expresiones en tiempo de ejecución. Las excepciones generadas por las expresiones de la directiva generan un error en tiempo de ejecución.
Tipos de .NET Framework permitidos en expresiones de directiva
En la tabla siguiente se enumeran los tipos de .NET Framework y los miembros que se permiten en las expresiones de directiva.
Tipo | Miembros compatibles |
---|---|
Newtonsoft.Json.Formatting |
All |
Newtonsoft.Json.JsonConvert |
SerializeObject , DeserializeObject |
Newtonsoft.Json.Linq.Extensions |
All |
Newtonsoft.Json.Linq.JArray |
All |
Newtonsoft.Json.Linq.JConstructor |
All |
Newtonsoft.Json.Linq.JContainer |
All |
Newtonsoft.Json.Linq.JObject |
All |
Newtonsoft.Json.Linq.JProperty |
All |
Newtonsoft.Json.Linq.JRaw |
All |
Newtonsoft.Json.Linq.JToken |
All |
Newtonsoft.Json.Linq.JTokenType |
All |
Newtonsoft.Json.Linq.JValue |
All |
System.Array |
All |
System.BitConverter |
All |
System.Boolean |
All |
System.Byte |
All |
System.Char |
All |
System.Collections.Generic.Dictionary<TKey, TValue> |
All |
System.Collections.Generic.HashSet<T> |
All |
System.Collections.Generic.ICollection<T> |
All |
System.Collections.Generic.IDictionary<TKey, TValue> |
All |
System.Collections.Generic.IEnumerable<T> |
All |
System.Collections.Generic.IEnumerator<T> |
All |
System.Collections.Generic.IList<T> |
All |
System.Collections.Generic.IReadOnlyCollection<T> |
All |
System.Collections.Generic.IReadOnlyDictionary<TKey, TValue> |
All |
System.Collections.Generic.ISet<T> |
All |
System.Collections.Generic.KeyValuePair<TKey, TValue> |
All |
System.Collections.Generic.List<T> |
All |
System.Collections.Generic.Queue<T> |
All |
System.Collections.Generic.Stack<T> |
All |
System.Convert |
All |
System.DateTime |
(Constructor), Add , AddDays , AddHours , AddMilliseconds , AddMinutes , AddMonths , AddSeconds , AddTicks , AddYears , Date , Day , DayOfWeek , DayOfYear , DaysInMonth , Hour , IsDaylightSavingTime , IsLeapYear , MaxValue , Millisecond , Minute , MinValue , Month , Now , Parse , Second , Subtract , Ticks , TimeOfDay , Today , ToString , UtcNow , Year |
System.DateTimeKind |
Utc |
System.DateTimeOffset |
All |
System.Decimal |
All |
System.Double |
All |
System.Enum |
Parse , TryParse , ToString |
System.Exception |
All |
System.Guid |
All |
System.Int16 |
All |
System.Int32 |
All |
System.Int64 |
All |
System.IO.StringReader |
All |
System.IO.StringWriter |
All |
System.Linq.Enumerable |
All |
System.Math |
All |
System.MidpointRounding |
All |
System.Net.IPAddress |
AddressFamily , Equals , GetAddressBytes , IsLoopback , Parse , TryParse , ToString |
System.Net.WebUtility |
All |
System.Nullable |
All |
System.Random |
All |
System.SByte |
All |
System.Security.Cryptography.AsymmetricAlgorithm |
All |
System.Security.Cryptography.CipherMode |
All |
System.Security.Cryptography.HashAlgorithm |
All |
System.Security.Cryptography.HashAlgorithmName |
All |
System.Security.Cryptography.HMAC |
All |
System.Security.Cryptography.HMACMD5 |
All |
System.Security.Cryptography.HMACSHA1 |
All |
System.Security.Cryptography.HMACSHA256 |
All |
System.Security.Cryptography.HMACSHA384 |
All |
System.Security.Cryptography.HMACSHA512 |
All |
System.Security.Cryptography.KeyedHashAlgorithm |
All |
System.Security.Cryptography.MD5 |
All |
System.Security.Cryptography.Oid |
All |
System.Security.Cryptography.PaddingMode |
All |
System.Security.Cryptography.RNGCryptoServiceProvider |
All |
System.Security.Cryptography.RSA |
All |
System.Security.Cryptography.RSAEncryptionPadding |
All |
System.Security.Cryptography.RSASignaturePadding |
All |
System.Security.Cryptography.SHA1 |
All |
System.Security.Cryptography.SHA1Managed |
All |
System.Security.Cryptography.SHA256 |
All |
System.Security.Cryptography.SHA256Managed |
All |
System.Security.Cryptography.SHA384 |
All |
System.Security.Cryptography.SHA384Managed |
All |
System.Security.Cryptography.SHA512 |
All |
System.Security.Cryptography.SHA512Managed |
All |
System.Security.Cryptography.SymmetricAlgorithm |
All |
System.Security.Cryptography.X509Certificates.PublicKey |
All |
System.Security.Cryptography.X509Certificates.RSACertificateExtensions |
All |
System.Security.Cryptography.X509Certificates.X500DistinguishedName |
Name |
System.Security.Cryptography.X509Certificates.X509Certificate |
All |
System.Security.Cryptography.X509Certificates.X509Certificate2 |
All |
System.Security.Cryptography.X509Certificates.X509ContentType |
All |
System.Security.Cryptography.X509Certificates.X509NameType |
All |
System.Single |
All |
System.String |
All |
System.StringComparer |
All |
System.StringComparison |
All |
System.StringSplitOptions |
All |
System.Text.Encoding |
All |
System.Text.RegularExpressions.Capture |
Index , Length , Value |
System.Text.RegularExpressions.CaptureCollection |
Count , Item |
System.Text.RegularExpressions.Group |
Captures , Success |
System.Text.RegularExpressions.GroupCollection |
Count , Item |
System.Text.RegularExpressions.Match |
Empty , Groups , Result |
System.Text.RegularExpressions.Regex |
(Constructor), IsMatch , Match , Matches , Replace , Unescape , Split |
System.Text.RegularExpressions.RegexOptions |
All |
System.Text.StringBuilder |
All |
System.TimeSpan |
All |
System.TimeZone |
All |
System.TimeZoneInfo.AdjustmentRule |
All |
System.TimeZoneInfo.TransitionTime |
All |
System.TimeZoneInfo |
All |
System.Tuple |
All |
System.UInt16 |
All |
System.UInt32 |
All |
System.UInt64 |
All |
System.Uri |
All |
System.UriPartial |
All |
System.Xml.Linq.Extensions |
All |
System.Xml.Linq.XAttribute |
All |
System.Xml.Linq.XCData |
All |
System.Xml.Linq.XComment |
All |
System.Xml.Linq.XContainer |
All |
System.Xml.Linq.XDeclaration |
All |
System.Xml.Linq.XDocument |
Todos excepto Load |
System.Xml.Linq.XDocumentType |
All |
System.Xml.Linq.XElement |
All |
System.Xml.Linq.XName |
All |
System.Xml.Linq.XNamespace |
All |
System.Xml.Linq.XNode |
All |
System.Xml.Linq.XNodeDocumentOrderComparer |
All |
System.Xml.Linq.XNodeEqualityComparer |
All |
System.Xml.Linq.XObject |
All |
System.Xml.Linq.XProcessingInstruction |
All |
System.Xml.Linq.XText |
All |
System.Xml.XmlNodeType |
All |
Variable de contexto
La variable context
está disponible implícitamente en todas las expresiones de la directiva. Sus miembros:
- Proporcionan información relevante para la solicitud y respuesta de la API y las propiedades relacionadas.
- Son todos de solo lectura.
Variable de contexto | Métodos, propiedades y valores de parámetro admitidos |
---|---|
context |
Api : IApi Deployment Transcurrido: TimeSpan intervalo de tiempo entre el valor de Timestamp y la hora actualGraphQL LastError Operation Request RequestId : Guid Identificador de solicitud únicoResponse Subscription Timestamp : DateTime punto en el tiempo en que se recibió la solicitudTracing : bool indica si el seguimiento está activado o desactivado User Variables : IReadOnlyDictionary<string, object> void Trace(message: string) Workspace |
context.Api |
Id : string IsCurrentRevision : bool Name : string Path : string Revision : string ServiceUrl : IUrl Version : string |
context.Deployment |
Gateway GatewayId : string (devuelve "managed" para las puerta de enlace administradas)Region : string ServiceId : string ServiceName : string Certificates : IReadOnlyDictionary<string, X509Certificate2> |
context.Deployment.Gateway |
Id : string (devuelve "managed" para las puerta de enlace administradas)InstanceId : string (devuelve "managed" para las puerta de enlace administradas)IsManaged : bool |
context.GraphQL |
GraphQLArguments : IGraphQLDataObject Parent : IGraphQLDataObject Ejemplos |
context.LastError |
Source : string Reason : string Message : string Scope : string Section : string Path : string PolicyId : string Para obtener más información sobre context.LastError , consulte Control de errores. |
context.Operation |
Id : string Method : string Name : string UrlTemplate : string |
context.Product |
ApprovalRequired : bool Groups : IEnumerable< IGroup > Id : string Name : string State : enum ProductState {NotPublished, Published} SubscriptionsLimit : int? SubscriptionRequired : bool |
context.Request |
Body : IMessageBody o null si la solicitud no tiene un cuerpo.Certificate : System.Security.Cryptography.X509Certificates.X509Certificate2 Headers : IReadOnlyDictionary<string, string[]> IpAddress : string MatchedParameters : IReadOnlyDictionary<string, string> Method : string OriginalUrl : IUrl Url : IUrl PrivateEndpointConnection : IPrivateEndpointConnection o null si la solicitud no viene de un punto de conexión privado. |
string context.Request.Headers.GetValueOrDefault(headerName: string, defaultValue: string) |
headerName : string defaultValue : string Devuelve valores de encabezado de solicitud separados por comas o defaultValue si no se encuentra el encabezado. |
context.Response |
Body : IMessageBody Headers : IReadOnlyDictionary<string, string[]> StatusCode : int StatusReason : string |
string context.Response.Headers.GetValueOrDefault(headerName: string, defaultValue: string) |
headerName : string defaultValue : string Devuelve valores de encabezado de respuesta separados por comas o defaultValue si no se encuentra el encabezado. |
context.Subscription |
CreatedDate : DateTime EndDate : DateTime? Id : string Key : string Name : string PrimaryKey : string SecondaryKey : string StartDate : DateTime? |
context.User |
Email : string FirstName : string Groups : IEnumerable< IGroup > Id : string Identities : IEnumerable< IUserIdentity > LastName : string Note : string RegistrationDate : DateTime |
context.Workspace |
Id : string Name : string |
IApi |
Id : string Name : string Path : string Protocols : IEnumerable<string> ServiceUrl : IUrl SubscriptionKeyParameterNames : ISubscriptionKeyParameterNames |
IGraphQLDataObject |
TBD |
IGroup |
Id : string Name : string |
IMessageBody |
As<T>(bool preserveContent = false): Where T: string, byte[], JObject, JToken, JArray, XNode, XElement, XDocument - Los métodos context.Request.Body.As<T> y context.Response.Body.As<T> leen un cuerpo de un mensaje de respuesta o solicitud en el tipo T especificado. O bien AsFormUrlEncodedContent(bool preserveContent = false) - Los métodos context.Request.Body.AsFormUrlEncodedContent() y context.Response.Body.AsFormUrlEncodedContent() leen datos de formulario con codificación URL en un cuerpo de mensaje de solicitud o respuesta y devuelven un objeto IDictionary<string, IList<string> . El objeto descodificado admite operaciones IDictionary y las siguientes expresiones: ToQueryString() , JsonConvert.SerializeObject() , ToFormUrlEncodedContent(). De forma predeterminada, los métodos As<T> y AsFormUrlEncodedContent() :
Para evitar este resultado haciendo que el método trabaje en una copia de la secuencia del cuerpo, establezca el parámetro preserveContent en true , como se muestra en los ejemplos para la directiva set-body. |
IPrivateEndpointConnection |
Name : string GroupId : string MemberName : string Para más información, vea la API de REST. |
IUrl |
Host : string Path : string Port : int Query : IReadOnlyDictionary<string, string[]> QueryString : string Scheme : string |
ISubscriptionKeyParameterNames |
Header : string Query : string |
string IUrl.Query.GetValueOrDefault(queryParameterName: string, defaultValue: string) |
queryParameterName : string defaultValue : string Devuelve valores de parámetro de consulta separados por comas o defaultValue si no se encuentra el parámetro. |
IUserIdentity |
Id : string Provider : string |
T context.Variables.GetValueOrDefault<T>(variableName: string, defaultValue: T) |
variableName : string defaultValue : T Devuelve el valor de la variable convertido al tipo T o defaultValue si no se encuentra la variable.Este método produce una excepción si el tipo especificado no coincide con el tipo real de la variable devuelta. |
BasicAuthCredentials AsBasic(input: this string) |
input : string Si el parámetro de entrada contiene un valor válido de encabezado de solicitud de autorización de autenticación básica HTTP, el método devuelve un objeto de tipo BasicAuthCredentials ; en caso contrario, el método devuelve nulo. |
bool TryParseBasic(input: this string, result: out BasicAuthCredentials) |
input : string result : out BasicAuthCredentials Si el parámetro de entrada contiene un valor válido de autorización de autenticación básica HTTP en el encabezado de solicitud, el método devuelve true y el parámetro de resultado contiene un valor del tipo BasicAuthCredentials ; en caso contrario, el método devuelve false . |
BasicAuthCredentials |
Password : string UserId : string |
Jwt AsJwt(input: this string) |
input : string Si el parámetro de entrada contiene un valor de token JWT válido, el método devuelve un objeto de tipo Jwt ; en caso contrario, el método devuelve null . |
bool TryParseJwt(input: this string, result: out Jwt) |
input : string result : out Jwt Si el parámetro de entrada contiene un valor de token JWT válido, el método devuelve true y el parámetro de resultado contiene un valor de tipo Jwt ; en caso contrario, el método devuelve false . |
Jwt |
Algorithm : string Audiences : IEnumerable<string> Claims : IReadOnlyDictionary<string, string[]> ExpirationTime : DateTime? Id : string Issuer : string IssuedAt : DateTime? NotBefore : DateTime? Subject : string Type : string |
string Jwt.Claims.GetValueOrDefault(claimName: string, defaultValue: string) |
claimName : string defaultValue : string Devuelve valores de notificación separados por comas o defaultValue i no se encuentra el encabezado. |
byte[] Encrypt(input: this byte[], alg: string, key:byte[], iv:byte[]) |
input : texto no cifrado que se va a cifraralg : nombre de un algoritmo de cifrado simétricokey : clave de cifradoiv : vector de inicializaciónDevuelve cifrado el texto no cifrado. |
byte[] Encrypt(input: this byte[], alg: System.Security.Cryptography.SymmetricAlgorithm) |
input : texto no cifrado que se va a cifraralg : algoritmo de cifradoDevuelve cifrado el texto no cifrado. |
byte[] Encrypt(input: this byte[], alg: System.Security.Cryptography.SymmetricAlgorithm, key:byte[], iv:byte[]) |
input : texto no cifrado que se va a cifraralg : algoritmo de cifradokey : clave de cifradoiv : vector de inicializaciónDevuelve cifrado el texto no cifrado. |
byte[] Decrypt(input: this byte[], alg: string, key:byte[], iv:byte[]) |
input : texto cifrado que se va a descifraralg : nombre de un algoritmo de cifrado simétricokey : clave de cifradoiv : vector de inicializaciónDevuelve texto no cifrado. |
byte[] Decrypt(input: this byte[], alg: System.Security.Cryptography.SymmetricAlgorithm) |
input : texto cifrado que se va a descifraralg : algoritmo de cifradoDevuelve texto no cifrado. |
byte[] Decrypt(input: this byte[], alg: System.Security.Cryptography.SymmetricAlgorithm, key:byte[], iv:byte[]) |
input : texto cifrado que se va a descifraralg : algoritmo de cifradokey : clave de cifradoiv : vector de inicializaciónDevuelve texto no cifrado. |
bool VerifyNoRevocation(input: this System.Security.Cryptography.X509Certificates.X509Certificate2) |
Realiza una validación de la cadena X.509 sin comprobar el estado de revocación de los certificados.input : objeto del certificadoDevuelve true si la validación es correcta; false si hay un error. |
Contenido relacionado
Para obtener más información sobre cómo trabajar con directivas, consulte:
- Directivas de Azure API Management
- Tutorial: Transformación y protección de una API
- Referencia de directivas para una lista completa de instrucciones de directivas y su configuración
- Repositorio de fragmentos de código de directiva
- Creación de directivas mediante Microsoft Copilot en Azure
Para obtener más información:
- Vea cómo proporcionar información de contexto al servicio back-end. Use las directivas Establecer el parámetro de cadena de consulta y Establecer encabezado HTTP para proporcionar esta información.
- Vea cómo utilizar la directiva de validación de JWT para preautorizar el acceso a operaciones según notificaciones de token.
- Vea la forma de usar un seguimiento de API Inspector para detectar cómo se evalúan las directivas y los resultados de esas evaluaciones.
- Vea cómo usar expresiones con las directivas Obtener de caché y Almacenar en caché para configurar el almacenamiento en caché de la respuesta de API Management. Defina una duración que coincida con el almacenamiento en caché de la respuesta del servicio back-end especificado por la directiva
Cache-Control
del servicio back-end. - Vea cómo realizar el filtrado de contenido. Quite elementos de datos de la respuesta recibida desde el servicio back-end mediante las directivas Flujo de control y Establecer cuerpo.
- Para descargar las declaraciones de directiva, vaya a api-management-samples/policies en el repositorio de GitHub.