Вы должны записать байты ContentLength в поток запроса перед вызовом [Begin]GetResponse

Ошибка: вы должны записать байты ContentLength в поток запроса перед вызовом [Begin]GetResponse.

Может ли кто-нибудь посоветовать, почему я получаю указанную выше ошибку при запуске следующего кода

        Dim xml As New System.Xml.XmlDocument()

        Dim root As XmlElement
        root = xml.CreateElement("root")
        xml.AppendChild(root)

        Dim username As XmlElement
        username = xml.CreateElement("UserName")
        username.InnerText = "xxxxx"
        root.AppendChild(username)

        Dim password As XmlElement
        password = xml.CreateElement("Password")
        password.InnerText = "xxxx"
        root.AppendChild(password)

        Dim shipmenttype As XmlElement
        shipmenttype = xml.CreateElement("ShipmentType")
        shipmenttype.InnerText = "DELIVERY"
        root.AppendChild(shipmenttype)


        Dim url = "xxxxxx"
        Dim req As WebRequest = WebRequest.Create(url)
        req.Method = "POST"
        req.ContentType = "application/xml"
        req.Headers.Add("Custom: API_Method")
        req.ContentLength = xml.InnerXml.Length

        Dim newStream As Stream = req.GetRequestStream()
        xml.Save(newStream)

        Dim response As WebResponse = req.GetResponse()


        Console.Write(response.ToString())

person user2516387    schedule 03.09.2013    source источник
comment
возможно, это поможет: forums.asp.net/t/   -  person Zameer Ansari    schedule 07.05.2014


Ответы (3)


Вероятно, несоответствие длины между длиной символа xml.InnerXml и тем, что фактически записывается в поток в xml.Save(newStream). Например, проверьте, включает ли InnerXml узел версии xml. Кроме того, я не вижу, чтобы вы указывали кодировку символов, которая определенно влияет на размер провода. Возможно, вам нужно сохранить во временный поток памяти, получить его длину, а затем отправить в запросе.

person tcarvin    schedule 03.09.2013

Короче: newStream.Length != xml.InnerXml.Length.

  • Прежде всего, XmlDocument.Save(Stream) будет кодировать ответ, что может привести к тому, что количество байтов будет отличаться от количества символов в строке .InnerXml.
  • .InnerXML не обязательно содержит другие элементы, например преамбулу XML.

Вот полный пример. (Извините, мой VB немного заржавел, поэтому вместо этого C#):

using System;
using System.IO;
using System.Net;
using System.Xml;

namespace xmlreq
{
  class Program
  {
    static void Main(string[] args)
    {
      var xml = new XmlDocument();
      var root = xml.CreateElement("root");
      xml.AppendChild(root);

      var req = WebRequest.Create("http://stackoverflow.com/");
      req.Method = "POST";
      req.ContentType = "application/xml";

      using (var ms = new MemoryStream()) {
        xml.Save(ms);
        req.ContentLength = ms.Length;
        ms.WriteTo(req.GetRequestStream());
      }
      Console.WriteLine(req.GetResponse().Headers.ToString());
    }
  }
}
person nmaier    schedule 03.09.2013
comment
Пробовал вышеописанное и теперь получаю Этот поток не поддерживает операции поиска. - person user2516387; 04.09.2013
comment
Затем просто используйте посредника MemoryStream. - person nmaier; 04.09.2013
comment
Извините за невежество, но что вы имеете в виду под использованием MemoryStream? - person user2516387; 04.09.2013
comment
В мой ответ добавлен образец (на С#: p). - person nmaier; 04.09.2013
comment
Спасибо за пример кода. Теперь появляется эта ошибка ‹свойство не может быть установлено после начала записи› в строке req.ContentLength = ms.Length. - person user2516387; 04.09.2013
comment
Ошибка говорит сама за себя... Я бы предположил: переместите GetRequestStream ниже назначения ContentLength. - person nmaier; 04.09.2013
comment
Должно быть что-то связанное с веб-службой, к которой я пытаюсь добраться. Ваш код работает нормально, но когда я заменяю URL-адрес на тот, к которому нам нужно получить доступ, я получаю исходную ошибку. Не уверен, почему. - person user2516387; 04.09.2013
comment
Сортировка . проблема с веб-сервисом. Единственная проблема сейчас состоит в том, чтобы получить результаты потока памяти в файл xml. - person user2516387; 04.09.2013

У меня была эта ошибка сегодня, и проблема заключалась в том, что провайдер конечной точки годами перенаправлял http-запросы на https, но изменил свою политику. Поэтому обновление моего кода из

request = WebRequest.Create("http://api.myfaxservice.net/fax.php") 

to

request = WebRequest.Create("https://api.myfaxservice.net/fax.php")

сделали свое дело. Если бы провайдер просто отключил http, я думаю, было бы проще решить проблему, поскольку эта ошибка уводила меня по ложному следу.

person TonyE    schedule 18.10.2018