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

M

MikeL

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
 
K

Keenan Newton

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

MikeL

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
 
K

Keenan Newton

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
 
S

Sami Vaaraniemi

MikeL said:
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,

You can use a Soap extension to log the SOAP to a file. Check out
http://msdn.microsoft.com/library/d...bservicesprotocolssoapextensionclasstopic.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
 
M

MikeL

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
 
S

Sami Vaaraniemi

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
 
K

Keenan Newton

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
 
T

Trevor Pinkney

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.

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.s
omedomain.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.

[WebMethod]
public System.Xml.XmlElement MyMethod()
{
//some code to get XmlElement
return myXmlElement; //System.Xml.XmlElement
}
 
D

Dan Rogers

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

--------------------
 
D

Dan Rogers

It won't give him the SOAP request or the HTTP headers - but it's close.
--------------------
Message-ID: <[email protected]>
From: Trevor Pinkney <[email protected]>
Subject: Re: How to get the "raw" XML document returned from a web service
References: <[email protected]>
Content-Type: text/plain; charset=iso-8859-1; format=flowed
X-Newsreader: JetBrains Omea Reader 439.21
Newsgroups: microsoft.public.dotnet.framework.aspnet.webservices
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

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.

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.s
omedomain.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.

[WebMethod]
public System.Xml.XmlElement MyMethod()
{
//some code to get XmlElement
return myXmlElement; //System.Xml.XmlElement
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,008
Latest member
Rahul737

Latest Threads

Top