3

Using WebApi, what is the best way to consume a service in a MVC client?

If the response comes back as:

<?xml version="1.0" encoding="UTF-8"?> <ArrayOfContact xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Contact> <Id>1</Id> <Name>Bilbo Baggins</Name> </Contact> <Contact> <Id>2</Id> <Name>Frodo Baggins</Name> </Contact> </ArrayOfContact> 

How can I take that, get my Contacts out and list them in a MVC3 Razor View using @Model?

There's a lot of examples online for the latest preview of WebApi but I can't find any that go a step further and show a client consuming the service, say using WebClient.

Thanks,

R.

2
  • Worth adding, the service is fine. If I run var contacts = new WebClient().DownloadString(" http:// localhost:9000/api/contacts"); I get the XML file no worries. Commented Dec 8, 2011 at 5:26
  • I would use Linq to Xml. See [this question][1] for some examples. [1]: stackoverflow.com/questions/670563/linq-to-read-xml Commented Dec 8, 2011 at 12:09

2 Answers 2

6

WCF Web API comes with a new, improved HttpClient implementation. Please take a look at this sample (which is included in the source code you can download here).

[Update]

var client = new HttpClient(); var task = client.GetAsync("http://webapi/Contacts"); var contacts = task.ContinueWith( t => { return t.Result.Content.ReadAsAsync<List<Contact>>(); }).Unwrap().Result; Console.WriteLine(contacts.Count); 
Sign up to request clarification or add additional context in comments.

2 Comments

That looks good but how do I map the xml in the response to my strongly typed objects?
You can access the Content property of the response and call the ReadAsAsync<T> where T is your type. HttpClient uses the build in XmlFormatter to deserialize your Xml.
5

You could define a model:

public class Contact { public int Id { get; set; } public string Name { get; set; } } 

and then consume:

var url = "http://localhost:9000/api/contacts"; using (var client = new WebClient()) using (var reader = XmlReader.Create(client.OpenRead(url))) { var serializer = new XmlSerializer(typeof(Contact[])); var contacts = (Contact[])serializer.Deserialize(reader); // TODO: Do something with the contacts } 

1 Comment

I'd have like to get Alexander's reply workable but Darin's works as is.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.