相关文章推荐
飘逸的蘑菇  ·  浅谈SQL ...·  1 周前    · 
非常酷的消防车  ·  老灰菜网络杂记·  1 年前    · 
愤怒的伤疤  ·  gcloud nodejs ...·  2 年前    · 
千年单身的咖啡  ·  php - Shared access: ...·  2 年前    · 

适用范围:Azure 逻辑应用(消耗型 + 标准型)

处理文本有效负载时,Azure 逻辑应用会推断以 Unicode 格式(如 UTF-8)编码的文本。 在工作流中接收、发送或处理使用不同编码的字符时,可能会遇到问题。 例如,使用不支持 Unicode 的旧系统时,平面文件中可能会出现损坏的字符。

若要处理使用其他字符编码的文本,请将 base64ToBinary 编码应用于非 Unicode 有效负载。 此步骤可防止 Azure 逻辑应用假定文本采用 UTF-8 格式。 然后,可以使用 Azure Functions 将所有 .NET 支持编码转换为 UTF-8 格式。

此解决方案适用于多租户 和单租户 工作流。 你还可以 将此解决方案用于 AS2 连接器

转换有效负载编码

首先,检查触发器能否正确识别内容类型。 此步骤可确保 Azure 逻辑应用不再假定文本是 UTF-8 格式。

在具有“推断内容类型”属性的触发器和操作中,选择“否”。 通常可以在操作的“高级参数”列表中找到此属性。 但是,如果操作不包括此属性,则内容类型由入站消息设置。

在下面的列表显示的连接器类型中,可以禁用自动推断内容类型这一功能:

  • OneDrive
  • Azure Blob 存储
  • Azure 文件存储
  • 如果对 text/plain 内容使用请求触发器 ,则必须在调用的 Content-Type 标头中设置 charset 参数。 否则字符可能会被损坏,或者参数与有效负载的编码格式不匹配。 有关详细信息,请参阅 如何处理 text/plain 内容类型

    例如,使用正确的 charset 参数设置 Content-Type 标头时,HTTP 触发器会将传入内容转换为 UTF-8 格式:

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

    如果将 Content-Type 标头设置为 application/octet-stream ,则还可能收到非 UTF-8 字符。 有关详细信息,请参阅 如何处理 application/octet-stream 内容类型

    对内容使用 Base64 编码

    在对字符串内容使用 base64 编码 之前,请确保 将文本转换为 UTF-8 格式 。 否则,可能会返回损坏的字符。

    接下来,将所有 .NET 支持编码转换为其他 .NET 支持编码。 请参阅 Azure Functions 代码示例 .NET 代码示例

    对于单租户逻辑应用,可以通过在本地运行转换函数,提高性能,减少延迟。

    Azure Functions 版本

    以下示例适用于 Azure Functions 版本 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)))
    

    .NET 版本

    以下示例适用于 .NET Standard 和 Azure Functions 版本 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);
                    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;
                    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)))
    

    使用以上相同的概念,还可以在工作流中发送非 Unicode 有效负载

    示例有效负载转换

    在此示例中,base64 编码的示例输入字符串是人名,其中包含重音字符:Héloïse

    输入示例:

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

    示例输出:

        "text": "U01PcGJHL0RyM05s"

    发送非 Unicode 有效负载

    如果需要从工作流发送非 Unicode 有效负载,请反向执行将有效负载转换为 UTF-8 格式的步骤。 让文本在系统中使用尽可能长的 UTF-8 格式。 接下来,使用相同的函数将 base64 编码 UTF-8 字符转换为所需编码字符。 然后,将 base64 解码应用于文本,并发送有效负载。

    使用 Azure Functions 中的返回值时,请确保使用 base64ToBinary 函数,而不是 base64ToString 函数。

    转换 AS2 的有效负载

    你还可以将此解决方案用于 AS2 v2 连接器中的非 Unicode 有效负载。 如果不将传递给 AS2 的有效负载转换为 UTF-8 格式,则可能遇到有效负载转译问题。 这些问题可能会导致合作伙伴之间的 MIC 哈希代码因误转译的字符而不一致。

    使用 Enterprise Integration Pack 对 Azure 逻辑应用中的平面文件进行编码或解码