Мы используем AzureCLI, чтобы иметь возможность вызывать конечную точку функции Azure после успешного развертывания. Вызов для получения токена работает, а вызов нашей функции Azure превращает его в MyFunction.
Проблема в формате тела, когда оно приходит.
Если мы включим -Compress для ConvertTo-Json, тело будет получено как {ResourceId:3,BuildPipelineName:ResourceName}, а System.Text.Json.JsonSerializer.Deserialize выдаст 'R' is an invalid start of a property name. Expected a '"'. LineNumber: 0 | BytePositionInLine: 1.
Если мы не включим -Compress для ConvertTo-Json, тело придет как { и выбросит 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).
Спасибо, что добавили Заменить после того, как ConvertTo_Json -Compress сработал; Спасибо. Я начал с pscore, но все машины, на которые мы развертываем, являются Windows, и, к сожалению, на них еще не установлен pscore.
Теперь, когда я лучше понимаю, лучшим вопросом было бы «Как создать объект JSON с помощью PowerShell», и, вероятно, есть несколько сообщений, которые отвечают на этот вопрос. Я подозреваю, что у меня было слишком много вспомогательных работ в моих вопросах, чтобы Google не мог найти ответ. Спасибо.
На самом деле то, как вы это сделали, было правильным с точки зрения PowerShell. Если вы сбросите это в файл, это будет вполне допустимый JSON. Это скорее вопрос az rest причуды. Таким образом, хорошим заголовком будет «Как передать JSON в az rest CLI из Powershell».
{ResourceId:3,BuildPipelineName:ResourceName}должно быть{"ResourceId:"3,"BuildPipelineName":"ResourceName"}как вы видите выполнение$body = @{ResourceId=$env:COMPUTERNAME;ResourceName=$Env:NUMBER_OF_PROCESSORS;} | ConvertTo-Json -Compress