ADF V2 - 使用动态内容和变量的 Web POST 方法

ADF V2 - Web POST method using Dynamic Content and Variable

非常短的版本

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

详情

我们需要从 ADF 中 运行 查询/存储过程,这将 return 包含错误消息的字符串。然后,该字符串将通过 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 activity 到 运行 查询,这又带回了错误(似乎有效,预览 returns 正确的字符串) 然后我使用 Set Variable activity 获取查找的输出并将其存储在变量中。

最后一步是使用 Web Activity.

启动 POST

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

{
   "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 activity 仅使用变量,returned 没有错误,但也没有发送一封电子邮件。

这次尝试:

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

导致此输入到网络中 activity - 实际上包括错误文本,这是一个奖励......(文本 = 作业持续时间警告):

{
    "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": []
}

[编辑] 查找 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 中使用,因为它包含不受支持的字符或其他内容那些线。

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

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

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

  • 在 Lookup SELECT 查询中 Activity - 命名输出(在我的例子中,我将该列称为 'Subject'- 即 SELECT xyz AS Subject
  • 在查找 Activity 中,启用设置 'First Row Only'
  • 在设置变量Activity中,使用代码:@activity('Lookup1').output.firstRow.subject (其中 'Lookup1' 是您的 Lookup Activity 的名称,而 Subject 是您要输出的列的名称)
  • 在网络中Activity,引用变量如下:
{
   "DataFactoryName": "@{pipeline().DataFactory}",
   "PipelineName": "@{pipeline().Pipeline}",
   "Subject": "@{variables('EmailSubject')}",
   "ErrorMessage": "Everything is okey-dokey!",
   "EmailTo": "me@myEmail.com"
}