在使用 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 代理均支持)。
我们正在使用 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 代理均支持)。