#windows #powershell #httpclient
#Windows #powershell #httpclient
Вопрос:
Я пытался добавить версию Http как 1.0 в Powershell к моему объекту HttpClient.
function Post-JSONData
{
Param
(
[Parameter(Mandatory=$True)] [String] $JSONPayload,
[Parameter(Mandatory=$True)] [String] $ObjectClass,
[Parameter(Mandatory=$True)] [String] $APIUrl,
[Parameter(Mandatory=$False)] [String] $ProxyUrl
)
#Try{
If($JSONPayload.StartsWith("[") -eq $false -and $JSONPayload.EndsWith("]") -eq $false)
{ $JSONPayload = "[" $JSONPayload "]" }
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
Add-Type -AssemblyName System.Net.Http
$WebHandler = New-Object System.Net.Http.HttpClientHandler
$WebHandler.AllowAutoRedirect = $false;
If($ProxyUrl)
{
$WebProxy = New-Object System.Net.WebProxy($ProxyUrl)
$WebHandler.Proxy = $WebProxy
}
$HttpClient = New-Object System.Net.Http.HttpClient($WebHandler)
**$HttpClient.DefaultRequestVersion = [System.Net.HttpVersion]::Version10**
$HttpClient.DefaultRequestHeaders.Add("Accept","*/*");
$HttpClient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
$HttpClient.DefaultRequestHeaders.Add("Connection","keep-alive");
$HttpClient.DefaultRequestHeaders.Add("Class",$ObjectClass);
$HttpClient.Timeout = New-Object System.TimeSpan(0, 0, 90);
$HttpJSONPayload = New-Object System.Net.Http.StringContent($JSONPayload.ToString(), [System.Text.Encoding]::UTF8, "application/json")
$HttpJSONPayload.Headers.ContentEncoding.Add("gzip")
$HttpJSONPayload.Headers.ContentEncoding.Add("deflate")
$HttpJSONPayload.Headers.ContentEncoding.Add("br")
$ResponsePayload = $HttpClient.PostAsync([Uri] $APIUrl,$HttpJSONPayload)
Я могу добавить параметры DefaultRequestHeader, но я считаю, что есть некоторая проблема с форматом DefaultRequestVersion.
Я не могу найти документацию в Интернете ни для того же.
Обновление: я использую Powershell версии 4.0, поэтому $HttpClient .DefaultRequestVersion = [System.Net.HttpVersion]::Version10 выдает следующую ошибку:
Свойство ‘DefaultRequestVersion’ не может быть найдено для этого объекта. Убедитесь, что свойство существует и может быть установлено.
Комментарии:
1. Что вы имеете в виду, что есть проблема? Что именно не работает? ЕСТЬ ли ошибка? (Если это так, пожалуйста, отправьте сообщение об ошибке)
2. При отправке Post-запроса возникает ошибка. Мой запрос заключается в том, как мне установить DefaultRequestVersion для объекта HttpClient в powershell.
Ответ №1:
DefaultRequestVersion
Свойство представляет собой не список, а одно HttpVersion
значение.
Для значения по умолчанию HTTP 1.0
назначьте его следующим образом:
$HttpClient.DefaultRequestVersion = [System.Net.HttpVersion]::Version10
Помните, что это DefaultRequestVersion
свойство было введено только в .NET Core 3.0, поэтому самой ранней версией PowerShell с этим свойством является PowerShell 7.0.0
Для PowerShell 4.0 вы можете немного изменить свой код, чтобы поддерживать переопределение HTTP-версии, вручную обработав запрос и вызвав SendAsync()
его напрямую (вместо PostAsync()
):
Возьмите эту строку:
$ResponsePayload = $HttpClient.PostAsync([Uri] $APIUrl,$HttpJSONPayload)
… и замените его на:
# Manually craft the request message and overwrite the version
$RequestPayload = New-Object System.Net.Http.HttpRequestMessage @([System.Net.Http.HttpMethod]::Post, [uri]$APIUrl)
$RequestPayload.Version = '1.0'
$RequestPayload.Content = $HttpJSONPayload
# Pass the crafted message directly to SendAsync()
$ResponsePayload = $HttpClient.SendAsync($RequestPayload)
Комментарии:
1. Получена следующая ошибка: свойство ‘DefaultRequestVersion’ не может быть найдено для этого объекта. Убедитесь, что свойство существует и может быть установлено.
2. @Aman Но
$HttpClient = New-Object System.Net.Http.HttpClient($WebHandler)
успешно? Это странно. Какую версию PowerShell вы используете3. Да, это тоже было моим утверждением. Я использую Powershell 4.0
4. @Aman, который объясняет,
DefaultRequestVersion
был представлен только в .NET Core 3.0, поэтому вам придется использовать PowerShell 7, чтобы воспользоваться преимуществами5. @Aman Пожалуйста, избегайте публикации более одной строки кода в комментариях, это невозможно правильно отформатировать. Вместо этого обновите исходное сообщение 🙂