Uploading a file using HttpWebRequest requires to call GetRequestStream() and then Write() to the returned stream.
If there was a valuable delay between GetRequestStream() and actual writing to this stream a server may respond with "400: Bad request" error (on server's timeout) and then close connection (without waiting for the rest of data) .
This leads to IOException on requestStream.Write() with the following message: "Unable to write data to the transport connection: An established connection was aborted by the software in your host machine."
This message is not informative for a client, and it looks like there's something on a client's side closed the connection, while it was a server who sent TCP FIN packet.
At this point it's impossible to get server's response and understand the real reason of error.
Working example for repro is attached (MS visible only)
Network capture is attached