Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do we add DefaultRequestVersion on an HttpClient object in Powershell?

I have been trying a way to add the Http Version as 1.0 in Powershell to my HttpClient Object.

  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)

I am able to add the DefaultRequestHeader Parameters but I believe there is some issue with the format for DefaultRequestVersion.

I am unable to find documentation online either for the same.

Update: I am using Powershell V4.0 so $HttpClient.DefaultRequestVersion = [System.Net.HttpVersion]::Version10 is giving the following error:

The property 'DefaultRequestVersion' cannot be found on this object. Verify that the property exists and can be set.

like image 594
Aman Avatar asked May 16 '26 17:05

Aman


1 Answers

The DefaultRequestVersion property is not a list, but a single HttpVersion value.

To default to HTTP 1.0, assign it like this:

$HttpClient.DefaultRequestVersion = [System.Net.HttpVersion]::Version10

Beware that the DefaultRequestVersion property was only introduced in .NET Core 3.0, so the earliest version of PowerShell with this property exposed is PowerShell 7.0.0


For PowerShell 4.0, you can change your code slightly to support overriding the HTTP Version by manually crafting the request and calling SendAsync() directly (instead of PostAsync()):

Take this line:

$ResponsePayload = $HttpClient.PostAsync([Uri] $APIUrl,$HttpJSONPayload)

... and replace it with:

# 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)
like image 72
Mathias R. Jessen Avatar answered May 19 '26 09:05

Mathias R. Jessen