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-stream
wartość , 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.