当使用带有SSL的PowerShell“Invoke-WebRequest”时,如何在断开连接后在客户端删除“会话”?

时间:2014-07-18 08:19:43

标签: powershell ssl

早上好,

我正在使用PowerShell与VMWare vCloud API进行交互,并且在与vCloud断开连接后出现问题。

连接和使用API​​的过程如下:

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

所有通信均通过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试图找出发生了什么,有趣的是我只看到'CONNECT'操作,并且在显示上述错误时甚至没有尝试与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调用完全失败。然后我尝试在断开连接上进行此操作,但这也不起作用。

我在想我可能需要编写我自己的版本Invoke-WebRequest,但我仍然认为我必须要清理一些东西而且我不确定如何。如果可以的话,我宁愿坚持使用Invoke-WebRequest。

我知道有来自VMWare的PowerCLI负责所有这些,但这是一个庞大的模块,只有一小部分适用于vCloud。事实上我开始使用它,但是由于一些不一致和很大的依赖性,我创建了自己的vCloud模块,直接与vCloud REST API通信。

我希望这是足够的信息,但如果需要更多信息,请告诉我。非常感谢任何帮助。

亲切的问候,拉塞尔

1 个答案:

答案 0 :(得分:0)

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