如何通过WebHook捕获ADF中Runbook在hybrid worker上的执行错误
ADF调用Azure自动化Runbook报错未被捕获的解决方案
问题本质
你当前的脚本逻辑存在执行顺序缺陷:CATCH块中触发错误回调后,没有终止脚本运行,后续的全局回调逻辑会再次调用ADF回调地址,覆盖错误请求发送成功报文,最终导致ADF仅识别到最后一次的成功回调,标记活动执行成功。
同时回调报文结构不符合ADF Webhook活动的错误识别规则,也是错误无法被正确捕获的原因之一。
修复步骤
1. 调整错误回调逻辑,执行完成后直接终止脚本
在CATCH块的回调请求执行完成后添加exit 1,阻止后续代码继续执行,避免成功报文覆盖错误报文。
2. 补充文件存在性前置校验
在上传文件之前先判断本地文件是否存在,不存在则主动抛出错误进入CATCH逻辑。
3. 优化回调报文结构适配ADF规则
ADF Webhook活动识别失败要求:HTTP响应状态码为4xx/5xx,报文中包含error对象;成功请求返回200状态码,可添加output字段避免提示“No output available”。
修复后的完整代码
param( [Parameter (Mandatory = $false)] [object] $WebhookData ) Import-Module Az.Storage -force $callBackUri = $null if($WebhookData){ $parameters=(ConvertFrom-Json -InputObject $WebhookData.RequestBody) if($parameters.callBackUri) {$callBackUri=$parameters.callBackUri} } TRY { $connectionName = "***************" $storageAccountName = "*****************" $sasToken = "************************" $context = New-AzStorageContext -StorageAccountName $storageAccountName -SASToken $sasToken $localFile = "C:\VenaIntegrate\Data\In\" $filename = "exporthierarchy" + (Get-Date -format "yyyyMMdd") + ".psv" $filename2 = "exportattributes" + (Get-Date -format "yyyyMMdd") + ".psv" $path = $localFile + $filename $path2 = $localFile + $filename2 # 新增文件存在性校验 if(-not (Test-Path -Path $path -PathType Leaf)){ throw "文件$path不存在" } if(-not (Test-Path -Path $path2 -PathType Leaf)){ throw "文件$path2不存在" } $filesystemName = "******" Set-AzStorageBlobContent -File $path -Container $filesystemName -Context $context -Force Set-AzStorageBlobContent -File $path2 -Container $filesystemName -Context $context -Force # 执行成功回调 $body = [ordered]@{ success = @{ SuccessCode = "Process success" Message = "Process completed successfully" } # 新增output字段,消除ADF无输出提示 output = @{ status = "Success" message = "文件上传完成" } } $bodyJson = $body | ConvertTo-Json Invoke-WebRequest -UseBasicParsing -Uri $callBackUri -Method Post -Body $bodyJson -ContentType "application/json" } CATCH { Write-Error "Error Occured: $_" # 仅当回调地址存在时发送错误通知 if($callBackUri){ $body = [ordered]@{ error = @{ ErrorCode = "ExecutionFailed" Message = $_.Exception.Message } statusCode = "400" } $bodyJson = $body | ConvertTo-Json Invoke-WebRequest -UseBasicParsing -Uri $callBackUri -Method Post -Body $bodyJson -ContentType "application/json" } # 终止脚本运行,避免后续逻辑覆盖回调结果 exit 1 } # 回调地址为空的错误处理 If (!$callBackUri) { Write-Error "缺少必填参数callBackUri" exit 1 }
验证逻辑
修改完成后,测试文件不存在的场景:Runbook会进入CATCH块发送错误回调后直接终止,ADF收到400状态码和错误对象,会自动标记活动为失败,同时展示错误信息。
内容的提问来源于stack exchange,提问作者Siddcity
相关产品推荐
相关产品推荐

