Estou usando o Powershell para extrair dados do Exchange via API EWS.
Import-Module "C:\ews_api\Microsoft.Exchange.WebServices.dll"
$ExchangeServer = 'EXCHANGE'
$ExchangeService = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_SP1)
$ExchangeService.Url = "https://$ExchangeServer/ews/exchange.asmx"
$SearchRootFolder = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar)
$SearchFolderView = New-Object Microsoft.Exchange.WebServices.Data.FolderView([int]::MaxValue)
$SearchResult = $ExchangeService.FindFolders($SearchRootFolder, $SearchFolderView)
A execução da última linha de código causará uma conexão HTTP com o servidor Exchange, que será deixado no estado TCP TIME_WAIT
por 2 minutos com as configurações padrão do Windows. Atingir o servidor Exchange com muitas consultas resultará na TIME_WAIT
existência de muitas sessões ao mesmo tempo.
Get-NetTCPConnection | Group-Object State
Count Name
----- ----
28 Listen
10 Bound
5 Established
6 CloseWait
189 TimeWait
Parece haver um limite em torno de 190 TIME_WAIT
sessões no Windows, porque em torno dessa marca estou recebendo o seguinte erro no Powershell.
Microsoft.Exchange.WebServices.Data.ServiceRequestException: The request failed. Unable to connect to the remote server
---> System.Net.WebException: Unable to connect to the remote server
---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted 10.50.222.87:443
Achei que o Windows poderia alocar muito mais portas efêmeras do que para sessões TCP. E, de fato, ao usar outro exemplo de código Powershell, não tenho problemas.
$connections = @()
for ($i = 0; $i -lt 1000; $i++) {
$connections += [System.Net.Sockets.TcpClient]::new($ExchangeServer, 443)
}
Mil conexões são abertas sem problemas. No entanto, eles estão no estado TCP ESTABLISHED
e não no estado TIME_WAIT
. Por que estou enfrentando esse problema apenas em TIME_WAIT
estados de sessão e existe uma maneira de aumentar esse limite?
Get-NetTCPConnection | Group-Object State
Count Name
----- ----
28 Listen
1010 Bound
1003 Established
8 CloseWait