You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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个并发运行实例,可能导致语言工作者进程之间竞争系统资源,引发间歇性失败。

解决方案建议

  1. 调整宿主资源配置:若使用消耗计划,考虑切换至标准计划并提升实例大小,确保有足够CPU和内存支撑XSLT转换操作。
  2. 配置进程回收策略:针对.NET Framework语言工作者,设置定期进程回收,避免内存泄漏累积导致的进程异常。
  3. 优化XSLT转换步骤:
    • 检查XSLT文件的语法和性能,简化复杂转换逻辑,避免超时或资源占用过高。
    • 将XSLT映射文件迁移至Blob存储,通过外部引用加载,减少内部存储的加载异常概率。
  4. 降低并发运行数:调整runtimeConfiguration.concurrency.runs参数,减少并发实例数量,缓解资源竞争。
  5. 启用详细诊断日志:在逻辑应用中开启诊断日志,收集XsltNetFxLanguageWorkerFunction的完整堆栈跟踪,定位具体异常点。
  6. 添加自动重试逻辑:在XSLT转换步骤配置重试策略,针对InternalServerError自动重试,减少人工重启操作。

内容的提问来源于stack exchange,提问作者PeterS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:55:54