Scott Hanselman

I Ran All Over The Net Via Google And Google Groups This Evening Trying To Figure Out The Answer To What I Thought

December 11, '02 Comments [0] Posted in Web Services | ASP.NET | XML | Tools
Sponsored By

I ran all over the Net (via Google and Google Groups) this evening trying to figure out the answer to what I thought was a simple question.  Everywhere I turned I found pieces of what I wanted to do...clues...but not even close to the whole solution (isn't that always the way?). So, when I DID figure it out (for better or worse) I wanted to put the solution out in the world, lest I forget it, so if some poor schmoe needs to go looking for it him/herself.

I've got a very constrained environment in this instance, with ASP (not ASP.NET) on the client side, calling a Java WebService that includes a Base64 encoded image.  I wanted to get the image out of the soap envelope WITHOUT touching the disk. The data in the image is very sensitive and it can't be saved.

I know this is easy, and done basically automatically with serialization in ASP.NET...heck, most SOAP stacks handle this kind of stuff for you...I guess I just made it harder than it needed to be in Classic ASP.  I found all sorts of interesting stuff, including an online Base64 decoder, and one guy who actually wrote a BASE64 Decoder entirely in VBScript (which was, not surprisingly more effort than I was willing to handle today)!

The Proof of Concept result is this snippet of ASP/VBScript code...sigh...these things are so obvious AFTER they've been written!

<%
Dim mDoc
Set mDoc = Server.CreateObject("MSXML2.DOMDocument")
mDoc.async = false
mDoc.ValidateOnParse = false
'NOTE: The REAL xml file will come from inside our SOAP Envelope when it comes over from the SOAP/REST call to the Java WS
mDoc.Load Server.MapPath(".") + "\\sample.xml"
   
Dim oNode
Set oNode = m_Doc.selectSingleNode("/Envelope/Body/ImgQryRs/imgBin64")
'NOTE: I had to force the dataType to bin.base64 since there wasn't yet an XSD available to declare it was so.
oNode.dataType = "bin.base64"
Response.ContentType="image/JPEG"
Response.BinaryWrite oNode.nodeTypedValue
%>

Interesting things about this:

  • MSXML is smarter than I thought when using nodeTypedValue (accessing the property when the dataType is a bin.base64 causes an implicit conversion to a byte array)
  • Response.BinaryWrite in ASP is pretty darn useful, even in this typeless varient-y world of Classic ASP
  • When there's no XSD available (duh!) then nodeTypedValue doesn't work well! :)

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb
Comments are closed.

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.