I've found the source of the problem. The problem lies within the "Connection Timeout" property of the Website. My testing server sets that property to 120 seconds. Which means I only got 2 minutes to send a request for a web service, execute the requested method, and retrieve the response from the web server. Since the average time of execution for the web methods is 4 minutes, the HTTP connection is closed by the server before the client retrieve the response. Hence I got the "Underlying Connection was Closed" WebException.
It looks like setting the Timeout property of each web service objects in the client to -1 isn't doing anything to prevent the web server from closing the HTTP connection.
I believe this has something to do with persistent connection and what-not. I've tried a few trick to disable persistent connection from the client side but it's not working. In the end the best fix was setting a higher "Connection Timeout" property in the IIS. I set it to 900 seconds (15 minutes).
Any comments? I was wondering what are the effects of increasing the "Connection Timeout" property. That and I'm still looking for a better solution. Anyone have a better idea?