Let us say there exist a RESTful Web Service, e.g. Web API service, and you want to create a new MVC application that consume this Web Service. I designed a simple way to achieve the goal.

From Visual Studio wizard create a new MVC 5 Project.

By default you‘ll find 3 standard controllers: Account, Manage and Home.

And all inherits from Controller.

Now create a new MVC 5 controller and name it: “BaseController”.

Change the generalization of the other controllers and implement the BaseController. I have shown it in the following screenshot under Home Controller,

Suppose now there exist a web API service,

And you want contact this for get your Business Object Info as :

  • Products Detail: localhost:50665\api\Products
  • Orders Detail: localhost:50665\api\Orders
  • Customers Detail: localhost:50665\api\Customers
  • Invoice Detail: localhost:50665\api\Document\GetInvoice?num=1

So, I think I found a very easy way,

I created Base Controller, a generic method (GetWSObject) for contacting the WebService from all Controller and returned my desired object as a dynamic object:

  1. public async Task < T > GetWSObject < T > (string uriActionString)
  2. {
  3. T returnValue =
  4. default (T);
  5. try
  6. {
  7. using(var client = new HttpClient())
  8. {
  9. client.BaseAddress = new Uri(@ "http://localhost:50665/");
  10. client.DefaultRequestHeaders.Accept.Clear();
  11. client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  12. HttpResponseMessage response = await client.GetAsync(uriActionString);
  13. response.EnsureSuccessStatusCode();
  14. returnValue = JsonConvert.DeserializeObject < T > (((HttpResponseMessage) response).Content.ReadAsStringAsync().Result);
  15. }
  16. return returnValue;
  17. }
  18. catch (Exception e)
  19. {
  20. throw (e);
  21. }
  22. }

The method takes the uriActionString as an input parameter and returns the result dynamically deserialized as my business model object .

So, for example, if you want to take the detail for Product with id=11 and show this in your MVC application in the HomeControllers (that implement the BaseController) you can create the following ActionResult:

  1. public async Task < ActionResult > ViewProduct(int Id)
  2. {
  3. ViewBag.Message = "Your products page.";
  4. Product product = new Product();
  5. string urlAction = String.Format("/api/Products/{0}", Id);
  6. product = await GetWSObject < Product > (urlAction);
  7. return View(product);
  8. }

With 2 lines you get the result and you have a Product object to pass (e.g.) in your View as a viewmodel.

Obviously, with the same modalities you can contact any other method of the Web Service, from any other Controller; simply change the urlAction string and call the GetWSObject method passing the desired result object type (<Product>). That's all!