When I close my web service client (by calling .Close( ) ) it does not close the underlying socket connection on the server, but leaves it in a TIME_WAIT state:
TCP [::1]:64844 [::1]:65119 TIME_WAIT 0
This is not a bug, it is by design. Under normal conditions, this is not a problem. But when the application is scaled up, we begin to experience problems because new connections are not being released fast enough to accommodate the new web service method calls.
My research has indicated that the minimum time setting "clean up" old socket connections is 30 seconds.
We've also doubled the number of available connections.
For now the doubling of the connections seems to be alleviating the problem.
We understand that the web service seems to not be able close the connection manually.
My question is - how might we close the connection manually?
I know that the reason the connection will not close sooner than it does is because it is waiting for any packets that may arrive out of order. And, the OS wants to ensure that a packet intended for a connection that is closed does not get processed by a connection that is still open.
That works for the OS, but it does not work for our needs. We are writing the code so we know when the work is done and the connection can be closed. If we could reduce the amount of time below 30 seconds - say down to 5 seconds - that might be an okay alternative.
I want to explore this as an option.