在使用 az rest 调用 .NET6 Azure 函数时,如何使用 PowerShell 创建可由 .NET6 反序列化的 JSON 主体

How to create a JSON body with PowerShell which is Deserializable by .NET6 when using az rest to call a .NET6 Azure Function

我们正在使用 AzureCLI 以便能够在成功部署后调用 Azure Function 端点。获取令牌的调用有效,并且对我们的 azure 函数的调用使其进入 MyFunction。

问题是正文到达时的格式。

如果我们为 ConvertTo-Json 包含 -Compress,正文会像 {ResourceId:3,BuildPipelineName:ResourceName} 一样到达,而 System.Text.Json.JsonSerializer.Deserialize 会抛出 'R' is an invalid start of a property name. Expected a '"'. LineNumber: 0 | BytePositionInLine: 1.

如果我们不为 ConvertTo-Json 包含 -Compress,正文会像 { 一样到达并抛出 Expected depth to be zero at the end of the JSON payload. There is an open JSON object or array that should be closed. LineNumber: 0 | BytePositionInLine: 1.

      runOnce:
        deploy:
          steps:
            - template: ./deployment.yml    

        on:  # On success or failure hook for runOnce deployment strategy
          success:  # Runs on success of all of the steps
            steps:
              - task: AzureCLI@2
                inputs:
                  azureSubscription: 'MyServiceConnectionName'
                  scriptType: ps
                  scriptLocation: inlineScript
                  inlineScript: |
                    $functionKeys = az functionapp function keys list -g my-resource-group -n my-azure-function-name --function-name MyFunction | ConvertFrom-Json
                    $defaultKey = $functionKeys.default
                    
                    $body = @{ 
                        ResourceId="$(Environment.ResourceId)";
                        ResourceName="$(Environment.ResourceName)";
                        } | ConvertTo-Json -Compress 
                    echo body: $body

                    $url2 = "https://my-azure-function-name.azurewebsites.net/api/MyFunction?code=$defaultKey"

                    $response = az rest --method post --uri $url2 --skip-authorization-header --verbose --body $body
                    echo response: $response

我们已尝试将以下 json 选项添加到 JsonSerializer.Deserialize,但行为没有任何变化

        var jsonOptions = new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true,
            ReadCommentHandling = JsonCommentHandling.Skip,
            AllowTrailingCommas = true,
            NumberHandling = JsonNumberHandling.AllowReadingFromString
        };

我们还尝试将正文创建更改为单行,例如:

  $body = @{ResourceId="$(Environment.ResourceId)";ResourceName="$(Environment.ResourceName)" } | ConvertTo-Json -Compress

我们是 PowerShell 和 .NET6 的新手。我们很乐意尝试改变任何一方。任何可能使此请求成功的东西都将不胜感激。

感谢您分享您辛苦得来的知识。

Az rest 对 JSON 输入的格式非常敏感。例如,它需要对双引号进行转义,即使在 Windows 上也是如此。正如您已经注意到的,它也不喜欢换行符。

试试这个方法:

$body = (@{
  ResourceId="$(Environment.ResourceId)";
  ResourceName="$(Environment.ResourceName)";
} | ConvertTo-Json -Compress).Replace('"', '\"')

这将转义双引号(bash 样式)。

我还建议在您的管道中将 scriptType 更改为 pscore(Windows 和 Linux 代理均支持)。