序列化XmlDocument&通过HTTPWebRequest发送

时间:2009-07-09 16:52:37

标签: c# .net httpwebrequest xmldocument

我正在试图弄清楚如何正确序列化我的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();

我不确定的一些事情。我需要在同一个HTTPWebRequest中发送2个XmlDocuments。我之前尝试过将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> 

我希望我的root是<TrackRequest>

3 个答案:

答案 0 :(得分:1)

我猜这个问题与前一个问题有关,关于2 xml文档无法合并到一个文档中而不将它们首先包装在根节点中(C# XmlDocument Nodes)。

如果是这种情况,那么您不希望序列化XmlDocuments并将它们发送到WebService。序列化对象用于传输/存储实际对象,而不是数据。您只想向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。

希望我没有完全错误的结束。

答案 1 :(得分:1)

工作(有点)!谢谢,继承人代码:

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...

答案 2 :(得分:-2)

我现在正在使用UPS,而不是用XML构建文档,我只是使用字符串构建器:

...代码:

AddNode("name", "value");

......在课堂上:

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

我个人认为它更好,因为它减少了服务器负载。