0

我正在寻找一种解决方案来解析给定 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"
}
4

1 回答 1

0

最后我通过切换到 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
于 2020-10-30T15:40:14.443 回答