Supporto della codifica dei caratteri non Unicode in App per la logica

Quando si lavora con payload di testo, App per la logica di Azure deduce che il testo viene codificato in un formato Unicode, ad esempio UTF-8. Potrebbero verificarsi problemi durante la ricezione, l'invio o l'elaborazione di caratteri con codifiche diverse nel flusso di lavoro. Ad esempio, è possibile che i caratteri nei file flat si danneggiano quando si lavora con sistemi legacy che non supportano Unicode.

Per usare testo con altre codifiche di caratteri, applicare la codifica base64 al payload non Unicode. Questo passaggio impedisce ad App per la logica di presumere che il testo sia in formato UTF-8. È quindi possibile convertire qualsiasi . Codifica supportata da NET in UTF-8 usando Funzioni di Azure.

Questa soluzione funziona con flussi di lavoro multi-tenant e a tenant singolo. È anche possibile usare questa soluzione con il connettore AS2.

Convertire la codifica del payload

Verificare prima di tutto che il trigger sia in grado di identificare correttamente il tipo di contenuto. Questo passaggio garantisce che App per la logica non presupponga più che il testo sia UTF-8.

In trigger e azioni con la proprietà Deduci tipo di contenuto selezionare No. Questa proprietà è in genere presente nell'elenco Aggiungi parametri dell'operazione. Tuttavia, se l'operazione non include questa proprietà, il tipo di contenuto viene impostato dal messaggio in ingresso.

L'elenco seguente mostra alcuni connettori in cui è possibile disabilitare l'inferenza automatica del tipo di contenuto:

Se si usa il trigger di richiesta per il contenuto, è necessario impostare il parametro text/plain charset presente nell'intestazione della Content-Type chiamata. In caso contrario, i caratteri potrebbero essere danneggiati o il parametro non corrisponde al formato di codifica del payload. Per altre informazioni, vedere come gestire il tipo di text/plain contenuto.

Ad esempio, il trigger HTTP converte il contenuto in ingresso in UTF-8 quando Content-Type l'intestazione è impostata con il parametro charset corretto:

{
    "headers": {
        <...>
        "Content-Type": "text/plain; charset=windows-1250"
        },
        "body": "non UTF-8 text content"
}

Se si imposta Content-Type l'intestazione su , è anche possibile application/octet-stream che si ricevano caratteri non UTF-8. Per altre informazioni, vedere Come gestire il tipo di application/octet-stream contenuto.

Codificare il contenuto In base 64

Prima di codificare il contenuto in base 64, assicurarsi di aver convertito il testo in UTF-8. Se si decodifica il contenuto in base 64 in una stringa prima di convertire il testo in UTF-8, i caratteri potrebbero restituire danneggiato.

Convertire quindi qualsiasi oggetto . Codifica supportata da NET in un altro . Codifica supportata da NET. Esaminare l'Funzioni di Azure di codice seguente o l'esempio di codice .NET:

Suggerimento

Per le app per la logica a tenant singolo, è possibile migliorare le prestazioni e ridurre la latenza eseguendo in locale la funzione di conversione.

Funzioni di Azure versione

L'esempio seguente è per Funzioni di Azure versione 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)))
      });
  }
}

Versione di .NET

L'esempio seguente è per l'uso con .NET Standard e Funzioni di Azure versione 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 questi stessi concetti, è anche possibile inviare un payload non Unicode dal flusso di lavoro.

Conversioni di payload di esempio

In questo esempio la stringa di input di esempio con codifica Base64 è un nome personale, H é lo ï se, che contiene caratteri accentati.

Input di esempio:

{  
    "text": "SMOpbG/Dr3Nl",
    "encodingInput": "utf-8",
    "encodingOutput": "windows-1252"
}

Output di esempio:

{
    "text": "U01PcGJHL0RyM05s"
}

Inviare payload non Unicode

Se è necessario inviare un payload non Unicode dal flusso di lavoro, eseguire la procedura per convertire il payload in UTF-8 in ordine inverso. Mantenere il testo in UTF-8 il più a lungo possibile all'interno del sistema. Usare quindi la stessa funzione per convertire i caratteri UTF-8 con codifica Base64 nella codifica richiesta. Applicare quindi la decodifica Base64 al testo e inviare il payload.

Convertire i payload per AS2

È anche possibile usare questa soluzione con payload non Unicode nel connettore AS2 v2. Se non si convertono i payload passati ad AS2 in UTF-8, potrebbero verificarsi problemi con l'interpretazione del payload. Questi problemi potrebbero causare una mancata corrispondenza con l'hash MIC tra i partner a causa di caratteri non interpretati correttamente.

Passaggi successivi