问题描述
我正在寻找一种解析给定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