Prendre en charge le codage de caractères non Unicode dans Azure Logic Apps
S’applique à : Azure Logic Apps (Consommation + Standard)
Lorsque vous travaillez avec des charges utiles textuelles, Azure Logic Apps suppose que le texte est encodé dans un format Unicode, par exemple UTF-8. Vous risquez de rencontrer des problèmes de réception, d’envoi ou de traitement des caractères avec des encodages différents dans votre workflow. Par exemple, vous pouvez obtenir des caractères corrompus dans des fichiers plats lorsque vous travaillez avec des systèmes hérités qui ne prennent pas en charge Unicode.
Pour utiliser du texte ayant un autre codage de caractères, appliquez l’encodage base64ToBinary à la charge utile non-Unicode. Cette étape empêche Logic Apps de supposer que le texte est au format UTF-8. Vous pouvez ensuite convertir tout encodage pris en charge par .NET en UTF-8 à l’aide d’Azure Functions.
Cette solution fonctionne avec les workflows multilocataires et à locataire unique. Vous pouvez également utiliser cette solution avec le connecteur AS2.
Convertir l’encodage de la charge utile
Tout d’abord, vérifiez que votre déclencheur peut identifier correctement le type de contenu. Cette étape permet de s’assurer qu’Azure Logic Apps ne présume plus que le texte est en UTF-8.
Dans les déclencheurs et actions ayant la propriété Déduire le type de contenu, sélectionnez Non. Vous pouvez généralement trouver cette propriété dans la liste Paramètres avancés de l’opération. Toutefois, si l’opération n’inclut pas cette propriété, le type de contenu est défini par le message entrant.
La liste suivante répertorie certains des connecteurs pour lesquels vous pouvez désactiver la déduction automatique du type de contenu :
Si vous utilisez le déclencheur Requête pour du contenu text/plain
, vous devez définir le paramètre charset
dans l’en-tête Content-Type
de l’appel. Sinon, les caractères peuvent être corrompus, ou le paramètre ne correspond pas au format d’encodage de la charge utile. Pour plus d’informations, consultez la façon de gérer le type de contenu text/plain
.
Par exemple, le déclencheur HTTP convertit le contenu entrant en UTF-8 lorsque l’en-tête Content-Type
est défini avec le paramètre charset
correct :
{
"headers": {
<...>
"Content-Type": "text/plain; charset=windows-1250"
},
"body": "non UTF-8 text content"
}
Si vous définissez l’en-tête Content-Type
sur application/octet-stream
, vous pouvez également recevoir des caractères qui ne sont pas en UTF-8. Pour plus d’informations, consultez la façon de gérer le type de contenu application/octet-stream
.
Contenu encodé en base64
Avant d’encoder le contenu en base64 dans une chaîne, veillez à convertir le texte en UTF-8. Sinon, les caractères peuvent revenir endommagés.
Ensuite, convertissez tout encodage pris en charge par .NET en un autre encodage pris en charge par .NET. Consultez l’exemple de code Azure Functions ou l’exemple de code .NET :
Conseil
Pour les applications logiques à locataire unique, vous pouvez améliorer les performances et réduire la latence en exécutant localement la fonction de conversion.
Version d’Azure Functions
L’exemple suivant concerne Azure Functions version 2 :
using System;
using System.IO;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
public static class ConversionFunctionv2 {
[FunctionName("ConversionFunctionv2")]
public static IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, TraceWriter log) {
log.Info("C# HTTP trigger function processing a request.");
Encoding inputEncoding = null;
string requestBody = new StreamReader(req.Body).ReadToEnd();
dynamic data = JsonConvert.DeserializeObject(requestBody);
if (data == null || data.text == null || data.encodingInput == null || data.encodingOutput == null) {
return new BadRequestObjectResult("Please pass text/encodingOutput properties in the input JSON object.");
}
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
try {
string encodingInput = data.encodingInput.Value;
inputEncoding = Encoding.GetEncoding(name: encodingInput);
} catch (ArgumentException) {
return new BadRequestObjectResult($"Input character set value '{data.encodingInput.Value}' is not supported. Supported values are listed at https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx.");
}
Encoding encodingOutput = null;
try {
string outputEncoding = data.encodingOutput.Value;
encodingOutput = Encoding.GetEncoding(outputEncoding);
} catch (ArgumentException) {
return new BadRequestObjectResult($"Output character set value '{data.encodingOutput.Value}' is not supported. Supported values are listed at https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx.");
}
return (ActionResult) new JsonResult(
value: new {
text = Convert.ToBase64String(
Encoding.Convert(
srcEncoding: inputEncoding,
dstEncoding: encodingOutput,
bytes: Convert.FromBase64String((string) data.text)))
});
}
}
Version de .NET
L’exemple suivant est destiné à être utilisé avec .NET standard et Azure Functions version 2 :
using System;
using System.IO;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
public static class ConversionFunctionNET
{
[FunctionName("ConversionFunctionNET")]
public static IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequest req, TraceWriter log)
{
log.Info("C# HTTP trigger function processing a request.");
Encoding inputEncoding = null;
string requestBody = new StreamReader(req.Body).ReadToEnd();
dynamic data = JsonConvert.DeserializeObject(requestBody);
if (data == null || data.text == null || data.encodingInput == null || data.encodingOutput == null)
{
return new BadRequestObjectResult("Please pass text/encodingOutput properties in the input JSON object.");
}
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
try
{
string encodingInput = data.encodingInput.Value;
inputEncoding = Encoding.GetEncoding(name: encodingInput);
}
catch (ArgumentException)
{
return new BadRequestObjectResult($"Input character set value '{data.encodingInput.Value}' is not supported. Supported values are listed at https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx.");
}
Encoding encodingOutput = null;
try
{
string outputEncoding = data.encodingOutput.Value;
encodingOutput = Encoding.GetEncoding(outputEncoding);
}
catch (ArgumentException)
{
return new BadRequestObjectResult($"Output character set value '{data.encodingOutput.Value}' is not supported. Supported values are listed at https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx.");
}
return (ActionResult)new JsonResult(
value: new
{
text = Convert.ToBase64String(
Encoding.Convert(
srcEncoding: inputEncoding,
dstEncoding: encodingOutput,
bytes: Convert.FromBase64String((string)data.text)))
});
}
}
En utilisant ces mêmes concepts, vous pouvez également envoyer une charge utile non Unicode à partir de votre workflow.
Exemples de conversions de charge utile
Dans cet exemple, l’exemple de chaîne d’entrée encodé en base64 est un prénom, Héloïse, qui contient des caractères accentués.
Exemple d’entrée :
{
"text": "SMOpbG/Dr3Nl",
"encodingInput": "utf-8",
"encodingOutput": "windows-1252"
}
Exemple de sortie :
{
"text": "U01PcGJHL0RyM05s"
}
Envoyer une charge utile non Unicode
Si vous devez envoyer une charge utile non Unicode à partir de votre workflow, effectuez les étapes de conversion de la charge utile en UTF-8 dans l’ordre inverse. Conservez le texte en UTF-8 le plus longtemps possible dans votre système. Ensuite, utilisez la même fonction pour convertir les caractères UTF-8 encodés en base64 dans l’encodage requis. Enfin, appliquez le décodage base64 au texte et envoyez votre charge utile.
Quand vous consommez la valeur de retour d’Azure Functions, veillez à utiliser la fonction base64ToBinary, et non pas la fonction base64ToString.
Convertir les charges utiles pour AS2
Vous pouvez également utiliser cette solution avec des charges utiles non Unicode dans le connecteur AS2 v2. Si vous ne convertissez pas en UTF-8 les charges utiles que vous transmettez à AS2, vous risquez de rencontrer des problèmes d’interprétation des charges utiles. Ces problèmes peuvent entraîner un décalage du code de hachage MIC entre les partenaires en raison de caractères mal interprétés.