json - 表单提交错误 : Content is not allowed in prolog

标签 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. 尝试使用正则表达式删除开头“<”之前的任何内容。

此时如有任何帮助,我们将不胜感激。

最佳答案

我在其他地方遇到过这个错误,其他人也遇到过,问题通常是开头 < 之前的一个字符,您注意到您已尝试消除该字符。你提到了一个正则表达式,也许你也可以发布它。有许多非打印字符可以找到进入流的方式,尤其是在框架为我们完成工作的情况下。

想一想,下面这行到底做了什么?

writer.WriteStartDocument()

这可能与意外的 MemoryStream 有一些相互作用。可能是你创建的时候在MemoryStream的零位置有东西吧?

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

一些解决方案提倡上传文件而不是流或字符串,但我认为如果您可以识别确切的污染字符序列,则不需要这样做。

关于json - 表单提交错误 : Content is not allowed in prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49109380/

相关文章:

javascript - json - 一次在同一个 Node 上添加 2 个元素? (或者在不存在的 Node 中)

asp.net - 找出重点控制

mysql - 如何根据数据库用户信息动态启用/禁用 ToolStripMenuItem?

sql - 创建动态选择案例 (vb)

c# - 如何将 json 反序列化为 PropertyType?

java - Jackson:尝试将 JSON 反序列化为 java 对象时未解析的前向引用

c++ - 如何使用 tinyxml2 在节点内创建节点?

java - 想要用等效的 UTF-8 符号替换特殊字符

json - Postgres - 大型 jsonb 列的性能

java - 具有相同根的类属性的 JAXB