表单提交错误:prolog中不允许使用内容

时间:2018-03-05 11:25:08

标签: json xml vb.net web

我正在尝试将一个简单的XML文档自动发布到第三方,内容是一个URL编码的XML文档,目前正在使用以下代码创建提交:

            Using client As New WebClient
                Dim reqParm As New NameValueCollection
                reqParm.Add("cxml-urlencoded", sXmlOrderMessage)
                Dim respBytes = client.UploadValues(cXMLSettings.SupplierSetupUrl, "POST", reqParm)
                Dim respBody = (New UTF8Encoding(False).GetString(respBytes))
            End Using

这确实有效,并提交所需的内容。 XML是使用XmlTextWriter组件构建的,文档的标题是这样的:

    Dim mem As New MemoryStream
    Dim writer As New XmlTextWriter(mem, Encoding.UTF8)

    writer.WriteStartDocument()
    writer.WriteDocType("cXML", Nothing, "http://xml.cXML.org/schemas/cXML/1.1.009/cXML.dtd", Nothing)
    writer.WriteStartElement("cXML")
    writer.WriteAttributeString("payloadID", objCXMLDetails.PayloadID + Request.Url.Host)
    writer.WriteAttributeString("xml:lang", "en-gb")
    writer.WriteAttributeString("timestamp", DateTime.Now.ToString("o"))

生成XML后,我会使用以下内容将其转换为字符串:

    writer.WriteEndDocument()
    writer.Flush()

    Dim reader As New StreamReader(mem)
    mem.Seek(0, SeekOrigin.Begin)

    Return reader.ReadToEnd

这将返回一个字符串,然后我可以对其进行URL编码。

XML返回(我只显示标题),是:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cXML.org/schemas/cXML/1.1.009/cXML.dtd">
<cXML payloadID="20180305112030.15272.382530855@localhost" xml:lang="en-gb" timestamp="2018-03-05T11:20:30.9962738+00:00">

问题是提交时,我收到以下错误:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cXML.org/schemas/cXML/1.2.017/cXML.dtd"> -
<cXML timestamp="2018-03-05T08:46:58" payloadID="87f75924-9851-47c5-bd6d-76c723657476">
  -
  <Response>
    <Status text="Not Acceptable org.jdom.input.JDOMParseException: Error on line 1: Content is not allowed in prolog." code="406" />
  </Response>
</cXML>

我试过

  1. 从XmlTextWriter中删除UTF-8编码。
  2. 删除DocType中定义的架构引用。
  3. 尝试使用正则表达式删除'&lt;'之前的任何内容在开头。
  4. 在这一点上的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我在其他地方遇到过这个错误,就像其他人一样,问题通常是在打开&lt;之前的一个字符,你注意到你已经试图消除它。你提到了一个正则表达式,也许你也可以发布它。有许多非打印字符可以进入流中,特别是在框架为我们工作的情况下。

考虑一下,下一行究竟做了什么?

writer.WriteStartDocument()

可能存在一些与此相关的问题以及意外的MemoryStream。也许在你创建它时,MemoryStream的零位有什么东西?

我见过的建议修复通常涉及将生成的XML放到文件中并检查十六进制代码以查看真正引导文件的内容,可能是非打印字符。这是过去帮助我的原因,因为它提供了一种法医方法来识别问题或确认问题存在于其他地方。

有些解决方案主张上传文件而不是流或字符串,但如果您能识别出确切的污染字符序列,我认为不需要这样做。