Sure, the here's a Java code snippet. Unfortunately, the .NET side is a black box to me, so I don't have any code to share. This will take the code generated by WSDL2Java and pull out the attachments from the "content" field which is typed as an xsd:anyType:
public static byte[] convertToBytes(NodeDocument doc) { Object content = null; byte dataOUT[] = null; content = doc.getContent(); if(content instanceof byte[]) dataOUT = (byte[])content; else if(content instanceof DataHandler) { DataHandler dhData = (DataHandler)content; dataOUT = getBytesFromStream(dhData); } else if(content instanceof AttachmentPart) { AttachmentPart attch = (AttachmentPart)content; dataOUT = getBytesFromStream(attch.getActivationDataHandler()); } else { throw new IllegalArgumentException("Could not convert to bytes from: " + content + " Argument type is unknown!"); } return dataOUT; } private static byte[] getBytesFromStream(DataHandler data) { InputStream in = null; byte out[] = null; try { in = data.getInputStream(); if(in != null) { out = new byte[in.available()]; in.read(out); } else { out = new byte[0]; } } catch(IOException ex) { System.err.println("Could not get Bytes."); ex.printStackTrace(); } return out; } >>> [EMAIL PROTECTED] 01/07/05 03:30PM >>> Does it mean that the following method should work fine if I change DataHandler to Object? Does it work w/o any changes in the method implementation? public String createOrUpdateContentObjectWithAttachments(String sessionID, String containerID, String xmlString, String customerID, String contentID, DataHandler source, String sourceFileName, DataHandler thumb, String thumbFileName); input argument DataHandler is sent stream. How would the client and server know that it has to send the stream for that specific argument. You are just sending xsd:AnyType. Andy, do you mind sending your code. Or atleast the snippet of the method that takes attachment as input argument?. I would appreciate if could also send your .NET snippet. Thannks Praveen ----- Original Message ----- From: "ANDREW MICONE" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Friday, January 07, 2005 5:22 PM Subject: RE: Best way to send attachments Right, it's passed in either directly or by reference as xsd:anyType and then the receiver has to type the anyType to determine whether its base64encoded, SwA, or DIME. -- Andy >>> [EMAIL PROTECTED] 01/07/05 03:10PM >>> Nothing in that wsdl fragment indicates that there will be any MIME or DIME based attachments. Cheers Simon > -----Original Message----- > From: ANDREW MICONE [mailto:[EMAIL PROTECTED] > Sent: Friday, January 07, 2005 12:14 PM > To: [EMAIL PROTECTED] > Subject: RE: Best way to send attachments > > Here's an example of a WSDL snippet that is consumed by both > .NET and Axis that handles attachments and interoperates > between the two. This is from a service in production: > > <complexType name="NodeDocument"> > <sequence> > <element name="name" nillable="true" type="xsd:string"/> > <element name="type" nillable="true" type="xsd:string"/> > <element name="content" nillable="true" > type="xsd:anyType"/> > </sequence> > </complexType> > <complexType name="ArrayofDoc"> > <complexContent> > <restriction base="soapenc:Array"> > <attribute ref="soapenc:arrayType" > wsdl:arrayType="tns1:NodeDocument[]"/> > </restriction> > </complexContent> > </complexType> > > BTW, I didn't write it, I just implemented it. -- Andy > > >>> [EMAIL PROTECTED] 01/07/05 12:26PM >>> > I don't believe there is a way to define this in wsdl so that > both .Net and Java(axis) can consume the wsdl. Someone please > correct me if I am wrong. My clients just have to understand > that certain methods have filles attached. I also allow them > to set a request parameter do define whether the attachment > should be set to Dime or Mime encoding (the service is Axis). > > > Raul > > -----Original Message----- > From: BLIS Webmaster (Patrick Houbaux) > [mailto:[EMAIL PROTECTED] > Sent: Friday, January 07, 2005 1:12 PM > To: [EMAIL PROTECTED] > Subject: Re: Best way to send attachments > > I have no problem sending attachements to .NET client. > > I have a RPC web service (I guess it works for other web > service style), and here is the methodologie: > > Let's assume you have a web service supposed to send some > attachments, the idea is to add the attachment to the SOAP > message before the web service method returns on the server > side (please note the following is using AXIS 1.1, but it is > almost the same with the latest version of AXIS, the AXIS API > has changed a bit). > > 1- get the response message from the message context: > //... > org.apache.axis.MessageContext msgContext= > org.apache.axis.MessageContext.getCurrentContext(); > org.apache.axis.Message rspMsg= msgContext.getResponseMessage(); > > 2 - Set the attachment type to be sent as DIME > > > rspMsg.getAttachmentsImpl().setSendType(org.apache.axis.attach > ments.Atta > chments.SEND_TYPE_DIME); > > 3- Let's assume you want to send a file > > java.io.File fileToAddAsAttachment = new > java.io.File("<the path to your file>"); > > 4- Add the file to attachment of the response message > > javax.activation.DataHandler dh=new > javax.activation.DataHandler(new > javax.activation.FileDataSource(fileToAddAsAttachment)); > org.apache.axis.attachments.AttachmentPart part = new > org.apache.axis.attachments.AttachmentPart(dh); > rspMsg.addAttachmentPart(part); > > 5- Return your method > > The drawback with that is I haven't figured out how to declare (with > java2wsdl) the attachment in the WSDL so you have to document > your web service or inform your clients they have to expect > some attachments when they call your method. > > On the .NET client side, the method is the following: > > 1- Call the web service method > > 2- Just after the previous call returned, get the SOAP > Response message context > SoapContext rspContext = service.ResponseSoapContext; > > 3- Get the DIME attachements, loop on them and write in a > file what you find there: > DimeAttachmentCollection attachments = rspContext.Attachments; > for (int i=0; i<attachments.Count; i++) > { > Stream str = attachments[i].Stream; > FileStream fs = new FileStream("<the file name > where you want to save the > attachment>",FileMode.Create,FileAccess.Write); > ((MemoryStream)str).WriteTo(fs); > str.Close(); > fs.Close(); > } > > That's all, that works perfectly for me ... hope it helps. > > Cheers, > Patrick. > > > > Vy Ho wrote: > > All of the reples make no sense whatsover to me. > > > > The original poster makes a very clear question that how to send > > attachments using soap way that works with many environments. For > > example, Axis and .Net. > > > > To rephrase this, I would say how to create a Wsdl that works with > > both axis and .net. Currently, using the DataHandler in > the wsdl (or > > generating the wsdl from java code with DataHandler) would not work > > with other environment. I haven't tried this, but looking at the > > definition of DataHandler (package name), and its namespace in the > > wsdl, you can tell it comes from apache, not some Soap standard, > > unless Apache is the official standard used for attachment. > > > > It's funny to read a bunch of replies that have little > answer value to > > > the original question. > >