C#将XML发布到URL不起作用

时间:2009-09-02 15:32:41

标签: c# httpwebrequest webrequest

首先,我是一个WEB NOOB。这可能解释了这个问题。无论如何,当我使用web page test app将xml发布到网址时,一切正常。以下是网页上的相关代码(我认为):

<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”)的C#(WebRequest或HttpWebRequest)提交完全相同的XML时,使用缓冲区编码(ASCII或UTF8) )我得到一个错误,意味着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测试程序重现此错误。我认为这是第一个检查的元素,因此出现“INVALID XML VERSION”错误。我认为正在发生的事情是我的提交是以错误的格式提交的,并且该元素无法读取。我想具体来说,我必须模拟一个发布数据,其中我的数据来自“数据”表单字段(见上文)。我不知道如何使用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 个答案:

答案 0 :(得分:2)

是的,有一种更简单的方法可以使用System.Net进行表单提交... WebClient类是您的朋友。

在这种情况下,您将使用webClient :: UploadValues(),它将处理其他所有事情。

答案 1 :(得分:0)

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

StreamReader ResReader = new StreamReader(ResStream, true)

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

善,