Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / ASP.NET / Web Services / March 2005

Tip: Looking for answers? Try searching our database.

How to get the "raw" XML document returned from a web service

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
MikeL - 17 Feb 2005 20:02 GMT
Hello.

I am consuming a web service by adding a web reference to the service's WSDL
file, and everything works fine.

When I call the service I need to also "grab" the "raw" XML document that
the service returned.

How do I go about this? Do I use the XMLSerializer?

Thanks in advance,

Mike
Keenan Newton - 17 Feb 2005 21:20 GMT
Mike you should be able to pass the XmlElement object without a
problem.

[WebMethod]
public System.Xml.XmlElement MyMethod()
{
  //some code to get XmlElement
  return myXmlElement;   //System.Xml.XmlElement
}
MikeL - 17 Feb 2005 22:10 GMT
Hi, Keenan. Thanks for the response.

The problem is on the consumer of the web service. They want the XML
document.

I don't want to write another WebMethod just for this. I'd like to know how
to serialize the returned data to an XML doc. The following code will do it
and save it to disk, but ultimately I want not to write it to disk, but
rather store it in a "string" variable:

                            System.Xml.Serialization.XmlSerializer s = new
System.Xml.Serialization.XmlSerializer(typeof(seResults),https://www.somedomain.com/RatingHub);

                            Stream fs = new FileStream("D:\\stream.txt",
FileMode.Truncate );

                            XmlWriter writer = new XmlTextWriter(fs, new
UTF8Encoding());

                            s.Serialize(writer, results);

 Any thoughts?

Thanks again,

Mike

> Mike you should be able to pass the XmlElement object without a
> problem.
[quoted text clipped - 5 lines]
>   return myXmlElement;   //System.Xml.XmlElement
> }
Keenan Newton - 18 Feb 2005 03:18 GMT
OK you need to find out what object type they are expecting on their
end if it a string or XMlNode, or XmlElement, typically a XmlNode will
accept a XmlDocument or XmlElement.  An XmlElement is essentially or it
can be the Xml within an Xmldocument.  the XmlDocument class has a
property called DocumentElement.  This is essentially all the XML in a
"XmlDocument"  The DocumentElement if you look at it really is of type
XmlElement.  So if they want it as a string of Xml you again can use
the XmlElement, and return the OuterXml element.  So First things first
find out the exact data type they want XmlDocument, XmlNode, XmlElement
or string. Oh yes don't use the filestream use a MemoryStream if
possible
Trevor Pinkney - 21 Feb 2005 19:20 GMT
This should do what you want.  

        /// <summary>
        /// Converts an object to its xml representation
        /// </summary>
        public static string ObjectToXml(object objectToConvert)
        {
            MemoryStream memStream = new MemoryStream();
            XmlSerializer serializer = new XmlSerializer(objectToConvert.GetType());
            serializer.Serialize(memStream, objectToConvert);
            StreamReader reader = new StreamReader(memStream);
            memStream.Position = 0;
            return reader.ReadToEnd();
        }

-Trevor

Hello MikeL,

> Hi, Keenan. Thanks for the response.
>
[quoted text clipped - 34 lines]
>> return myXmlElement;   //System.Xml.XmlElement
>> }
Dan Rogers - 08 Mar 2005 21:24 GMT
It won't give him the SOAP request or the HTTP headers - but it's close.
--------------------
>Message-ID: <2235632445925053619134@news.microsoft.com>
>From: Trevor Pinkney <tpinkney@cyence.com>
[quoted text clipped - 5 lines]
>Date: Mon, 21 Feb 2005 11:20:40 -0800
>NNTP-Posting-Host: z-f5-0-0-229-s1.gw1.tor1.sprint-canada.net
206.186.91.250
>Lines: 1        
>Path:
TK2MSFTNGXA02.phx.gbl!TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP1
4.phx.gbl
>Xref: TK2MSFTNGXA02.phx.gbl
microsoft.public.dotnet.framework.aspnet.webservices:28225
>X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webservices
>
[quoted text clipped - 55 lines]
>>> return myXmlElement;   //System.Xml.XmlElement
>>> }
Sami Vaaraniemi - 18 Feb 2005 07:53 GMT
> Hello.
>
[quoted text clipped - 7 lines]
>
> Thanks in advance,

You can use a Soap extension to log the SOAP to a file. Check out
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlr
fsystemwebservicesprotocolssoapextensionclasstopic.asp

(watch for the wrap).

To hook the SoapExtension in the consumer application, compile the code in
the article to TraceSoapExtension.dll and add this to the consumer's config
file:

<system.web>
   <webServices>
     <soapExtensionTypes>
       <add type="TraceExtension, TraceSoapExtension" priority="1"
group="0" />
     </soapExtensionTypes>
   </webServices>
</system.web>

Regards,
Sami
MikeL - 18 Feb 2005 11:31 GMT
Hello, Sami. Thanks for the response.

I figured out a way to do it that looks like the following. Can you think of
why this is not a good way to do it? A call to the web service has been made
and the returned "seResutls" object assigned to variable "results":

___________________________________________________________________________________________
System.Xml.Serialization.XmlSerializer s = new
System.Xml.Serialization.XmlSerializer(typeof(seResults));
MemoryStream mm = new MemoryStream();

// Now serialize it:
s.Serialize(mm, results);

// Now convert it to a string:
ASCIIEncoding encoding = new ASCIIEncoding( );
string str = encoding.GetString(mm.GetBuffer());
str = str.Trim();
MessageBox.Show(str);
___________________________________________________________________________________________

Thanks again,

Mike

>> Hello.
>>
[quoted text clipped - 27 lines]
> Regards,
> Sami
Sami Vaaraniemi - 18 Feb 2005 13:25 GMT
You are re-serializing the 'results' object in the consumer, right? This is
not the same as obtaining the original XML from the Soap message, but I
guess it's ok if all you want is an XML representation of your object. Keep
in mind that the original XML and the re-serialized version might not be
identical.

Regards,
Sami

> Hello, Sami. Thanks for the response.
>
[quoted text clipped - 52 lines]
>> Regards,
>> Sami
Keenan Newton - 18 Feb 2005 18:22 GMT
Sami also has a good idea but the code saves it to a file, not sure if
that is what you really want to do or not
Dan Rogers - 08 Mar 2005 00:58 GMT
Do you want to just see it (for learning/teaching?) or are you saying you
want the caller to always get back an XML document?

If this latter is the case, use MSXML to format your own SOAP XML request,
and use the HTTPPost method to post the document that represents the
request to the service endpoint URL.  Then take the output, strip out the
HTTP header, and then load the remainder into an XML DOM (or just hand the
client the stream and let them party on the raw html/xml.)

--------------------
>From: "MikeL" <MichaelLopez@inds.com>
>Subject: How to get the "raw" XML document returned from a web service
[quoted text clipped - 10 lines]
>Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP12.phx.gbl
>Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.aspnet.webservices:5607
>X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.webservices
>
[quoted text clipped - 11 lines]
>
>Mike

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.