Powershell-如何从Web请求的错误响应中接收大响应头?

问题描述

我正在寻找一种解析给定Web服务的错误响应的解决方案。 下面的示例通常效果很好,但是如果响应大于64kb,则完全没有例外。

我已经看到一些建议使用webHttpClient并在此处增加MaxResponseContentBufferSize的解决方案,但是如何为给定的WebClient对象执行此操作? 是否可以选择为所有网络调用全局更改BufferSize,例如TLS12设置以下的内容

这是我的示例代码

# using net-webclient to use individual user-side proxy-settings:
$web = new-object Net.WebClient
[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$url = "address to web-service"
try {
    $response = $web.DownloadString($url)
} catch [System.Net.WebException] {

    # this part needs to work even if the error-response in larger than 64kb
    # unfortunately the response-object is empty in such case

    $message = $_.Exception.Response
    $stream = $message.GetResponseStream()
    $reader = new-object System.IO.StreamReader ($stream)
    $body = $reader.ReadToEnd()
    write-host "#error:$body"
}

解决方法

我最后通过切换到system.net.httpclient解决了它。 这样,我仍然尊重任何自定义代理设置,并且在任何错误响应中都避免了上述64kb限制。这里有一个示例如何使用它:

$url  = "address to web-service"
$cred = Get-Credential

# define settings for the http-client:
Add-Type -AssemblyName System.Net.Http
$ignoreCerts = [System.Net.Http.HttpClientHandler]::DangerousAcceptAnyServerCertificateValidator
$handler = [System.Net.Http.HttpClientHandler]::new()
$handler.ServerCertificateCustomValidationCallback = $ignoreCerts
$handler.Credentials = $cred
$handler.PreAuthenticate = $true

$client = [System.Net.Http.HttpClient]::new($handler)
$client.Timeout = [System.TimeSpan]::FromSeconds(10)

$result = $client.GetAsync($url).result
$response = $result.Content.ReadAsStringAsync().Result
write-host $response