2013-09-03 1 views
1

Ошибка: Вы должны написать байты 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()) 
+0

Возможно, это помогает: http://forums.asp.net/t/1956377.aspx?How+to+fix+this+error+You+must+write+ContentLength+bytes+to+the+request+stream + before + call + Begin + GetResponse – xameeramir

ответ

1

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

1

Короче: 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()); 
    } 
    } 
} 
+0

+1, вы были быстрее, чем я. – tcarvin

+0

Пробовал выше и теперь получить Этот поток не поддерживает операции поиска. – user2516387

+0

Затем просто используйте посредника MemoryStream. – nmaier