Вопрос по winforms, httpwebresponse, httpwebrequest, c#, byte – Ошибка (HttpWebRequest): количество байтов, записываемых в поток, превышает указанный размер байтов Content-Length

9

Я не могу понять, почему я продолжаю получать следующую ошибку:

Bytes to be written to the stream exceed the Content-Length bytes size specified.

в следующей строке:

writeStream.Write(bytes, 0, bytes.Length);

Это в проекте Windows Forms. Если кто-нибудь знает, что здесь происходит, я непременно должен вам.

    private void Post()
    {


        HttpWebRequest request = null;
        Uri uri = new Uri("xxxxx");
        request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        XmlDocument doc = new XmlDocument();
        doc.Load("XMLFile1.xml");
        request.ContentLength = doc.InnerXml.Length;
        using (Stream writeStream = request.GetRequestStream())
        {
            UTF8Encoding encoding = new UTF8Encoding();
            byte[] bytes = encoding.GetBytes(doc.InnerXml);
            writeStream.Write(bytes, 0, bytes.Length);
        }
        string result = string.Empty;

        request.ProtocolVersion = System.Net.HttpVersion.Version11;
        request.KeepAlive = false;
        try
        {
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (System.IO.StreamReader readStream = new System.IO.StreamReader(responseStream, Encoding.UTF8))
                    {
                        result = readStream.ReadToEnd();
                    }
                }
            }
        }
        catch (Exception exp)
        {
            // MessageBox.Show(exp.Message);
        }
    }

Ваш Ответ

2   ответа
7

чем некоторые символы вКодировка UTF8 занимать 2 или 3 байта для одного символа.

Измените свой код следующим образом:

    using (Stream writeStream = request.GetRequestStream())
    {
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] bytes = encoding.GetBytes(doc.InnerXml);
        request.ContentLength = bytes.Length;
        writeStream.Write(bytes, 0, bytes.Length);
    }

Чтобы точно показать, что происходит, попробуйте это вLINQPad:

var s = "é";
s.Length.Dump("string length");
Encoding.UTF8.GetBytes(s).Length.Dump("array length");

Это выведет:

 string length: 1 
 array length:  2 

и теперь используйтеe без апострофа

var s = "e";
s.Length.Dump("string length");
Encoding.UTF8.GetBytes(s).Length.Dump("array length");

который выведет:

string length: 1 
array length:  1 

Помните: длина строки и количество байтов, необходимых для конкретной кодировки, могут отличаться.

11

Исправьте ContentLength, как описано вответ от @rene

Не устанавливайте ContentLength, HttpWebRequest буферизует данные и автоматически устанавливает ContentLength

Установите для свойства SendChunked значение true и не устанавливайте ContentLength. Запрос отправляется чанком, закодированным на веб-сервер. (необходим HTTP 1.1 и должен поддерживаться веб-сервером)

Код:

...
request.SendChunked = true;
using (Stream writeStream = request.GetRequestStream())
{ ... }
Не задание длины контента помогло мне решить эту проблему. Прочь к следующему! благодарю вас. Vigs
Второй способ работы для меня! Благодарю. alireza

Похожие вопросы