当使用PowerShell 'WebRequest'与SSL时,如何在断开连接后在客户端删除'会话'?

pbossiut  于 2023-10-18  发布在  Shell
关注(0)|答案(2)|浏览(141)

早上好,
我正在使用PowerShell与VMWare vCloud API进行交互,但在断开与vCloud的连接后遇到问题。
连接和使用API的过程如下:

  • 使用POST连接到vCloud
  • 执行必要的操作
  • 使用TCP断开连接(这将清除远程端点上的会话)

所有通信都通过HTTPS。
问题是,当这个过程在新的PowerShell控制台中第一次运行时,一切正常。但是,如果我想再次重复这个过程,我总是得到以下消息:

Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred     on a send.                            
At C:\tfs\poshvcloud\solutions\poshvcloud\functions\helpers\_Invoke- vCloudRequest.ps1:95 char:17                             
+     $response = Invoke-WebRequest @splat                                                                                   
+                 ~~~~~~~~~~~~~~~~~~~~~~~~                                                                                   
   + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException 
   + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

我曾使用Fiddler试图找出发生了什么,有趣的是,当显示上述错误时,我只看到“删除”操作,甚至没有尝试与vCloud通信。
事实上,我已经使用[System.Net.ServicePointManager]::FindServicePoint("https://vcloud.example.com/")检查了ServiceEndPoint,我得到了一个对象,它说我没有任何连接,但由于某种原因,当我再次尝试连接时,连接没有重新建立。这就好像PowerShell不再为SSL握手而烦恼了。

BindIPEndPointDelegate :                                                              
ConnectionLeaseTimeout : -1                                                           
Address                : https://vcloud.example.com/                
MaxIdleTime            : 100000                                                       
UseNagleAlgorithm      : True                                                         
ReceiveBufferSize      : -1                                                           
Expect100Continue      : False                                                        
IdleSince              : 18/07/2014 09:11:34                                          
ProtocolVersion        : 1.1                                                          
ConnectionName         : https                                                        
ConnectionLimit        : 2                                                            
CurrentConnections     : 0                                                            
Certificate            : System.Security.Cryptography.X509Certificates.X509Certificate
ClientCertificate      :                                                              
SupportsPipelining     : True

一件奇怪的事情是,如果我试图做另一个操作足够快,它确实通过了,但最终超时,我得到了错误。
我可以再次工作的唯一方法是关闭我当前的PowerShell控制台并启动一个新的控制台,然后加载所有必要的模块。
我尝试在Inovke-WebRequest上“DisableKeepAlive”,但这会导致API调用完全失败。然后我试着只在断开连接时这样做,但这也不起作用。
我在想我可能需要写我自己的版本WebRequest,但我仍然认为我必须把事情弄清楚,我不知道如何。如果可以的话,我宁愿坚持使用WebRequest。
我知道有来自VMWare的PowerCLI可以解决所有这些问题,但是这是一个巨大的模块,只有一小部分适用于vCloud。事实上,我开始使用它,但由于一些不一致和很大的依赖性,我已经创建了自己的vCloud模块,直接与vCloud REST API对话。
我希望这是足够的信息,但如果需要更多,请让我知道。任何帮助都非常感谢。
亲切的问候,罗素

laik7k3q

laik7k3q1#

$result = Invoke-WebRequest $adress -Method $Method 
$result.BaseResponse.Close()
rxztt3cl

rxztt3cl2#

我使用来自Lavandil's solution的信息如下:

If ($HTTP_Request -eq $null) { } 
Else { $HTTP_Request.BaseResponse.Close() }

相关问题