Azure工作流XML Transform执行报错:Functions.XsltNetFxLanguageWorkerFunction
Azure Logic Apps XML转换工作流间歇性InternalServerError故障排查
问题描述
我们的Azure状态型工作流在执行XML转换(XSLT)操作时出现间歇性失败,报错信息如下:
InternalServerError
Exception while executing function: Functions.XsltNetFxLanguageWorkerFunction
重启流程多数情况下可恢复,但故障根因尚未明确。多个不同工作流均出现该问题,疑似与基础设施或资源限制相关。故障表现存在随机性,例如某次运行首次失败、首次重启仍失败,第二次重启才成功。
相关工作流定义
{ "definition": { "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#", "actions": { "FailedGetNamespace": { "inputs": { "body": "{\n \"Timestamp\": \"@{utcNow()}\",\n \"LogicAppName\": \"rossumWE01-logic\",\n \"WorkflowName\": \"@{workflow().id}\",\n \"LogActionName\": \"Log Failure GetNamespace\",\n \"RunId\": \"@{workflow().run.name}\",\n \"LogLevel\": \"Error\",\n \"Message\": \"Failed to get Namespace from: @{triggerBody()?['Content']}\"\n}", "headers": { "Log-Type": "FunctionalLog" }, "host": { "connection": { "referenceName": "azureloganalyticsdatacollector" } }, "method": "post", "path": "/api/logs" }, "runAfter": { "GetNamespace": [ "FAILED" ] }, "type": "ApiConnection" }, "For_each": { "actions": { "Compose": { "inputs": "@body('Transform_XML_To_JSON')", "runAfter": { "Transform_XML_To_JSON": [ "SUCCEEDED" ] }, "type": "Compose" }, "HTTP": { "inputs": { "body": { "$content-type": "multipart/form-data", "$multipart": [ { "body": "@outputs('Compose')", "headers": { "Content-Disposition": "form-data; name=file; filename=\"vendorMasterData.json\"", "Content-Type": "application/json" } }, { "body": "UTF-8", "headers": { "Content-Disposition": "form-data; name=\"encoding\";" } }, { "body": "SAPSupplierNumber", "headers": { "Content-Disposition": "form-data; name=\"id_keys\";" } } ] }, "headers": { "Authorization": "Bearer @{body('Get_secret')?['value']}", "Content-Type": "multipart/form-data" }, "method": "PATCH", "uri": "@concat('https://xx.yy.ai/svc/data-matching/api/v1/dataset/', variables('varDatasetName'))" }, "runAfter": { "Compose": [ "SUCCEEDED" ] }, "type": "Http" }, "Set_varTransformed": { "inputs": { "name": "varTransformed", "value": "@{replace(replace(replace(string(body('Transform_XML')),'<Header>','<Header xmlns=\"\">'), '<?xml version=\"1.0\" encoding=\"utf-8\"?>', ''), '\"', '\\\"')}" }, "runAfter": { "Transform_XML": [ "Succeeded" ] }, "type": "SetVariable" }, "StatusCode_eq_200": { "actions": { "Set_varResultMessage": { "inputs": { "name": "varResultMessage", "value": "@{json(string(body('HTTP')))['error']}" }, "type": "SetVariable" }, "varResultMessage_is_null": { "actions": {}, "else": { "actions": { "Append2varErrorMessage": { "inputs": { "name": "varErrorMessage", "value": "@json(string(body('HTTP')))['error']" }, "type": "AppendToStringVariable" } } }, "expression": { "and": [ { "equals": [ "@variables('varResultMessage')", "@null" ] } ] }, "runAfter": { "Set_varResultMessage": [ "Succeeded" ] }, "type": "If" } }, "else": { "actions": { "Append2varErrorMessage2": { "inputs": { "name": "varErrorMessage", "value": "ErrorCode received from Rossum: @{outputs('HTTP')?['statusCode']} for Vendor@{outputs('TrackVendor')} \\n" }, "type": "AppendToStringVariable" } } }, "expression": { "and": [ { "equals": [ "@outputs('HTTP')['statusCode']", 200 ] } ] }, "runAfter": { "HTTP": [ "Succeeded", "FAILED", "TIMEDOUT" ] }, "type": "If" }, "TrackVendor": { "inputs": "@xpath(xml(items('For_each')), '/*[local-name()=\"E1CSKSM\"]/*[local-name()=\"KOSTL\"]/text()')?[0]", "trackedProperties": { "VendorNr": "@action()['inputs']" }, "type": "Compose" }, "Transform_XML": { "inputs": { "content": "<ZCREMAS01><IDOC BEGIN=\"1\">@{items('For_each')}</IDOC></ZCREMAS01>", "map": { "name": "vendor-export-mapping.xslt", "source": "LogicApp" } }, "runAfter": { "TrackVendor": [ "SUCCEEDED" ] }, "type": "Xslt" }, "Transform_XML_To_JSON": { "inputs": { "content": "@variables('varTransformed')", "map": { "name": "vendor-export-mapping.liquid", "source": "LogicApp" } }, "kind": "XmlToJson", "runAfter": { "Set_varTransformed": [ "SUCCEEDED" ] }, "type": "Liquid" } }, "foreach": "@variables('RootNamespace')", "runAfter": { "GetNamespace": [ "Succeeded" ] }, "type": "Foreach" }, "GetNamespace": { "inputs": { "variables": [ { "name": "RootNamespace", "type": "array", "value": "@xpath(xml(triggerBody()?['Content']), '/*[name()=\"ZCREMAS01\"]/*[name()=\"IDOC\"]/*[name()=\"E1LFA1M\"]')" } ] }, "runAfter": { "Get_secret": [ "SUCCEEDED" ] }, "type": "InitializeVariable" }, "Get_secret": { "inputs": { "parameters": { "secretName": "rossum-token" }, "serviceProviderConfiguration": { "connectionName": "keyVault", "operationId": "getSecret", "serviceProviderId": "/serviceProviders/keyVault" } }, "runAfter": { "Initialize_varDatasetName": [ "SUCCEEDED" ] }, "type": "ServiceProvider" }, "Initialize_varDatasetName": { "inputs": { "variables": [ { "name": "varDatasetName", "type": "string", "value": "@{appsetting('vendorDataSetName')}" } ] }, "runAfter": { "Initialize_varResultMessage": [ "Succeeded" ] }, "type": "InitializeVariable" }, "Initialize_varErrorMessage": { "inputs": { "variables": [ { "name": "varErrorMessage", "type": "string" } ] }, "runAfter": { "Initialize_varTransformed": [ "Succeeded" ] }, "type": "InitializeVariable" }, "Initialize_varResultMessage": { "inputs": { "variables": [ { "name": "varResultMessage", "type": "string", "value": "@{null}" } ] }, "runAfter": { "Initialize_varErrorMessage": [ "Succeeded" ] }, "type": "InitializeVariable" }, "Initialize_varTransformed": { "inputs": { "variables": [ { "name": "varTransformed", "type": "string" } ] }, "runAfter": {}, "type": "InitializeVariable" }, "Length_varErrorMessage_gt_0": { "actions": { "Send_Error_Message": { "inputs": { "body": "{\n \"Timestamp\": \"@{utcNow()}\",\n \"LogicAppName\": \"rossumWE01-logic\",\n \"WorkflowName\": \"@{workflow().id}\",\n \"LogActionName\": \"Log Error Message\",\n \"RunId\": \"@{workflow().run.name}\",\n \"LogLevel\": \"Error\",\n \"Message\": \"ErrorMessage: @{variables('varErrorMessage')}\"\n}", "headers": { "Log-Type": "FunctionalLog" }, "host": { "connection": { "referenceName": "azureloganalyticsdatacollector" } }, "method": "post", "path": "/api/logs" }, "type": "ApiConnection" }, "Terminate": { "inputs": { "runError": { "code": "@variables('varErrorMessage')" }, "runStatus": "Failed" }, "runAfter": { "Send_Error_Message": [ "SUCCEEDED" ] }, "type": "Terminate" } }, "else": { "actions": {} }, "expression": { "and": [ { "greater": [ "@length(variables('varErrorMessage'))", 0 ] } ] }, "runAfter": { "For_each": [ "Succeeded" ] }, "type": "If" }, "Response2SAP": { "inputs": { "statusCode": 200 }, "kind": "http", "runAfter": {}, "type": "Response" } }, "contentVersion": "1.0.0.0", "outputs": {}, "triggers": { "When_a_message_is_received": { "inputs": { "body": { "IdocFormat": "SapPlainXml", "NotificationUrl": "@{listCallbackUrl()}" }, "host": { "connection": { "referenceName": "sap" } }, "path": "/api/webhooktrigger/subscribe", "queries": { "degreeOfParallelism": -1, "gatewayHost": "@{appsetting('sapServer')}", "gatewayService": "@{appsetting('sapPort')}", "programId": "@{appsetting('progIdVE')}" }, "retryPolicy": { "count": 5, "interval": "PT20S", "maximumInterval": "PT1H", "minimumInterval": "PT10S", "type": "exponential" } }, "runtimeConfiguration": { "concurrency": { "runs": 5 } }, "type": "ApiConnectionWebhook" } } }, "kind": "Stateful" }
可能的根因分析
- .NET Framework语言工作者进程异常:XsltNetFxLanguageWorkerFunction依赖.NET Framework运行时,进程可能因内存泄漏、资源耗尽或初始化异常崩溃,导致转换失败。
- 宿主资源限制:状态型工作流的宿主实例CPU/内存不足,无法为XSLT转换进程分配足够资源,引发内部错误。
- XSLT映射加载异常:逻辑应用内部存储的XSLT文件可能存在缓存加载问题,首次或重启时未正确读取映射文件。
- 并发资源竞争:工作流设置了5个并发运行实例,可能导致语言工作者进程之间竞争系统资源,引发间歇性失败。
解决方案建议
- 调整宿主资源配置:若使用消耗计划,考虑切换至标准计划并提升实例大小,确保有足够CPU和内存支撑XSLT转换操作。
- 配置进程回收策略:针对.NET Framework语言工作者,设置定期进程回收,避免内存泄漏累积导致的进程异常。
- 优化XSLT转换步骤:
- 检查XSLT文件的语法和性能,简化复杂转换逻辑,避免超时或资源占用过高。
- 将XSLT映射文件迁移至Blob存储,通过外部引用加载,减少内部存储的加载异常概率。
- 降低并发运行数:调整
runtimeConfiguration.concurrency.runs参数,减少并发实例数量,缓解资源竞争。 - 启用详细诊断日志:在逻辑应用中开启诊断日志,收集XsltNetFxLanguageWorkerFunction的完整堆栈跟踪,定位具体异常点。
- 添加自动重试逻辑:在XSLT转换步骤配置重试策略,针对InternalServerError自动重试,减少人工重启操作。
内容的提问来源于stack exchange,提问作者PeterS
相关产品推荐
相关产品推荐

