早上好,
我正在使用PowerShell与VMWare vCloud API进行交互,并且在与vCloud断开连接后出现问题。
连接和使用API的过程如下:
所有通信均通过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通信。
我希望这是足够的信息,但如果需要更多信息,请告诉我。非常感谢任何帮助。
亲切的问候,拉塞尔
答案 0 :(得分:0)
$result = Invoke-WebRequest $adress -Method $Method
$result.BaseResponse.Close()