ChrisMDrew
asked on
WebClient returning an XDocument
I'm writing a simple Windows Mobile application (my first) and just want to be sure of how best to obtain data from a web service. Actually I'm not using a Web Service as such just a web page as I want to later port to Android so want to stay away from Microsoft specific functionality if I can.
My first problem.question is how best to return an XDocument from a web page being used as a service. My code here is :-
This is in page_load - essentially I want to return some data to the windows mobile WebClient to say if the user logged in or not. The problem here is that I get the web page text following the XML - I assume that I just need to add Reponse.End() after the write but just want to be sure.
In the Windows Mobile Client I am using WebClient.OpenReadSync. In my read completed function I have the following code L-
Is this correct or is there a better way of getting the returned XML into an XDocument - I did try loading straight from the stream but this gave an error.
My first problem.question is how best to return an XDocument from a web page being used as a service. My code here is :-
XDocument xDocument = new XDocument();
xDocument.Declaration = new XDeclaration("1.0", "utf-8", "");
XElement xMainElement = new XElement("whereabouts");
xDocument.Add(xMainElement);
// Check login parameters
string username = Request.QueryString["uid"];
// Build Document
// return document
Response.Write(xDocument);
This is in page_load - essentially I want to return some data to the windows mobile WebClient to say if the user logged in or not. The problem here is that I get the web page text following the XML - I assume that I just need to add Reponse.End() after the write but just want to be sure.
In the Windows Mobile Client I am using WebClient.OpenReadSync. In my read completed function I have the following code L-
XDocument xDocument = new XDocument();
xDocument.Declaration = new XDeclaration("1.0", "utf-8", "");
XElement xMainElement = new XElement("whereabouts");
xDocument.Add(xMainElement);
// Check login parameters
string username = Request.QueryString["uid"];
// Build Document
// return document
Response.Write(xDocument);
Is this correct or is there a better way of getting the returned XML into an XDocument - I did try loading straight from the stream but this gave an error.
Stream reply = null;
StreamReader stream = null;
try
{
reply = e.Result;
stream = new StreamReader(reply);
// Read the reply into an XDocument
string xml = stream.ReadToEnd();
XDocument jobsDocument = XDocument.Load(xml);
}
finally
{
// Close the stream reader and stream
if (stream != null)
stream.Close();
if (reply != null)
reply.Close ();
}
ASKER
I have seen that you can load directly like that however I really need to use Async mode I believe to prevent hanging the phone waiting for a reply from the server.
As such I am using the WebClient.OpenReadAsync rather than going direct as you suggest.
the Response.End has helped - I also had to change the code in the web page to return the data as
Response.Write(xDocument.D eclaration .ToString( ) + xDocument.ToString());
Response.End();
Oddly enough when I load into the XDocument at the phone end I still get an error stating that it 'cannot find file'???
As such I am using the WebClient.OpenReadAsync rather than going direct as you suggest.
the Response.End has helped - I also had to change the code in the web page to return the data as
Response.Write(xDocument.D
Response.End();
Oddly enough when I load into the XDocument at the phone end I still get an error stating that it 'cannot find file'???
What Mobile OS are you using?
ASKER
Windows Mobile 7 - I think I have cracked the original question though - when i write the XDocument I need to use :-
Response.Write( @"<?xml version='1.0' encoding='utf-8'?>" + xDocument.ToString());
Response.End();
at the other end I use :-
string xml = stream.ReadToEnd();
XDocument jobsDocument = XDocument.Parse(xml);
which appears to work - is this the best way to do this however?
Response.Write( @"<?xml version='1.0' encoding='utf-8'?>" + xDocument.ToString());
Response.End();
at the other end I use :-
string xml = stream.ReadToEnd();
XDocument jobsDocument = XDocument.Parse(xml);
which appears to work - is this the best way to do this however?
When you add the web reference to the mobile project it automatically add the Async calls for you.
ASKER
...but as I metioned at the start - I don't want to use Web References / services (at least not the Microsoft .NET implementation) as I want to be able to port to Android at some stage.
Actually working fine as per my last comment - now for some LINQ questions...
Actually working fine as per my last comment - now for some LINQ questions...
Yes you can use the web client to DownloadSrring()
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
XmlTextReader reader = new XmlTextReader(YOUR_XML_URL
// Supply the credentials necessary to access the Web server.
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = CredentialCache.DefaultCre
reader.XmlResolver = resolver;
_xd.Load(reader);