早上好,
我正在使用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对话。
我希望这是足够的信息,但如果需要更多,请让我知道。任何帮助都非常感谢。
亲切的问候,罗素
2条答案
按热度按时间laik7k3q1#
rxztt3cl2#
我使用来自Lavandil's solution的信息如下: