【问题标题】:ADF V2 - Web POST method using Dynamic Content and VariableADF V2 - 使用动态内容和变量的 Web POST 方法
【发布时间】:2020-03-03 10:42:22
【问题描述】:

非常短的版本

如何在 ADF 内的 Web 活动中包含 JSON POST 请求中的 ADF 变量? 我觉得这应该是一个非常简单的字符串连接,但我无法让它工作

详情

我们需要在 ADF 中运行查询 / SProc,这将返回一个包含错误消息的字符串。然后,该字符串将通过 ADF 中的 Web Activity 传递给逻辑应用,以便触发包含错误的电子邮件。

从这里复制逻辑应用的设置:

https://www.mssqltips.com/sqlservertip/5718/azure-data-factory-pipeline-email-notification--part-1/

然后在这里(第 2 部分)

https://www.mssqltips.com/sqlservertip/5962/send-notifications-from-an-azure-data-factory-pipeline--part-2/

在 ADF 中,我使用 Lookup 活动来运行查询,结果返回错误(似乎可以工作,预览返回正确的字符串) 然后我使用 Set Variable 活动来获取查找的输出并将其存储在变量中。

最后一步是使用 Web Activity 启动 POST。

在我的网络活动中使用此代码(稍微调整以删除个人详细信息),一切正常,我收到一封电子邮件

{
   "DataFactoryName": "@{pipeline().DataFactory}",
   "PipelineName": "@{pipeline().Pipeline}",
   "Subject": "Pipeline finished!",
   "ErrorMessage": "Everything is okey-dokey!",
   "EmailTo": "me@myEmail.com"
}

但是任何将变量的内容放入主题部分的尝试都失败了。

这(例如)给我发了一封电子邮件,主题是@variables('EmailSubject')

{
   "DataFactoryName": "@{pipeline().DataFactory}",
   "PipelineName": "@{pipeline().Pipeline}",
   "Subject": "@variables('EmailSubject')",
   "ErrorMessage": "Everything is okey-dokey!",
   "EmailTo": "me@myEmail.com"
}

但我也尝试了各种其他解决方案,这些解决方案会导致错误或电子邮件主题仅包含我放入其中的文字内容(例如 + @variables('EmailSubject') +)。

我还尝试将整个 JSON 存储在变量中,然后让 Web 活动只使用该变量,没有返回任何错误,但也没有发送电子邮件。

这次尝试:

{
   "DataFactoryName": "@{pipeline().DataFactory}",
   "PipelineName": "@{pipeline().Pipeline}",
   "Subject": "@{variables('EmailSubject')}",
   "ErrorMessage": "Everything is okey-dokey!",
   "EmailTo": "me@myEmail.com"
}   

导致这个输入到 web 活动中 - 它实际上包括错误的文本,这是一个奖励......(文本 = 工作持续时间警告):

{
    "url": "https://azureLogicAppsSiteHere",
    "method": "POST",
    "headers": {
        "Content-Type": "application/json"
    },
    "body": "{\n   \"DataFactoryName\": \"DFNAMEHERE\",\n   \"PipelineName\": \"pipeline1\",\n   \"Subject\": \"{\"firstRow\":{\"\":\"Job Duration Warning\"},\"effectiveIntegrationRuntime\":\"DefaultIntegrationRuntime (West Europe)\",\"billingReference\":{\"activityType\":\"PipelineActivity\",\"billableDuration\":[{\"meterType\":\"AzureIR\",\"duration\":0.016666666666666666,\"unit\":\"DIUHours\"}]},\"durationInQueue\":{\"integrationRuntimeQueue\":0}}\",\n   \"ErrorMessage\": \"Everything is okey-dokey!\",\n   \"EmailTo\": \"me@myEmail.com\"\n}\t"
}

但是后来导致了这个错误:

{
    "errorCode": "2108",
    "message": "{\"error\":{\"code\":\"InvalidRequestContent\",\"message\":\"The request content is not valid and could not be deserialized: 'After parsing a value an unexpected character was encountered: f. Path 'Subject', line 4, position 17.'.\"}}",
    "failureType": "UserError",
    "target": "Web1",
    "details": []
}

[Edit] Lookup Activity 中的 PREVIEW 是文本:Job Duration Warning 但是当我调试管道时,它让我看到了实际的输出,即这个:

{
    "count": 1,
    "value": [
        {
            "": "Job Duration Warning"
        }
    ],
    "effectiveIntegrationRuntime": "DefaultIntegrationRuntime (West Europe)",
    "billingReference": {
        "activityType": "PipelineActivity",
        "billableDuration": [
            {
                "meterType": "AzureIR",
                "duration": 0.016666666666666666,
                "unit": "DIUHours"
            }
        ]
    },
    "durationInQueue": {
        "integrationRuntimeQueue": 0
    }
}

看来问题在于查找输出不是我想的那样,因此该变量不能在 Web Activity 中使用,因为它包含不受支持的字符或类似的内容。

我刚刚测试了它,它工作正常:

  • 创建一个值为 Job Duration Warning 的字符串参数
  • 将变量值设置为 @pipeline().parameters.ParamSubject
  • 在 Web Activity 中包含变量,并在其前面加上 @

然后我会收到我预期的带有正确主题的电子邮件。我只是不知道如何将查询的字符串输出转换为变量/参数,以便我可以在网络活动中使用它。

【问题讨论】:

  • 你能发布变量EmailSubject的内容吗?我的猜测是,这要么很长,要么包含导致反序列化问题的 som 字符。清理 EmailSubject 的内容以删除有问题的字符可能是要走的路。
  • 谢谢@Frode - 我确实考虑到了这一点,所以我把它修剪成一些基本的东西 - 它当前设置为:工作持续时间警告我通过查找活动中的“预览”选项确认这是查询返回什么
  • 实际上,我认为您是正确的-当我使用预览数据时,我看到了我期望的字符串>>'Job Duration Warning' 但是在我尝试运行管道后,您可以检查实际输出查找,并且它更复杂(我将编辑原始帖子以包含此信息)如果相反,我将参数类型字符串设置为等于“工作持续时间警告”,然后将变量设置为等于参数,然后 Web Activity 启动并向我发送一封主题为“工作持续时间警告”的电子邮件。即查找没有输出我认为的内容

标签: json azure-logic-apps azure-data-factory-2


【解决方案1】:

我不知道这对其他人的问题有多适用,但我找到了一个对我有用的解决方案。

  • 在查找活动中的 SELECT 查询中 - 命名输出(在我的例子中,我将该列称为“主题” - 即 SELECT xyz AS 主题
  • 在查找活动中,打开“仅第一行”设置
  • 在设置变量活动中,使用代码:@activity('Lookup1').output.firstRow.subject (其中“Lookup1”是您的查找活动的名称,主题是您正在输出的列的名称)
  • 在 Web Activity 中,引用变量如下:
{
   "DataFactoryName": "@{pipeline().DataFactory}",
   "PipelineName": "@{pipeline().Pipeline}",
   "Subject": "@{variables('EmailSubject')}",
   "ErrorMessage": "Everything is okey-dokey!",
   "EmailTo": "me@myEmail.com"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2013-03-08
    • 1970-01-01
    相关资源
    最近更新 更多