Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: Azure Logic Apps (Consumo + Standard)
Quando você trabalha com cargas úteis de texto, os Aplicativos Lógicos do Azure inferem que o texto é codificado em um formato Unicode, como UTF-8. Você pode ter problemas para receber, enviar ou processar caracteres com codificações diferentes em seu fluxo de trabalho. Por exemplo, você pode obter caracteres corrompidos em arquivos simples ao trabalhar com sistemas herdados que não suportam Unicode.
Para trabalhar com texto que tenha outra codificação de caracteres, aplique a codificação base64ToBinary à carga útil não-Unicode. Esta etapa impede que os Aplicativos Lógicos do Azure assumam que o texto está no formato UTF-8. Em seguida, pode-se converter qualquer codificação suportada pelo .NET para UTF-8 usando Azure Functions.
Esta solução funciona com fluxos de trabalho multilocatário e único locatário. Você também pode usar esta solução com o conector AS2.
Converter codificação de carga útil
Primeiro, verifique se o gatilho consegue identificar corretamente o tipo de conteúdo. Esta etapa garante que os Aplicativos Lógicos do Azure não assumam mais que o texto é UTF-8.
Em gatilhos e ações que têm a propriedade Infer Content Type, selecione No. Normalmente, você pode encontrar essa propriedade na lista de parâmetros avançados da operação. No entanto, se a operação não incluir essa propriedade, o tipo de conteúdo será definido pela mensagem de entrada.
A lista a seguir mostra alguns dos conectores onde você pode desativar a inferência automática do tipo de conteúdo:
- OneDrive
- Armazenamento de Blobs do Azure
- Armazenamento de Ficheiros do Azure
- Sistema de Ficheiros
- Google Drive
- SFTP - SSH
Se estiveres a usar o acionador Request para o conteúdo text/plain
, deves definir o charset
parâmetro que está no cabeçalho da Content-Type
chamada. Caso contrário, os caracteres podem ficar corrompidos ou o parâmetro não corresponde ao formato de codificação da carga útil. Para obter mais informações, consulte como lidar com o text/plain
tipo de conteúdo.
Por exemplo, o gatilho HTTP converte o conteúdo de entrada em UTF-8 quando o Content-Type
cabeçalho é definido com o parâmetro correto charset
:
{
"headers": {
<...>
"Content-Type": "text/plain; charset=windows-1250"
},
"body": "non UTF-8 text content"
}
Se você definir o Content-Type
cabeçalho como application/octet-stream
, também poderá receber caracteres que não são UTF-8. Para obter mais informações, consulte como lidar com o application/octet-stream
tipo de conteúdo.
Codificar conteúdo em Base64
Antes de codificar o conteúdo de base64 para uma cadeia de caracteres, certifique-se de converter o texto para UTF-8. Caso contrário, os caracteres podem retornar corrompidos.
Em seguida, converta qualquer codificação suportada pelo .NET para outra codificação suportada pelo .NET. Analise o código de exemplo do Azure Functions ou o código de exemplo .NET:
Gorjeta
Para aplicações lógicas de um único locatário, é possível melhorar o desempenho e diminuir a latência executando localmente a função de conversão.
Versão do Azure Functions
O exemplo a seguir é para o Azure Functions versão 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)))
});
}
}
Versão .NET
O exemplo a seguir é para uso com o .NET standard e o Azure Functions versão 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)))
});
}
}
Usando esses mesmos conceitos, você também pode enviar uma carga não Unicode do seu fluxo de trabalho.
Exemplos de conversões de carga útil
Neste exemplo, a cadeia de caracteres de entrada de exemplo codificada em base64 é um nome pessoal que contém caracteres acentuados: Héloïse
Exemplo de entrada:
{
"text": "SMOpbG/Dr3Nl",
"encodingInput": "utf-8",
"encodingOutput": "windows-1252"
}
Saída de exemplo:
{
"text": "U01PcGJHL0RyM05s"
}
Enviar carga útil não Unicode
Se você precisar enviar uma carga não-Unicode do seu fluxo de trabalho, execute as etapas para converter a carga para UTF-8 inversamente. Mantenha o texto em UTF-8 o maior tempo possível dentro do seu sistema. Em seguida, use a mesma função para converter os caracteres UTF-8 codificados em base64 para a codificação necessária. Em seguida, aplique a decodificação base64 ao texto e envie sua carga.
Quando consumir o valor de retorno do Azure Functions, certifique-se de usar a função base64ToBinary, e não a função base64ToString.
Converter cargas úteis para AS2
Também pode utilizar esta solução com cargas úteis não Unicode no conector AS2 v2. Se não converteres os dados que passas para AS2 para UTF-8, poderás ter problemas com a interpretação dos dados. Estes problemas podem resultar numa discrepância no hash MIC entre os parceiros devido a caracteres mal interpretados.