Сериализация XmlDocument и отправка через HTTPWebRequest - PullRequest
2 голосов
/ 09 июля 2009

Я пытаюсь выяснить, как правильно сериализовать мой XmlDocument и отправить его через объект HTTPWebRequest.

Вот что у меня есть:

Stream requestStream;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://wwwcie.ups.com/ups.app/xml/Track");
request.Method = "POST";

request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
requestStream = request.GetRequestStream();

XmlSerializerNamespaces xsm = new XmlSerializerNamespaces();
xsm.Add("", ""); // remove namespace
XmlSerializer ser = new XmlSerializer(xmlRequest.GetType());
ser.Serialize(requestStream, xmlRequest);

requestStream.Write(postData, 0, postData.Length);
requestStream.Close();

Несколько вещей, в которых я не уверен. У меня есть 2 XmlDocuments, которые мне нужно отправить в том же HTTPWebRequest. Ранее я пытался преобразовать XmlDocuments в строки и просто объединить их (для отправки строки), но когда я использовал StringBuilder / Writer, он добавляет:

  <?xml version="1.0" encoding="utf-8" ?> 
  <string xmlns="http://myNameSpace/">

У меня уже есть объявление в моих объектах XmlDocument, так что теперь оно там дважды, и у меня не может быть там части <string.... Проще ли конвертировать XmlDocuments в строки, затем объединять их и отправлять, или есть простой способ отправить XmlDocuments как есть?

Изменить:

См. C # XmlDocument Nodes Когда я пытаюсь преобразовать один из моих XmlDocuments в строку, он отображается как

  <?xml version="1.0" encoding="utf-8" ?> 
  <string xmlns="http://myNamespace/">
      <TrackRequest>
         <Request>
            <TransactionReference>
                <CustomerContext>whatever</CustomerContext>
            </TransactionReference>
         </Request>
         <TrackingNumber>123</TrackingNumber>
      </TrackRequest>
   </string> 

Я хочу, чтобы мой корень был <TrackRequest>

Ответы [ 3 ]

1 голос
/ 09 июля 2009

Работает (отчасти)! Спасибо, вот код:

Stream requestStream;
Stream responseStream;
WebResponse response;
StreamReader sr;
byte[] postData;
string postString;
postString = xmlAccess.OuterXml + xmlRequest.OuterXml;
postData = Encoding.UTF8.GetBytes(postString);

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://wwwcie.ups.com/ups.app/xml/Track");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
requestStream = request.GetRequestStream();

requestStream.Write(postData, 0, postData.Length);
requestStream.Close();

response = request.GetResponse();
responseStream = response.GetResponseStream();
sr = new StreamReader(responseStream);

return sr.ReadToEnd();

Это все еще не возвращает правильный XML, хотя:

<?xml version="1.0" encoding="utf-8" ?> 
  <string xmlns="http://namespace/"><?xml version="1.0" ?> <TrackResponse><Response><...

Не уверен, почему есть 2x <?xml version...

1 голос
/ 09 июля 2009

Я предполагаю, что этот вопрос относится к предыдущему вопросу о двух XML-документах, которые невозможно объединить в один документ без предварительной упаковки их обоих в корневой узел ( C # XmlDocument Nodes ).

Если это так, то вы не хотите сериализовать XmlDocuments и отправлять их в WebService. Сериализация объектов предназначена для транспортировки / хранения реального объекта, а не данных. Вы хотите просто отправить веб-сервису данные, а не объект, поэтому просто объедините два XML-документа и отправьте их.

use XmlDocument.OuterXml to get the XmlDocument as a string. ie:

XmlDocument doc1 = new XmlDocument();
doc.LoadXml("Some XML");
XmlDocument doc2 = new XmlDocument();
doc2.LoadXml("Some other XML");
StringBuilder sb = new StringBuilder();
sb.Append(doc1.OuterXml);
sb.Append(doc2.OuterXml);

Просто отправьте sb.ToString () в WebService.

Надеюсь, у меня не совсем неправильный конец палки.

0 голосов
/ 16 сентября 2009

Я делаю это сейчас с UPS, вместо того, чтобы создавать документы в XML, я просто использовал построители строк, например:

... в коде:

AddNode("name", "value");

... в классе:

private StringBuilder sb;
public void AddNode(string name, string value) 
{
    sb.Append("<" + name + ">" + value + "</" + name + ">");
}

Лично я считаю, что лучше, потому что это уменьшает нагрузку на сервер.

...