Escribir length en StreamWriter

publicado por: Anonymous

Buenos días. Estoy intentando mediante WebRequest enviar un json mediante el método PUT.
Al llegar a httpWebRequest.GetResponse() me da error.

Debe escribir ContentLength bytes en el flujo de la solicitud antes de llamar a [Begin]GetResponse.

Al escribir en el StreamWriter la propiedad length como en la de posotion me da una excepción.

‘(writer.BaseStream).length’ produjo una excepción de tipo ‘System.NotSupportedException’
‘(writer.BaseStream).position’ produjo una excepción de tipo ‘System.NotSupportedException’

Como podría rellenar el length y el position.

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(apiUrl);
httpWebRequest.ContentType = metodo.ContentType;

httpWebRequest.Method = WebRequestMethods.Http.Put;
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
string jsonData = jsSerializer.Serialize(datosPUT);
byte[] arrData = Encoding.UTF8.GetBytes(jsonData);

httpWebRequest.ContentLength = arrData.Length;
httpWebRequest.Expect = "application/json";

StreamWriter writer = new StreamWriter(httpWebRequest.GetRequestStream());
writer.Write(arrData);
writer.Close()
var response = (HttpWebResponse)httpWebRequest.GetResponse(); //AQUÍ EL ERROR

solución

Por el error que te da tiene pinta que no esta terminando de hacer flush en el stream antes de llamar al GetResponse, prueba a escribir el código de esta manera:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(apiUrl);
httpWebRequest.ContentType = metodo.ContentType;

httpWebRequest.Method = WebRequestMethods.Http.Put;
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
string jsonData = jsSerializer.Serialize(datosPUT);
byte[] arrData = Encoding.UTF8.GetBytes(jsonData);

httpWebRequest.ContentLength = arrData.Length;
httpWebRequest.Expect = "application/json";
using (var dataStream = httpWebRequest.GetRequestStream())
{
   dataStream.Write(arrData, 0, arrData.Length);
}
var response = (HttpWebResponse)httpWebRequest.GetResponse();

Usando using te aseguras que el stream se cierra correctamente.

Pregunta similar en la versión inglesa

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *