2010-02-10 64 views
3

我在与试图使用VB.NET和WebRequest对象张贴一些cXML的文本和附件的问题。我相信我正在格式化我希望正确发布的数据的文本,因为它与Ariba提供的样本相匹配。我不确定的是如果我正确使用WebRequest对象来完成发布。我将Method设置为“POST”,将ContentType设置为“multipart/mixed”。我可以成功发布cXML(使用ContentType为“text/xml”),所以我知道发布在一般作品中。我回来来自阿里巴巴的消息是“该文件无法解析:缺少启动边界[ANCLS-741552]”,然而,如下面的代码所示,有一个开始边界。我已经删除了一些专有数据并用“...”取代。在MIME文本之后,我已经包含了我正在使用的相关VB.NET代码。问题发布MIME编码附件的Ariba供应商网络

任何和所有的建议都非常欢迎和感谢!

------=_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) 

回答

1

比尔一条线 - 我从阿里巴巴的一些信息,并认为这可能是对你有用:

  • 的整个有效内容的内容类型声明指定了边界
  • 每个部分都以w/a' - '开头,后面跟着边界
  • 该文档以' - 'foll结尾由边界后跟' - '
  • 每个部分的Content-ID用尖括号括起来
  • 附件的Content-ID在Comments/Attachment没有尖括号的URL元素中引用

也许你可以尝试用一个短的边界线。另外,请注意'start'参数。下面是对我工作的一个:

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:[email protected]</URL></Attachment></Comments> 

... 

</Request></cXML> 

--outerboundary1 

Content-type: text/plain; charset=US-ASCII 

Content-Disposition: attachment; filename=PremiereCatalog.xxx 

Content-Length: 4 

Content-ID: <[email protected]> 

xxxx 

--outerboundary1-- 

我知道它可以是非常令人沮丧的用很少的帮助那里。所以我们知道你是否需要为我工作的完整代码。

普拉

0

我在将MIME内容的XML张贴到Ariba SN时遇到类似的错误。在没有MIME的情况下发布XML很有效。

的错误味精,我得到的是: 文档无法解析:内容是不是在序言不允许的。 (第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][email protected]?r9?A?a?A??h4?B?d;? r1? 
. 
. 
????[?????????(???????1?7????[??2????.\[email protected]????????????????%?? ????%?? ?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 
+0

一句我看到(我的确收到的时候我还没有做出这种改变的错误)的事情是,对于一个MIME文件将contentType必须多/混合或多重/相关,而不是文/ XML。或者,至少它不应该是text/xml,而应该是我不知道的其他东西。尽管如此,cXML的文档看起来很清楚。希望有所帮助,并感谢张贴。你永远不知道解决方案的想法可以从哪里来! – Bill 2010-02-11 13:13:43

1

你比尔是对的。我作出了以下变化及其现在的工作:

改变的代码

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