Почему у меня заканчиваются байты для потока при выполнении HTTP POST? - PullRequest
1 голос
/ 19 ноября 2009

Это сводит меня с ума:

    WebRequest request = WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = Encoding.UTF8.GetByteCount(data);
    Stream reqs = request.GetRequestStream();
    StreamWriter stOut = new StreamWriter(reqs, Encoding.UTF8);
    stOut.Write(data);
    stOut.Flush();

Я получил исключение, что у меня закончились байты в потоке ... но я использовал ту же кодировку для подсчета байтов!

При использовании ASCII это не дает сбоя. Это из-за спецификации UTF-8, которую Windows любит добавлять?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2009

Это, вероятно, спецификация; попробуйте использовать явное кодирование без спецификации:

Encoding enc = new UTF8Encoding(false);
...
request.ContentLength = enc.GetByteCount(data);
...
StreamWriter stOut = new StreamWriter(reqs, enc);

Еще проще; вместо этого переключитесь на WebClient и попытайтесь справиться со всем этим самостоятельно; заполнить форму очень просто:

    using (var client = new WebClient())
    {
        var data = new NameValueCollection();
        data["foo"] = "123";
        data["bar"] = "456";
        byte[] resp = client.UploadValues(address, data);
    }

Или с кодом отсюда :

  byte[] resp = client.Post(address, new {foo = 123, bar = 546});
1 голос
/ 19 ноября 2009

Не забудьте на самом деле URL-кодировать данные, как вы обещали в ContentType. Это однострочник:

byte[] bytes = System.Web.HttpUtility.UrlEncodeToBytes(data, Encoding.UTF8);
1 голос
/ 19 ноября 2009

Вы также можете попробовать что-то вроде этого:

byte[] bytes = Encoding.UTF8.GetBytes(data);

request.ContentLength = bytes.Length;
request.GetRequestStream().Write(bytes, 0, bytes.Length);
...