Cannot close stream until all bytes are written (GoodData API)

Do not set request.ContentLength = byteArray.Length; before writing the request stream. The request.ContentLength is set automatically.


For me it was going wrong with a special character (é) in a Json request. For some reason I had to set the ContentLength manually.

Thanks to the tip on this page I changed my code to the following and for me it works now.

Old version:

string content = "{ test: \"olé\" }";

_Request.ContentLength  = content.Length;

using ( var writer = new StreamWriter(_Request.GetRequestStream()) ) 
    writer.Write( content );

New version:

string content = "{ test: \"olé\" }";

byte[] bytes            = Encoding.UTF8.GetBytes(content);
_Request.ContentLength  = bytes.Length;

using ( var writer = _Request.GetRequestStream() )
    writer.Write(bytes, 0, bytes.Length);

Having looked over the docs - System.IO.StreamWriter.Write() - There does not appear to be a method for writing bytes.

The only method that matches the signature is - StreamWriter.Write(Object). This however calls ToString() on the object and writes the output; Which is not what you want.

As you are setting an output buffer; the stream is waiting for this buffer to be filled. However, the Object.ToString() will likely not fill this buffer and hence the error.

Use BinaryWriter, BufferedStream or another that supports byte[] writing.