Не удается закрыть поток, пока не будут записаны все байты - PullRequest
2 голосов
/ 14 декабря 2010

Я отправляю запрос POST на сервер API, и я повторно использовал код, где я успешно делал это раньше на других серверах, и по какой-то причине, который я не могу понять, почему, он не работает.Я получаю сообщение об ошибке:

«Невозможно закрыть поток, пока не будут записаны все байты.»

, хотя я правильно объявил длину содержимого и не уверен, что мне здесь не хватает ...

            data = data + "</posts>"
            Dim postBytes As [Byte]() = Encoding.UTF8.GetBytes(data)
            Thread.Sleep(10000)
            track = data
            If uri.Scheme = uri.UriSchemeHttps Then
                Dim request As HttpWebRequest = HttpWebRequest.Create(url)
                request.Method = "POST"

'// обычно я просто использую request.contentlength = postbytes.length или data.length

                request.ContentLength = System.Text.Encoding.UTF8.GetByteCount(data)
                request.ContentType = "application/xml"
                request.KeepAlive = False
                request.Timeout = 120000
           request.Credentials = New  System.Net.NetworkCredential("xxxxxxxxxxxx",  "xxxxxxxxx")

                Using writer As New StreamWriter(request.GetRequestStream(), Encoding.UTF8)
                    writer.Write(postBytes)
                    writer.Flush()
                    writer.Close()
                End Using
                Using oResponse As HttpWebResponse = request.GetResponse()
                    Dim reader As New StreamReader(oResponse.GetResponseStream())
                    responseData = reader.ReadToEnd()
                    reader.Close()
                    oResponse.Close()
                End Using
                request.Abort()

            End If

        End If
    Catch e As WebException

....

Ответы [ 2 ]

12 голосов
/ 31 декабря 2011

Exception выбрасывается, потому что вы пишете меньше байтов, чем ожидает WebRequest.Например, если вы установили, скажем, 75 байтов в свойстве ContentLength, и вы написали 69 байтов в RequestStream и закрыли его, будет выдано исключение.

9 голосов
/ 22 декабря 2010
 Dim writer As Stream = request.GetRequestStream()
                writer.Write(postBytes, 0, postBytes.Length)
                writer.Close()

изменил мой код, как указано выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...