通常,使用WebRequest编写类似这样的代码来下载一些数据.
using(WebResponse resp = request.GetResponse()) // WebRequest request...
using(Stream str = resp.GetResponseStream())
; // do something with the stream str
Run Code Online (Sandbox Code Playgroud)
现在,如果抛出WebException,WebException会引用WebResponse对象,该对象可能会或可能不会调用Dispose(取决于发生异常的位置,或者响应类的实现方式) - 我不知道.
我的问题是如何处理这个问题.是否应该编写一个非常防御性的编码,并在WebException对象中处理响应(这有点奇怪,因为WebException不是IDisposable).或者是否应该忽略这一点,可能访问已处置的对象或从不处置IDisposable对象?WebException.Response的MSDN文档中给出的示例完全不合适.
当我抓到.NET时WebException,我应该关闭/处理Response.GetResponseStream()?
在MSDN示例不会关闭或异常处理任何事情.
我处理了流,这引起了很大的问题.因为GetResponseStream()(总是?/有时?)返回相同的实例.因此,当我获得响应流然后处理它时,可能会将异常重新抛出到另一个层,该层也会获得响应流,它将被处理掉并且不可读并因此而抛出更多异常.
所以我通过powershell调用一个休息Web服务,如果你试图发布已经处理过的数据,它会响应一个400状态代码,以及状态代码它还会返回一个JSON响应:
{
"statusCode": 400,
"errorCode": "REQUEST_VALIDATION_ERROR",
"message": "validation failed",
"developerMessage": " MessageId-xxx already processed. No Need to process again."
}
Run Code Online (Sandbox Code Playgroud)
所以我尝试用一些powershell调用它并接收400状态代码并使用try/catch来处理这个以获取异常,但是响应中没有内容,我可以获得响应头,状态代码,状态消息等,但是我根本找不到访问JSON响应的方法,这里是我正在使用的powershell代码的格式:
$url = "https://example.com/webservice/status"
$cert = Get-ChildItem Cert:\CurrentUser\My\certthumbprintxxxxx
$headers = @{"tokenId" = "tokenxxxxx"}
$body =
@"
{
...
JSON data...
...
}
"@
try
{
$response = Invoke-WebRequest $url -Certificate $cert -Headers $headers -Method Post -Body $body
}
catch
{
$_.Exception.response
}
Run Code Online (Sandbox Code Playgroud)
当我发送$_.Exception.response给Get-Member时,我可以看到没有内容属性.如何使用PowerShell访问响应中的消息?