Udostępnij za pośrednictwem


Obsługa kodowania znaków innych niż Unicode w usłudze Azure Logic Apps

Dotyczy: Azure Logic Apps (Zużycie + Standardowa)

Podczas pracy z ładunkami tekstowymi usługa Azure Logic Apps wnioskuje, że tekst jest zakodowany w formacie Unicode, takim jak UTF-8. Mogą wystąpić problemy z odbieraniem, wysyłaniem lub przetwarzaniem znaków z różnymi kodowaniem w przepływie pracy. Na przykład podczas pracy ze starszymi systemami, które nie obsługują formatu Unicode, mogą zostać uszkodzone znaki w plikach prostych.

Aby pracować z tekstem z innym kodowaniem znaków, zastosuj kodowanie base64ToBinary do ładunku innego niż Unicode. Ten krok uniemożliwia usłudze Azure Logic Apps założenie, że tekst jest w formacie UTF-8. Następnie można przekonwertować dowolny element . Kodowanie obsługiwane przez platformę NET do formatu UTF-8 przy użyciu usługi Azure Functions.

To rozwiązanie działa zarówno z wielodostępnymi , jak i jednodostępnymi przepływami pracy. Możesz również użyć tego rozwiązania z łącznikiem AS2.

Konwertowanie kodowania ładunku

Najpierw sprawdź, czy wyzwalacz może poprawnie zidentyfikować typ zawartości. Ten krok gwarantuje, że usługa Azure Logic Apps nie zakłada już, że tekst to UTF-8.

W wyzwalaczach i akcjach, które mają właściwość Typ zawartości wnioskowania, wybierz pozycję Nie. Zazwyczaj tę właściwość można znaleźć na liście Parametrów zaawansowanych operacji. Jeśli jednak operacja nie zawiera tej właściwości, typ zawartości jest ustawiany przez komunikat przychodzący.

Na poniższej liście przedstawiono niektóre łączniki, w których można wyłączyć automatyczne wnioskowanie typu zawartości:

Jeśli używasz wyzwalacza żądania dla text/plain zawartości, musisz ustawić charset parametr, który znajduje się w nagłówku wywołania Content-Type . W przeciwnym razie znaki mogą zostać uszkodzone lub parametr nie jest zgodny z formatem kodowania ładunku. Aby uzyskać więcej informacji, zapoznaj się ze sposobem obsługi text/plain typu zawartości.

Na przykład wyzwalacz HTTP konwertuje zawartość przychodzącą na utF-8, gdy Content-Type nagłówek jest ustawiony przy użyciu poprawnego charset parametru:

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

Jeśli ustawisz Content-Type nagłówek na application/octet-streamwartość , mogą również zostać wyświetlone znaki, które nie są UTF-8. Aby uzyskać więcej informacji, zobacz , jak obsługiwać application/octet-stream typ zawartości.

Kodowanie zawartości base64

Przed zakodowaniem zawartości base64 do ciągu upewnij się, że przekonwertowano tekst na utF-8. W przeciwnym razie znaki mogą zwracać uszkodzone.

Następnie przekonwertuj dowolny element . Kodowanie obsługiwane przez platformę NET do innego elementu . Kodowanie obsługiwane przez platformę NET. Zapoznaj się z przykładem kodu usługi Azure Functions lub przykładem kodu platformy .NET:

Napiwek

W przypadku aplikacji logiki z jedną dzierżawą można zwiększyć wydajność i zmniejszyć opóźnienie, uruchamiając lokalnie funkcję konwersji.

Wersja usługi Azure Functions

Poniższy przykład dotyczy usługi Azure Functions w wersji 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)))
      });
  }
}

Wersja platformy .NET

Poniższy przykład dotyczy użycia z platformą .NET Standard i usługą Azure Functions w wersji 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)))
                });
        }
    }

Korzystając z tych samych pojęć, możesz również wysłać ładunek inny niż Unicode z przepływu pracy.

Przykładowe konwersje ładunku

W tym przykładzie przykładowy ciąg wejściowy zakodowany w formacie base64 jest nazwą osobistą zawierającą znaki wyróżniające: Lóloïse

Przykładowe dane wejściowe:

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

Przykładowe wyjście:

{
    "text": "U01PcGJHL0RyM05s"
}

Wysyłanie ładunku innego niż Unicode

Jeśli musisz wysłać ładunek inny niż Unicode z przepływu pracy, wykonaj kroki konwertowania ładunku na utF-8 w odwrotnym przypadku. Zachowaj tekst w formacie UTF-8 tak długo, jak to możliwe w systemie. Następnie użyj tej samej funkcji, aby przekonwertować znaki UTF-8 zakodowane w formacie base64 na wymagane kodowanie. Następnie zastosuj dekodowanie base64 do tekstu i wyślij ładunek.

Korzystając z wartości zwracanej z usługi Azure Functions, upewnij się, że używasz funkcji base64ToBinary, a nie funkcji base64ToString.

Konwertowanie ładunków dla usługi AS2

Możesz również użyć tego rozwiązania z ładunkami innych niż Unicode w łączniku AS2 w wersji 2. Jeśli nie konwertujesz ładunków przekazywanych do as2 do UTF-8, mogą wystąpić problemy z interpretacją ładunku. Te problemy mogą spowodować niezgodność skrótu MIC między partnerami z powodu błędnie zinterpretowanych znaków.

Następne kroki