代码之家  ›  专栏  ›  技术社区  ›  johnnycrash

C将XML发布到URL不起作用

  •  0
  • johnnycrash  · 技术社区  · 15 年前

    首先,我是一个网络笨蛋。这可能解释了这个问题。不管怎样,当我使用 web page test app 要将XML发布到URL,一切工作正常。这是来自网页的有针对性的代码(我想):

    <form action="/gateway/xml" method="post" id="xml-test-form">
      <textarea name="data">
    
      {some xml is in here}
    
      </textarea>
      <input type="submit" value="Submit Test" />
    </form>
    

    当我尝试使用内容类型为(“text/xml”或“application/x-www-form-urlencoded”)且缓冲区编码为(ascii或utf8)的C(webrequest或httpwebrequest)提交完全相同的XML时,我会得到一个错误,这意味着XML在另一端根本无法读取。错误如下:

    <?xml version="1.0"?>
    <SubmitOrdersResponse>
      <status code="0">FAILURE</status>
      <errors>
        <error code="1001">Invalid XML Version</error>
      </errors>
    </SubmitOrdersResponse>
    <br /><b>Warning</b>:  DOMDocument::loadXML() [<a href='domdocument.loadxml'>domdocument.loadxml</a>]: Empty string supplied as input in <b>/var/www/vhosts/reports.gogetagrip.com/httpdocs/application/models/Gateway.php</b> on line <b>90</b><br />
    

    我可以通过删除名为的XML元素,使用Web测试仪重现此错误。我认为这是第一个被检查的元素,因此是“无效的XML版本”错误。我认为我提交的文件格式错误,无法读取。我特别认为我必须模拟一个发布数据,其中我的数据是从“数据”表单字段混合的(见上文)。我不知道如何使用WebRequest类设置它,所以我无法测试它。这是我的代码:

    static private void Post(string sURL, string sXml) {
      try {
        //Our postvars
        byte[] buffer = Encoding.UTF8.GetBytes(sXml);  // Tried ASCII...same result
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(sURL);  // Tried WebRequest ... same result
        WebReq.Method = "POST";
        WebReq.ContentType = "application/x-www-form-urlencoded";  // tried "text/xml"... same result
        WebReq.ContentLength = buffer.Length;
        Stream ReqStream = WebReq.GetRequestStream();
        ReqStream.Write(buffer, 0, buffer.Length);
        ReqStream.Close();
        WebResponse WebRes = WebReq.GetResponse();
        //Console.WriteLine(WebResp.StatusCode);
        //Console.WriteLine(WebResp.Server);
        Stream ResStream = WebRes.GetResponseStream();
        StreamReader ResReader = new StreamReader(ResStream);
        string sResponse = ResReader.ReadToEnd();
      } catch (Exception ex) {
    
      } finally {
    
      }
    }
    

    有什么想法吗?你说什么?你说什么?

    2 回复  |  直到 14 年前
        1
  •  2
  •   feroze    15 年前

    是的,使用System.NET提交表单有一种更简单的方法…WebClient类是您的朋友。

    在这种情况下,您将使用webclient::uploadValues(),它将处理所有其他问题。

        2
  •  0
  •   Daniel Elliott    15 年前

    尝试将true添加到StreamReader初始化中。

    StreamReader ResReader = new StreamReader(ResStream, true)
    

    然后它将检测字节顺序标记。

    仁慈,