- Créer quelques tables dans SQLServer et générer les classes Linq to SQL via un fichier dbml.
- Il faut définir un contrat qui sera celui utilisé par le service WCF. On spécifie également dans l'attribut WebGet ou WebInvoke le type de sérialisation. Par défaut, elle est en XML mais il est possible de l'activer en mode JSON.
- Il faut implémenter la classe concrète du service WCF
- Il faut lancer le service WCF
- Test du service web avant implémentation du client.
- Coté client, il faut implémenter un canal pour parser le code XML renvoyé. Il est possible d'utiliser sans problème du code disponible dans les samples de Microsoft (disponible dans l'exemple fourni à la fin de ce post).
- Solution d'exemple La solution est disponible ici.
[ServiceContract] public interface IBugService { [OperationContract] //ResponseFormat = WebMessageFormat.Xml ou WebMessageFormat.Json [WebGet(UriTemplate = "/hello")] string Hello(); [OperationContract] [WebGet(UriTemplate = "/projects")] ListGetProjects(); [OperationContract] [WebGet(UriTemplate = "/project/{id}")] //id doit etre en string (vu restful) Project GetProject(string id); [OperationContract] [WebInvoke(Method = "POST", UriTemplate = "/project/createOrUpdate")] void SaveOrUpdateProject(Message projectMessage); }
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)] public class BugService : IBugService { #region IBugService Members public string Hello() { return "Hello world !"; } public ListGetProjects() { return Business.GetProjects(); } public Project GetProject(string id) { return Business.GetProject(short.Parse(id)); } public void SaveOrUpdateProject(Message projectMessage) { HttpRequestMessageProperty requestProperties = projectMessage.Properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty; Project project = projectMessage.GetBody (); Business.SaveOrUpdateProject(project); Console.WriteLine("Received " + requestProperties.Method + " for Project."); //WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Created; } #endregion }
BugService service = new BugService(); WebHttpBinding binding = new WebHttpBinding(); WebHttpBehavior behavior = new WebHttpBehavior(); WebServiceHost host = new WebServiceHost(service, new Uri("http://localhost:8000/bug")); host.AddServiceEndpoint(typeof(IBugService), binding, ""); host.Open(); Console.WriteLine("Bug service is running at http://localhost:8000/bug"); Console.ReadLine(); host.Close();
HttpClient client = new HttpClient("http://localhost:8000/bug", false); Uri requestUri = new Uri("http://localhost:8000/bug/projects"); Console.WriteLine("GET " + requestUri); Message response = client.Get(requestUri); Console.WriteLine((int)client.GetStatusCode(response) + " " + client.GetStatusDescription(response)); Listprojects = response.GetBody >(); Project newProject = new Project(); newProject.Name = "Project added by restful webservice"; newProject.ProjectKey = 3; newProject.ProjectID = Guid.NewGuid(); requestUri = new Uri("http://localhost:8000/bug/project/createOrUpdate"); Console.WriteLine("POST " + requestUri); response = client.Post(requestUri, newProject);
Quelques références: