Sometimes a little more flexibility is needed than a single XML Port in a web service function. Then it is possible to send multiple files to a single web service. I am working on an enhancement for the inter-company posting feature in Dynamics NAV.
To add to the standard functionality I want to be able to use web services to deliver an invoice from one company to another. I send two XML files and two PDF files to web service.
In the Classic Client I use then ‘CG Request Client’.Base64 to encode the files into a XML node.
[code]
XMLElement3.appendChild(XMLNode);
XMLNode := XMLRequestDoc.createElement(‘pDFInvoice’);
IF "PDF Document".HASVALUE THEN BEGIN
PDFInvoiceFileName := FileMgt.ClientTempFileName(”,’pdf’);
ICOutboxTrans."PDF Document".EXPORT(PDFInvoiceFileName,FALSE);
Base64.Encode(PDFInvoiceFileName,XMLNode);
ERASE(PDFInvoiceFileName);
END;
XMLElement3.appendChild(XMLNode);[/code]
in the Role Tailored Client I use dotnet interop
[code]
XMLNode4 := XMLRequestDoc.CreateElement(‘pDFInvoice’);
IF "PDF Document".HASVALUE THEN BEGIN
"PDF Document".CREATEINSTREAM(InStr);
DOWNLOADFROMSTREAM(InStr,Text006,Path,Text009,PDFInvoiceFileName);
XMLNode4.InnerText := Convert.ToBase64String(ClientFile.ReadAllBytes(PDFInvoiceFileName));
ClientFile.Delete(PDFInvoiceFileName);
END;
XMLElement3.AppendChild(XMLNode4);[/code]
On the service part it is possible to write the file to a BLOB without using a temporary file.
[code]
IF PDFInvoice.LENGTH > 0 THEN BEGIN
Bytes := Convert.FromBase64String(PDFInvoice);
MemoryStream := MemoryStream.MemoryStream(Bytes);
ICInboxTransaction."PDF Document".CREATEOUTSTREAM(OutStr);
MemoryStream.WriteTo(OutStr);
END;[/code]
Hi Gunnar,
Thanks for your examples. Just a quick question:
That datatype are you using for Bytes in your last example?
Br, Jonas
Look at my latest post -> https://dynamics.is/?p=1018