Dans ce billet, nous allons voir quelles sont les étapes à suivre pour utiliser une API Web WCF au sein d'une application MVC. Tout d'abord, créons un projet de type Application Web ASP.NET MVC3 que l'on va appeler ArtistManager.

On sélectionne le modèle vide et on conserve le moteur de vue Razor.

Une fois le projet créé, on effectue un clic-droit → Propriétés → Web. Dans la partie Serveurs, on indique un port spécifique (Exemple : 1402).

La prochaine étape consiste à installer un paquet de création d'API Web par l'intermédiaire de NuGet.
NB : Si vous n'avez toujours pas installé NuGet sur votre machine, je vous suggère de lire ce tutoriel d'Hinault Romaric DONFACK qui détaille toutes les informations relatives à ce sujet.
Pour cela, nous allons cliquer sur Outils → Library Package Manager → Add Library Package Reference, rechercher le paquet WebApi.All, et l'installer.

Une fois l'installation effectuée, vous pouvez remarquer que des références ont été ajoutées à votre projet.

Nous sommes désormais prêt à construire notre API Web. Dans un premier temps, nous allons créer un dossier API qui contiendra nos classes API. Au sein de ce dossier, nous allons ajouter une nouvelle classe API que l'on va appelée ArtistApi. A ce stade, vous devriez avoir ce code dans votre classe :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ArtistManager.API
{
public class ArtisteApi
{
}
}
On va la modifier en y ajoutant l'attribut ServiceContract afin d'indiquer à l'API Web que cette classe peut être exposée en tant que service. Cet attribut nécessite l'espace de noms System.ServiceModel.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ServiceModel;
namespace ArtistManager.API
{
[ServiceContract]
public class ArtistApi
{
}
}
Maintenant, nous allons enregistrer dans le fichier Global.asax.cs. Ajoutez les espaces de noms suivants :
using ContactManager.APIs;
using System.ServiceModel.Activation;
Dans la méthode RegisterRoutes, il va falloir ajouter le bout de code suivant afin d'enregistrer une route pour notre nouvel API Web :
routes.Add(new ServiceRoute("api/artists", new HttpServiceHostFactory(), typeof(ArtistApi)));
Vous devriez avoir :
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new ServiceRoute("api/artists", new HttpServiceHostFactory(), typeof(ArtistApi)));
routes.MapRoute(
"Default", // Nom d'itinéraire
"{controller}/{action}/{id}", // URL avec des paramètres
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Paramètres par défaut
);
}
La classe ServiceRoute permet de créer un itinéraire de service sur HTTP pour la prise en charge de scénarios REST. Elle prend 3 paramètres : un préfix d'itinéraire, une instance de classe HttpServiceHostFactory et un type de service.
Nous allons implémenter une classe POCO Artiste qui contiendra les informations qui seront passés via l'API. Il s'agit essentiellement d'un DTO (Data Transfer Object) mais en HTTP on considère que cette entité est représentée par une « Ressource ». Nous créerons également une méthode qui exposera notre ressource. Cela permettra à de multiples clients d'accéder à la ressource.
Comme fait précédemment, on va créer un dossier Ressources qui contiendra l'ensemble de nos ressources et y ajouter une classe Artist contenant le code suivant :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ArtistManager.Ressources
{
public class Artist
{
public int ArtistId { get; set; }
public string Name { get; set; }
}
}
Dans la classe ArtistApi, il va falloir ajouter les espaces de noms suivants :
using System.ServiceModel.Web;
using ArtistManager.Ressources;
Ainsi que la méthode Get suivante permettant de rapatrier les artistes :
[WebGet(UriTemplate = "")]
public IEnumerable<Artist> Get()
{
var artists = new List<Artist>()
{
new Artist {ArtistId = 1, Name = "Richard Anconina"},
new Artist {ArtistId = 2, Name = "Bruno Solo"},
new Artist {ArtistId = 3, Name = "José Garcia"},
new Artist {ArtistId = 4, Name = "Gilbert Melki"},
new Artist {ArtistId = 5, Name = "Vincent Elbaz"}
};
return artists;
}
Ici, l'attribut WebGet indique à l'API Web que cette méthode doit être exposée en tant que requête HTTP GET. On prend soin de passer une chaîne vide à l'UriTemplate. En effet, nous avons déjà définit la route de notre URL dans le Global.asax. D'ailleurs, vous pouvez vérifier que tout fonctionne et que votre liste d'artistes vous est renvoyée en vous rendant à l'URL suivante : http://localhost:1402/api/artists

Afin de tester leurs fonctionnalités, les Web API contiennent un module de test côté client que l'on peut configurer en créant une instance de HttpConfiguration dans la méthode RegisterRoutes :
var config = new HttpConfiguration() { EnableTestClient = true };
Il faudra ensuite passer cette instance au HttpServiceHostFactory de la route du Web API que nous avions créé précédemment.
routes.Add(new ServiceRoute("api/artists", new HttpServiceHostFactory() { Configuration = config }, typeof(ArtistApi)));
On relance le projet, puis on se rend à l'URL suivante : http://localhost:1402/api/artists/test
Ce qui nous amène sur la page de test.

Lorsque l'on clique sur notre ressource, cela a pour effet de remplir les champs Request et HTTP/1.1

On clique sur le bouton Send pour afficher la réponse de la requête GET :

On peut également récupérer la liste des Artistes au format JSON en passant la valeur « application/json » au paramètre Accept du champ Header :
