Search code examples
vb.netpostsap-ariba

Problem Posting MIME encoded attachment to Ariba Supplier Network


I'm having an issue with trying to use VB.NET and the WebRequest object to post some cXML text and an attachment. I believe I am formatting the text of the data I wish to post correctly, as it matches samples Ariba has supplied.

What I am uncertain of is if I am correctly using the WebRequest object to do the posting. I am setting the Method as "POST" and the ContentType as "multipart/mixed". I can successfully post cXML (using a ContentType of "text/xml"), so I know posting in general works.

The message I get back from Ariba is:

The document could not be parsed: Missing start boundary [ANCLS-741552]

However, as the following code shows, there is a start boundary. I have removed some proprietary data and replaced it with "...". Following the MIME text, I have included the relevant VB.NET code I am using.

Any and all suggestions are most welcome and appreciated!

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

Solution

  • Bill - I got some info from Ariba and thought it might be useful to you:

    • The Content-type declaration for the whole payload specifies the boundary
    • Each part is preceded w/ a '--' followed by the boundary
    • The document terminates with a '--' followed by boundary followed by '--'
    • The Content-ID of each part is enclosed in angle brackets
    • The Content-ID of the attachment is referenced in the URL element in Comments/Attachment w/o angle brackets

    Maybe you could try with a shorted boundary string. Also, note the 'start' parameter. Here's the one that worked for me:

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

    A sample XML with the above boundary & start settings looks like this:

    --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-- 
    

    I know it can be very frustrating with very little help out there. So lemme know if you need the complete code that worked for me.

    Pravin