【问题标题】:Problem Posting MIME encoded attachment to Ariba Supplier Network将 MIME 编码附件发布到 Ariba Supplier Network 时出现问题
【发布时间】:2011-01-15 11:27:05
【问题描述】:

我在尝试使用 VB.NET 和 WebRequest 对象发布一些 cXML 文本和附件时遇到问题。我相信我正在格式化我希望正确发布的数据的文本,因为它与 Ariba 提供的样本相匹配。我不确定的是我是否正确使用 WebRequest 对象进行发布。我将 Method 设置为“POST”,ContentType 设置为“multipart/mixed”。我可以成功发布 cXML(使用“text/xml”的 ContentType),所以我知道在一般作品中发布。我从 Ariba 收到的消息是“无法解析文档:缺少起始边界 [ANCLS-741552]”,但是,如以下代码所示,存在起始边界。我删除了一些专有数据并将其替换为“...”。在 MIME 文本之后,我包含了我正在使用的相关 VB.NET 代码。

欢迎和感谢任何和所有建议!

------=_boundary.20100210154837663.173702
Content-Type: text/xml; charset=UTF-8
Content-ID: Part1.5213.20100210154837663.319349

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.018/cXML.dtd">
<cXML.../cXML>

------=_boundary.20100210154837663.173702
Content-Type: application/octet-stream
Content-transfer-encoding: base64
Content-ID: 5213.20100210154837663.319349
Content-Disposition: attachment; filename=attachment_20100210154837663_125705.jpg
Content-Length: 5660

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAd
.
.
.
dC2Nz9dOaQ1ZVIilwIpaWvLEg7aWuauv/9k=
------=_boundary.20100210154837663.173702--


Dim myWriter As StreamWriter = Nothing

Dim strUri As String = "https://service.ariba.com/service/transaction/cxml.asp"

Dim WebReq As WebRequest = System.Net.WebRequest.Create(strUri)

WebReq.Method = "POST"
WebReq.ContentType = "multipart/mixed"

myWriter = New StreamWriter(WebReq.GetRequestStream())
myWriter.Write(xmlText)
myWriter.Close()

Dim WebRsp As HttpWebResponse
WebRsp = CType(WebReq.GetResponse(), HttpWebResponse)

