Как нам добавить DefaultRequestVersion к объекту HttpClient в Powershell?

#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 Пожалуйста, избегайте публикации более одной строки кода в комментариях, это невозможно правильно отформатировать. Вместо этого обновите исходное сообщение 🙂