У меня есть сценарий PowerShell следующим образом:
$headers = @{}
$headers.Add('ApiKey','xxx')
$file = 'xxx.zip'
Invoke-WebRequest "https://myurl/Export/" -Headers $headers -Outfile $file
Это отлично работает на моем локальном компьютере, но когда я запускаю его в книге Azure, я получаю:
Код состояния ответа не указывает на успех: 400 (неверный запрос).
Может ли проблема быть в версии Powershell или в каких-то других идеях?
Запустил его локально из командной строки cmd, используя файл Powershell, и он работает. Запуск его в Runbook Azure не работает.
В Postman он отлично работает. Я воссоздал Azure Runbook с помощью Powershell V7.1, и процесс работает. В версии 7.2 это не работает. Должен быть какой-то устаревший синтаксис.
Вероятно, к запросу в версии 7.1 добавляются заголовки по умолчанию, которые не добавляются в версии 7.2. Проверьте панель управления Postman и получите все заголовки HTTP. Затем добавьте недостающие заголовки в свой запрос PS. Также проверьте версию HTTP в Postman, если она 1.0 или 1.1. Я считаю, что PS теперь использует HTTP 1.1.
Какое-нибудь внутреннее исключение? (Используйте: Get-Error
). В общем, попробуйте: [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
(или более низкую версию).
Привет @JeremyReynolds! Вы можете попробовать использовать PowerShell V5.1 в runbook.
Скрипт Powershell работает в ISE, но не работает в Azure Runbook
Существует несколько причин ошибки 400 Bad Request в учетной записи автоматизации.
Обязательно убедитесь, что версия PowerShell в Azure runbook
совместима со сценарием, а также проверьте сетевые ограничения.
Вот обновленный PowerShell script
, в котором можно получить более подробную информацию о запросе и ответе.
$PSVersionTable.PSVersion
Test-NetConnection -ComputerName "jsonplaceholder.typicode.com" -Port 443
$headers = @{}
$headers.Add('ApiKey', 'test-api-key')
$file = 'test-response.json'
$url = "https://jsonplaceholder.typicode.com/posts"
Write-Output "Headers: $($headers | Out-String)"
try {
$response = Invoke-WebRequest -Uri $url -Headers $headers -OutFile $file -ErrorAction Stop
Write-Output "Response: $($response | Out-String)"
} catch {
Write-Output "Error: $_"
if ($_.Exception.Response) {
$responseStream = [System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream())
$responseBody = $responseStream.ReadToEnd()
Write-Output "Response Body: $responseBody"
}
}
Выход:
Примечание. В моем случае я использовал общедоступный URL-адрес и образец данных с версией среды выполнения 5.1.
Если в сценарии возникнет какая-либо проблема, он обнаружит ошибку и отобразит ее, как показано ниже.
У вас может быть файл cookie на локальном компьютере, который позволяет коду работать, но не иметь файла cookie на удаленном компьютере. Я подозреваю, что если вы удалите файлы cookie на локальном компьютере, это тоже не сработает. Лучший способ начать работу — использовать Postman. Сначала попробуйте на рабочей машине. У Postman есть панель управления, где вы можете просмотреть весь запрос, включая заголовки. Почтальон автоматически добавит недостающие заголовки. Проверьте панель управления и какие заголовки отправляются. Затем повторите действия на неработающей машине и проверьте заголовки. Решение — добавить в код недостающие заголовки.