Mendukung pengodean karakter non-Unicode di Azure Logic Apps

Saat Anda bekerja dengan payload teks, Azure Logic Apps menyimpulkan teks dikodekan dalam format Unicode, seperti UTF-8. Anda mungkin mengalami masalah saat menerima, mengirim, atau memproses karakter dengan pengenkodean berbeda di alur kerja Anda. Misalnya, Anda mungkin mendapat karakter yang rusak dalam file datar saat bekerja dengan sistem warisan yang tidak mendukung Unicode.

Untuk bekerja dengan teks yang memiliki pengenkodean karakter lain, terapkan pengenkodean base64 ke payload non-Unicode. Langkah ini mencegah Azure Logic Apps mengasumsikan teks dalam format UTF-8. Anda kemudian dapat mengonversi pengenkodean apa pun yang didukung .NET ke UTF-8 menggunakan Azure Functions.

Solusi ini bekerja dengan alur kerja multi-penyewa dan penyewa tunggal. Anda juga dapat menggunakan solusi ini dengan konektor AS2.

Mengonversi pengenkodean payload

Pertama, periksa apakah pemicu Anda dapat mengidentifikasi jenis konten dengan benar. Langkah ini memastikan bahwa Azure Logic Apps tidak lagi mengasumsikan teks adalah UTF-8.

Dalam pemicu dan tindakan yang memiliki properti Infer Content Type, pilih Tidak. Anda biasanya dapat menemukan properti ini dalam daftar Tambahkan parameter operasi. Namun, jika operasi tidak menyertakan properti ini, jenis konten diatur oleh pesan masuk.

Daftar berikut menunjukkan beberapa konektor tempat Anda dapat menonaktifkan penyimpulan jenis konten secara otomatis:

Jika menggunakan Pemicu permintaan untuk konten text/plain, Anda harus mengatur parameter charset di header Content-Type panggilan. Jika tidak, karakter mungkin rusak, atau parameter tidak cocok dengan format pengodean payload. Untuk informasi selengkapnya, lihat cara menangani jenis konten text/plain.

Misalnya, pemicu HTTP mengonversi konten masuk ke UTF-8 saat Content-Typeheader diatur dengan parameter charset yang benar:

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

Jika Anda mengatur header Content-Type ke application/octet-stream, Anda juga mungkin menerima karakter yang bukan UTF-8. Untuk informasi selengkapnya, lihat cara menangani application/octet-streamjenis konten.

Konten enkode Base64

Sebelum Anda mengenkode base64 konten pada string, pastikan Anda telah mengonversi teks menjadi UTF-8. Jika tidak, karakter mungkin kembali rusak.

Selanjutnya, konversikan pengkodean yang didukung .NET ke pengkodean lain yang didukung .NET. Tinjau contoh kode Azure Functions atau contoh kode .NET:

Tip

Untuk aplikasi logika penyewa tunggal, Anda dapat meningkatkan kinerja dan mengurangi latensi dengan menjalankan fungsi konversi secara lokal.

Versi Azure Functions

Contoh berikut adalah untuk Azure Functions versi 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)))
      });
  }
}

Versi .NET

Contoh berikut adalah untuk digunakan dengan standar .NET dan Azure Functions versi 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)))
                });
        }
    }

Dengan menggunakan konsep yang sama ini, Anda juga dapat mengirim payload non-Unicode dari alur kerja Anda.

Contoh konversi payload

Dalam contoh ini, string input sampel yang dienkode base64 adalah nama pribadi yang berisi karakter beraksen :Héloïse

Contoh masukan:

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

Contoh output:

{
    "text": "U01PcGJHL0RyM05s"
}

Mengirim payload non-Unicode

Jika Anda perlu mengirim payload non-Unicode dari alur kerja Anda, lakukan langkah-langkah untuk mengonversi muatan ke UTF-8 secara terbalik. Simpan teks dalam UTF-8 selama mungkin dalam sistem Anda. Selanjutnya, gunakan fungsi yang sama untuk mengonversi karakter UTF-8 yang dienkodekan base64 ke pengenkodean yang diperlukan. Kemudian, terapkan pendekodean base64 ke teks, dan kirim payload Anda.

Mengonversi payload untuk AS2

Anda juga dapat menggunakan solusi ini dengan payload non-Unicode di konektor AS2 v2. Jika Anda tidak mengonversi payload yang Anda berikan ke AS2 ke UTF-8, Anda mungkin mengalami masalah dengan interpretasi payload. Masalah ini dapat mengakibatkan ketidakcocokan dengan hash MIC antara mitra dikarenakab karakter yang disalahartikan.

Langkah berikutnya