【问题讨论】:

    标签: vb.net post


    【解决方案1】:

    Bill - 我从 Ariba 获得了一些信息,并认为它可能对您有用:

    • 整个负载的内容类型声明指定了边界
    • 每个部分都以“--”开头,后跟边界
    • 文档以“--”结尾,边界后跟“--”
    • 每个部分的 Content-ID 括在尖括号中
    • 附件的 Content-ID 在评论/附件中的 URL 元素中引用,不带尖括号

    也许您可以尝试使用缩短的边界字符串。另外,请注意“开始”参数。这是对我有用的一个:

    request.ContentType =  "multipart/related;boundary=outerboundary1;type=""text/xml"";start=""<x.xml>"""
    

    具有上述边界和开始设置的示例 XML 如下所示:

    --outerboundary1
    
    Content-Type: text/xml
    
    Content-ID: <x.xml>
    
    <?xml version="1.0"?>
    
    <!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.007/InvoiceDetail.dtd">
    
    <cXML payloadID="za1saasxsx" timestamp="2003-04-04" xml:lang="en"><Header><From> 
    
    ... 
    
    <Comments>These also use bluetooth<Attachment><URL>cid:xx@cxml.org</URL></Attachment></Comments>
    
    ...
    
    </Request></cXML>
    
    --outerboundary1
    
    Content-type: text/plain; charset=US-ASCII
    
    Content-Disposition: attachment; filename=PremiereCatalog.xxx
    
    Content-Length: 4
    
    Content-ID: <xx@cxml.org>
    
    xxxx
    
    --outerboundary1-- 
    

    我知道在很少的帮助下可能会非常令人沮丧。所以让我知道你是否需要对我有用的完整代码。

    普拉文

    【讨论】:

      【解决方案2】:

      在将带有 MIME 内容的 XML 发布到 Ariba SN 时,我遇到了类似的错误。在没有 MIME 的情况下发布 XML 效果很好。

      我得到的错误信息是: 无法解析文档:prolog 中不允许有内容。 (第 1 行,第 1 列)[ANCLS-741552]

      我要上传的 XML 是:

      ------=_Part_19_14056801.1265738936575
      Content-Type: text/xml; charset=UTF-8
      Content-Disposition: attachment; filename=TestMessage020910.xml
      Content-ID:
      
      ?<?xml version="1.0" encoding="utf-8"?>
      <!DOCTYPE cXML SYSTEM "http://xml.cXML.org/schemas/cXML/1.2.021/InvoiceDetail.dtd">
      <cXML>...</cXML>
      
      ------=_Part_19_14056801.1265738936575
      Content-Type: image/tiff
      Content-transfer-encoding: binary
      Content-ID: TestImageURL
      Content-Disposition: attachment; filename=TestImageURL.tif
      Content-Length: 23618
      
      II*? [??&?lDr#??292??292?`?????pr9?3]?2s7???L?@7?r9?A?a?A??h4?B?d;? r1?
      .
      .
      ????[?????????(???????1?7????[??2????.\??@????????????????%?? ????%?? ?Pixel Translations Inc., PIXTIFF Version 57.0.218.2183??2007:12:11 09:55:11?
      ------=_Part_19_14056801.1265738936575--
      ????????????????????????????????????????????????????????????????????????????????????????????
      .
      .
      ????????????????????????????????????????????????????????????????????????????????????????????
      

      我使用的 VB.Net 代码是:

      Private Function Post_XML(ByVal XmlFile As String) As String
        If XmlFile.Length = 0 Then
         MsgBox("Error: XML File cannot be blank", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
         Return ""
        End If
      
        If File.Exists(XmlFile) = False Then
         MsgBox("Error: File does not exist - " + XmlFile, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
         Return ""
        End If
      
        Dim ASN_Link As String = "https://service.ariba.com/service/transaction/cxml.aspx"
        rtbLog.Text = ""
        System.Threading.Thread.Sleep(1000)
      
        rtbLog.Text = rtbLog.Text & vbCrLf & "To " & ASN_Link & vbCrLf
      
        Dim sr As StreamReader = New StreamReader(XmlFile)
        Dim XMLRead As String = sr.ReadToEnd
        Dim stXML As String
        stXML = XMLRead
        sr.Close()
      
        Try
         Dim results As String
      
         Dim request As WebRequest = WebRequest.Create(ASN_Link)
         request.Method = "POST"
         request.ContentType = "text/xml; charset=utf-8"
      
         Dim proxyObject As WebProxy = New WebProxy("proxy.xyz.com:8080", True)
         proxyObject.Credentials = CredentialCache.DefaultCredentials
         request.Proxy = proxyObject
         request.PreAuthenticate = True
         results = WriteToURL(request, stXML)
      
         Dim Response As String
         Response = RetrieveFromURL(request)
         rtbLog.Text = rtbLog.Text & vbCrLf & Response
      
         Return "OK"
      
        Catch ex As Exception
         MessageBox.Show(ex.Message, "", MessageBoxButtons.OK)
         Return "Error"
         Exit Function
        End Try
      
       End Function
      
        Private Function WriteToURL(ByVal Request As WebRequest, ByVal data As String) As String
      
          Try
         'Dim bytes = System.Text.Encoding.ASCII.GetBytes(data)
         Dim bytes = System.Text.Encoding.UTF8.GetBytes(data)
            Request.ContentLength = bytes.Length
      
            Dim OutPutStream As Stream = Request.GetRequestStream
            OutPutStream.Write(bytes, 0, bytes.length)
         OutPutStream.Close()
         Return "Ok"
          Catch ex As Exception
         MessageBox.Show(ex.Message & " - Write To URL", "error", MessageBoxButtons.OK)
         Return "Error"
            Exit Function
          End Try
      
        End Function
      
        Private Function RetrieveFromURL(ByVal Request As WebRequest) As String
      
          Try
            Dim response As WebResponse = Request.GetResponse
            Dim stream As Stream = response.GetResponseStream
            Dim sr As StreamReader = New StreamReader(stream)
            Return sr.ReadToEnd
          Catch ex As Exception
         MessageBox.Show(ex.Message & " - Retrieve From URL", "", MessageBoxButtons.OK)
         Return "Error"
            Exit Function
          End Try
      
        End Function
      

      【讨论】:

      • 我确实看到的一件事(当我尚未进行此更改时确实收到了该错误)是 MIME 文档的 ContentType 需要是多部分/混合或多部分/相关的,而不是文本/xml。或者,至少,它不应该是 text/xml,而应该是我不知道的其他东西。不过,cXML 的文档在这方面似乎很清楚。希望对您有所帮助,并感谢您的发帖。您永远不知道解决方案的想法来自哪里!
      【解决方案3】:

      你是对的,比尔。我进行了以下更改并且现在可以使用:

      改了一行代码

      from:
            request.ContentType = "text/xml; charset=utf-8"
      to
            request.ContentType = "multipart/related;boundary=outerboundary1;type=""text/xml"";start=""<x.xml>"""
      

      【讨论】:

        猜你喜欢
        • 2014-09-29
        • 1970-01-01
        • 2019-04-03
        • 2013-05-22
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多