¿Puedo reutilizar HttpWebRequest sin desconectarme del servidor?

Estoy intentando depurar un problema específico con mi aplicación ASP.NET . El cliente ejecuta el siguiente código:

void uploadFile( string serverUrl, string filePath ) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest. Create( serverUrl ); CredentialCache cache = new CredentialCache(); cache.Add( new Uri( serverUrl ), "Basic", new NetworkCredential( "User", "pass" ) ); request.Credentials = cache; request.Method = "POST"; request.ContentType = "application/octet-stream"; request.Timeout = 60000; request.KeepAlive = true; using( BinaryReader reader = new BinaryReader( File.OpenRead( filePath ) ) ) { request.ContentLength = reader.BaseStream.Length; using( Stream stream = request.GetRequestStream() ) { byte[] buffer = new byte[1024]; while( true ) { int bytesRead = reader.Read( buffer, 0, buffer.Length ); if( bytesRead == 0 ) { break; } stream.Write( buffer, 0, bytesRead ); } } } HttpWebResponse result = (HttpWebResponse)request.GetResponse(); //handle result - not relevant } 

y Write() lanza una excepción con “No se pueden escribir datos en la conexión de transporte: el software de la máquina host anuló una conexión establecida”. texto. Utilicé el rastreo de System.Net y descubrí que algo va mal cuando envío la solicitud con el conjunto de Content-Length .

Específicamente, si omito todo lo que está dentro del using statement en el código anterior, el servidor responde rápidamente con WWW-Authenticate y luego el cliente vuelve a publicar la solicitud con WWW-Authenticate y todo va bien, excepto que el archivo no se ha cargado y la solicitud falla mucho más tarde.

Me gustaría hacer lo siguiente: enviar una solicitud sin datos, esperar a WWW-Authenticate , luego repetirla con WWW-Authenticate y data. Así que intenté modificar el código anterior: primero establezca todos los parámetros, luego llame a GetResponse() , luego envíe, pero cuando trato de establecer la propiedad ContentLength produce una excepción con “Esta propiedad no se puede configurar después de que se haya iniciado la escritura” text .

Entonces, HttpWebRequest parece no ser reutilizable.

¿Cómo lo reutilizo para reenviar la solicitud sin cerrar la conexión?

No reutiliza una solicitud, como sugiere su nombre, es una solicitud. Sin embargo, si emite varias solicitudes para el mismo host, .NET reutilizará la conexión de red subyacente de forma predeterminada.

Tenga en cuenta que debe deshacerse de WebResponse devuelto por request.GetResponse : de lo contrario, la infraestructura subyacente no sabrá que realmente ha terminado con ella y no podrá reutilizar la conexión.

(Como File.OpenRead margen, ¿por qué utiliza BinaryReader ? Simplemente use la secuencia que devuelve File.OpenRead directamente).

Además de la respuesta de Jon Skeet, no es necesario configurar manualmente la propiedad ContentLength. HttpWebRequest calculará automáticamente y completará esa propiedad.