Optimización de memoria para un httpwebrequest post o PUT de gran tamaño basado en .NET framework 4.5

Este artículo le ayuda a resolver el problema que se produce al usar la clase para enviar muchos datos para una HttpWebRequest solicitud HTTP POST o PUT.

Versión del producto original:   .NET Framework 4.5
Número KB original:   2855735

Síntomas

Cuando se usa la clase para enviar muchos datos para una solicitud HTTP POST o PUT, es posible que la solicitud falle en un equipo que ejecuta microsoft HttpWebRequest .NET Framework. Además, puede recibir una excepción de memoria fuera de la memoria.

Es posible que observe que la aplicación que usa la HttpWebRequest clase consume muchas memorias. Al usar el Monitor de rendimiento para supervisar la aplicación que usa la clase, el recuento de bytes privados seguirá aumentando a medida que HttpWebRequest se envíen los datos.

Causa

Este problema se produce porque el .NET Framework almacena en búfer los datos salientes de forma predeterminada cuando se usa la HttpWebRequest clase. Se produce un error en una solicitud POST o PUT cuando se usa la clase HttpWebRequest para enviar muchos documentos de datos al problema original.

Solución

Para evitar este problema, establezca la HttpWebRequest.AllowWriteStreamBuffering propiedad en false. Al hacerlo, los datos salientes (cuerpo de la entidad) de la solicitud POST o PUT no se almacenarán en búfer en la memoria.

En versiones de .NET Framework anterior a la 4.5, establecer la propiedad en false a veces provocaría errores al cargar datos en puntos de conexión HttpWebRequest.AllowWriteStreamBuffering autenticados. Por ejemplo, es posible que encuentre un con el mensaje Esta solicitud requiere almacenar System.Net.WebException en búfer los datos para que se puedan realizar correctamente. Sin embargo, en una investigación más profunda, la respuesta asociada con la excepción indica realmente un código de estado System.Net.HttpStatusCode.Unauthorized de (401). Se produce un error en una solicitud POST o PUT cuando se usa la clase HttpWebRequest para enviar una gran cantidad de documentos de datos a una solución alternativa de autenticación previa y conexión KeepAlive para controlar la respuesta 401.

A .NET Framework 1.1, 2.0, 3.0, 3.5 y 4.0, .NET Framework 4.5 agrega nueva funcionalidad de diseño para la HttpWebRequest.AllowWriteStreamBuffering propiedad. La nueva funcionalidad puede controlar el escenario de autenticación directamente siempre que Expect100Continue la característica esté habilitada. El valor ServicePointManager.Expect100Continue predeterminado es true.

Más información