Création et consommation de service web asp.net

CRÉATION ET CONSOMMATION DE SERVICE WEB ASP.NET

Introduction

Bonjour,

Dans ce tutoriel, je vais vous montrer comment concevoir facilement un service Web ASP.net et consommer celui-ci via un projet Winform de façon Asynchrone. Sources des projets ICI.

Le service Web

Tout d'abord pour comprendre ce qu'est un service Web, il est nécessaire d'avoir des bases en programmation orientée objet et de maîtriser pleinement le concept de classes. Il est aussi nécessaire d'avoir des bases en programmation web dans un langage côté serveur pour comprendre le concept d'aller retour et de protocole.

Qu'est ce qu'un service Web

Un service web est une classe mise à disposition des utilisateurs via internet et un serveur Web. Je vais prendre pour exemple, le groupe de technologies que nous allons utiliser dans ce tutoriel soit Visual Basic, ASP.Net, et IIS.

Ce qui se passe en interne dans un service Web est assez complexe à expliquer, aussi je vais essayer d'être aussi bref et clair que possible pour vous donner une idée de ce qui vous attend dans ce tutoriel.

Comme dit plus haut un service web ASP.Net est une classe (une assembly) mise à disposition des utilisateurs via le web.

Vous avez sûrement déjà du développer vos propres bibliothèques de classes ? Admettons que vous souhaitez que tout le monde puisse utiliser ces méthodes. C'est ici qu'intervient notre service Web.

Un service Web est composé d'une assembly, mais aussi d'un fichier de configuration (Web. config) et d'une page portant l'extension *.asmx. Jusqu'ici, rien de bien sorcier. Ce qu'il faut savoir, c'est que les méthodes de vos classes peuvent retourner des objets, et c'est là que cela devient de suite plus complexe. En fait, le client et le serveur vont s'envoyer des données, en communiquant via le protocole SOAP de sérialisation XML. L'objet est sérialisé en un flux XML puis envoyé sur le réseau. Une fois reçu, il est dé-sérialisé pour être restitué en l'objet original.

Pour faciliter et pour nous permettre de travailler avec une classe distante, Visual studio nous permet d'ajouter des « références de services » qui ne sont, en fait, que des copies de notre classe distante avec ses méthodes.

Mais ces copies ne se contentent pas de le rester ! En effet, lors de l'exécution du code elles sont prévues pour appeler la méthode distante. Elles permettent aussi la dé-sérialisation qui, pour opérer, doit renseigner l'assembly du flux sérialisé. On appelle souvent ces classes des classes proxy.

En gros, pour consommer un web service : Renseigner l'url de celui-ci, et le code permettant le dialogue avec notre classe distante est auto-généré par un outil de Visual studio.

Dans notre tutoriel, j'utilise le langage Microsoft Visual Basic. Vous devez donc vous munir des outils suivants :

  • Microsoft Visual Web Developer 2008 Express Edition
  • Microsoft Visual Basic 2008 Express Edition
  • Une version du serveur Web Microsoft IIS nativement présent dans plusieurs versions de Windows. Pour son installation je ne la détaille pas ici, faites une recherche sur Google)

Pour commencer nous allons créer notre service web, je vous invite donc à ouvrir VWD (Visual Web Developer) et à créer un nouveau projet « Service Web ASP.Net ». Nous commencerons par concevoir notre service web en mode « système de fichier » puis nous le publierons en suite sur notre serveur locale IIS.

Figure 1 - Création d'un nouveau projet.

Ouvrez VWD et créer un nouveau projet de type « Service Web ASP.NET ».
Sélectionnez « Système de fichiers » puis parcourez votre répertoire de travail.
Nommez le répertoire de l'application « MonWebService » (Voir fig. 1).

Figure 2 - Visual Web Developer.

VWD nous crée alors un projet avec dans l'explorateur de solution, un ficher portant l'extension asmx, un fichier web.config et une classe nommée Service.vb. Cette dernière est ouverte dans l'éditeur de code.
Vous pouvez alors voir le code suivant :

'
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols

' Pour autoriser l'appel de ce service Web depuis un script à l'aide d'ASP.NET AJAX,
' supprimez les marques de commentaire de la ligne suivante.
' <System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

Public Class Service
Inherits System.Web.Services.WebService
<WebMethod()> _

Public Function HelloWorld() As String
    Return "Hello World"
End Function

End Class

Ce code n'est autre que la déclaration de la classe comportant, par défaut, une méthode bien connue de tous les programmes conçus à titre d'exemple dont le nom est « HelloWord ». Le plus important dans cette méthode, pour les acolytes du VB, qui l'auront remarqué c'est l'attribut « WebMethod » qui spécifie à la classe que cette méthode sera disponible via le Web.

A partir de cette classe nous allons développer une méthode, que nous appellerons plus tard depuis notre application. Cette méthode, va nous permettre d'envoyer un simple email.

Où est l'intérêt ?

J'ai souvent constaté sur le forum de vbfrance que des membres cherchaient un moyen d'envoyer un email depuis leurs applications et ce pour diverses raisons (inscription du produit, demande de compte, envoi d'informations personnelles). Cependant, et à ma connaissance, il n'existe que deux moyens d'envoyer un email depuis une application Winform :

  • Via le code behind et les classes « MailMessage » et « SmtpClient » de l'espace de noms « System.Net »
  • Via l'exécution de la commande : « mailto »

L'une comme l'autre ne conviennent pas. Dans la première, il faut renseigner les paramètres SMTP, soit en saisissant ceux du compte de l'éditeur, ce qui comporte un gros risque de sécurité, soit ceux de l'utilisateur qui n'a que faire de saisir ses paramètres de compte pour un simple enregistrement. De plus la plupart des FAI bloquent les ports SMTP sortant. Pour ce qui est de la seconde, elle requière l'installation et la configuration d'un client web.

C'est donc pour cette raison que j'ai choisi cette solution alternative. (Tant qu'à faire un exemple de programme autant qu'il puisse servir)

Attention : Vous devez disposer d'un hébergement ASP.Net.

Mais revenons à nous boutons ;O)

Nous allons donc remplacer notre « peu utile » fonction HelloWord par le code qui suit :

'
<WebMethod()> _
Public Function SendMail(ByVal Destinataite As String, ByVal Subject As String, _
ByVal Body As String) As Boolean
'
Dim SMTP As New Net.Mail.SmtpClient
Dim Mail As New Net.Mail.MailMessage
'
With Mail
    .To.Add(New Net.Mail.MailAddress(Destinataite))
    .Subject = Subject
    .Body = Body
    .IsBodyHtml = False
End With
'
Try
    SMTP.Send(Mail)
    Return True

    Catch ex As Exception

    Return False
End Try
'
End Function

Pour que notre classe SMTP puisse envoyer des mails, il faudra lui préciser des paramètres SMTP. Nous aurions pu le faire via le code behind, cependant j'ai choisi de monter une autre méthode.

Puisque notre Web Service n'est rien d'autre qu'une application ASP.Net, nous passerons cette étape via l'Outil d'administration de site Web ASP.Net. Autant profiter de cet avantage.

Figure 3 - Explorateur de solutions.

Pour lancer cet outil, cliquez sur le bouton situé dans la barre d'outils de l'explorateur de solutions de VWD (voir fig. 3).

Figure 4 - Outil d'administration de site web ASP.Net.

Vous devriez voir s'afficher la page montrée en figure3 dans une nouvelle fenêtre de votre navigateur favori. Cet assistant a pour seul but de nous aider à configurer notre application Web. Son rôle permet l'édition de notre fichier de configuration (web.config) très simplement. Dirigez-vous sur l'onglet « Application » et cliquez sur le lien « Configurer les paramètres de messagerie SMTP » dans la section «Paramètres SMTP » pour voir apparaître à l'écran, la page web de la figure 5.

Figure 5 - Outil d'administration de site web ASP.Net.

Saisissez vos paramètres SMTP actuels. Si votre serveur SMTP requière une authentification, ne manquez pas de renseigner les champs de l'option « Authentification / de base ». Après avoir validé votre saisie vous pouvez fermer l'outil.
Maintenant je vous invite à double cliquer sur votre fichier web.config dans l'explorateur de solution.

<system.net>

<mailSettings>

<smtp from="xxxxxxxxx">

<network host="xxxxxxxxx" password="xxxxx" userName="xxxxxx" />

</smtp>

</mailSettings>

</system.net>

Tout en bas de votre fichier web.config, vous pourrez voir que notre outil a bien fait son travail. Il a saisi pour nous toutes les sections et les paramètres relatifs à notre compte.

Notre service web est maintenant opérationnel, je vous propose de le tester sans plus attendre, en pressant la touche F5 de votre clavier. La figure 6 apparaît dans votre navigateur web.

Figure 6 - Exécution du service Web.

Cette fenêtre vous expose toutes les méthodes de votre classe. Ici, nous n'en avons qu'une « SendMail ». Cliquer sur le lien pour être redirigé vers la page permettant d'exécuter la méthode.

Figure 7 - Exécution du service Web (Procédure SendMail).

Remplissez les champs de façon à pouvoir vous envoyer un email, puis cliquez sur le bouton « Appeler » pour voir s'afficher à l'écran le résultat sous forme de fichier XML.

<?xml version="1.0" encoding="utf-8" ?>

<boolean xmlns="http://tempuri.org/">true</boolean>

Si votre email a bien été envoyé la réponse est sans appel, vous devriez avoir la valeur « True » de retournée, dans le cas contraire, c'est que la configuration SMTP n'est pas correcte ou qu'au moment de votre envoi, la connexion a été interrompue.

Maintenant que notre service Web fonctionne nous allons le publier sous IIS.
Pour cela :
Cliquez sur démarrer, puis exécuter.
Dans le champ qui s'affiche saisissez la commande suivante : « mmc %systemroot%\system32\inetsrv\iis.msc »

Vous devriez voir le panneau de configuration d'Internet Information Service s'ouvrir (fig. 8)

Figure 8 - Gestionnaire de services Internet (IIS)

Développez le noeud « PC-DE... » Ou « Serveur », cliquez ensuite sur le dossier sites. Dans la marge de droite, cliquez sur le lien « Ajouter un site web » (fig. 9).

Figure 9 - Gestionnaire de services Internet (IIS)

Saisissez « MonServiceWeb » dans le champ « Nom du site » puis renseignez l'emplacement de votre projet de service web ASP.NET. Si vous êtes sous Windows 7, je vous conseille de déplacer votre projet hors des dossiers utilisateur sous peine d'obtenir des refus d'accès. (Déplacez votre projet à la racine de votre disque ou simplement dans le répertoire « x:\inetpub\wwwroot », x étant la lettre de votre lecteur système).

Figure 10 - Ajout d'un site Web.

Validez le tout, en cliquant sur « OK ». Vous devriez avoir à l'écran la figure 11.

Figure 11 - Gestionnaire de services Internet (IIS)

Votre service est maintenant disponible à l'adresse http://localhost/service.asmx. Bien sur, si vous publiez celui-ci chez votre hébergeur l'adresse sera différente. Je voulais vous faire remarquer que ce service web sera disponible à n'importe qu'elle personne se connectant à cette adresse. Il est donc important de créer un système d'authentification via ASP.Net !

Comme ceci ne s'expliquant pas en quelques simples lignes, je n'aborderais pas ce sujet dans ce tutoriel.
Je vous invite à consulter ce lien pour plus d'informations.

Voici la fin de notre première partie, nous avons conçu et déployé notre service Web. Vous pouvez maintenant fermer Visual Web Developer.

Consommation du service

Pour cette seconde partie, je vous invite à ouvrir Visual Basic Express 2008 et à créer un nouveau projet Winform.

Figure 12 - Nouveau projet.

Nommez ce projet « DemoServiceWeb » puis validez en cliquant sur « OK ». Enregistrez ce projet sur le disque dans le répertoire de votre choix.

Sur votre « Form1 » placez un bouton nommé « cmd_Enregistrement » et changez le texte de celui-ci comme sur la figure 13.

Figure 13 - Form1.

Ajoutez une boîte de dialogue à votre projet, renommez-la « dlg_Enreg » et ajoutez les composants suivant sur celle-ci :

  • Quatre TextBox nommés « txt_Name », « txt_ZC », « txt_Town » et « txt_Mail »,
  • Un ComboBox nommé « cbo_Choise », dont les éléments seront « Je ne sais pas », « Personnelle », « Professionnelle », « Les deux ». Changez la propriété « DropDownStyle » à « DropDownList ».
  • Une ProgressBar dont la propriété « Visible » sera placée sur « False » par défaut et la propriété « Style » sur « Marquee ».
  • Ajoutez des labels de façon à ce que votre boite de dialogue ressemble à la figure 14.

Figure 14 - dlg_Enreg.

Ceci fait, nous allons créer une classe proxy permettant de consommer notre service Web. Dans l'explorateur de solution, faites un clic avec le bouton droit de votre souris puis sélectionnez « Ajoutez une référence de service ».

Figure 15 - Ajout d'une référence de service.

Saisissez l'adresse de votre service (http://localhost/service.asxm) dans le champ « Adresse » puis « WebService » dans le champ « Espace de noms » puis cliquez sur « Avancé ».

Figure 16 - Ajout d'une référence de service - paramètres avancés.

Cochez la case « Générer des méthodes asynchrones » puis valider avec le bouton « OK ». Validez de nouveau la création de notre référence de service.

Figure 17 - Explorateur de solutions.

Vous pouvez maintenant apercevoir celle-ci dans l'explorateur de solution (fig. 17). Passons maintenant à la partie la plus intéressante (enfin je dis cela pour moi). Le code behind.

Nous commencerons par le plus simple, saisir dans la procédure « Click » de notre « cmd_Enregistrement » le code permettant d'afficher à l'écran notre « dlg_Enreg ».

'
Private Sub cmd_Enregistrement_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmd_Enregistrement.Click
'
dlg_Enreg.ShowDialog()
'
End Sub

Puis dans notre dlg_Enreg nous écrirons :

'
'
'Déclaration de notre classe "Service"
Private WithEvents svc As New WebService.ServiceSoapClient
'
'
'Événement déclenché lors du charment du formulaire
Private Sub dlg_Enreg_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
'
'Changement de la sélection de notre liste de choix
cbo_Choise.SelectedIndex = 0
'
End Sub
'
Private Sub OK_Button_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles OK_Button.Click
'
Try
    'Pour que notre enregistrement soit efficace, il faudrait une gestion
    'des erreurs de saisie, vous pouvez pour cela utiliser un ErrorProvider,
    'et contrôler la taille des valeurs saisies dans les TextBox.
    '
    'Ouvre la connexion de la classe proxy vers notre service web.
    svc.Open()
    '
    'Formatage du corps du message
    Dim Body As String = "Message d'enregistrement auto-généré le :" & _
    Now.ToString & _
    Environment.NewLine & _
    "------------------------------------" & _
    Environment.NewLine & _
    Environment.NewLine & _
    "Nom complet : " & txt_Name.Text & _
    Environment.NewLine & _
    "Code postal : " & txt_ZC.Text & _
    Environment.NewLine & _
    "Nom complet : " & txt_Town.Text & _
    Environment.NewLine & _
    "Adresse email : " & txt_Mail.Text & _
    Environment.NewLine & _
    Environment.NewLine & _
    "Utilisation : " & cbo_Choise.Text
    '
    'Appel de la méthode "SendMail" de notre service Web de
    'façon asynchrone pour éviter le blocage du thread de l'application
    'durant la transaction. N'oublier pas de préciser votre adresse email.
    svc.SendMailAsync("monmail@domaine.com", "Enregistrement", Body)
    '
    'Mise à jour des contrôles du formulaire.
    OK_Button.Enabled = False
    pg_Wait.Visible = True
    '
    
    Catch ex As Exception

    '
        Call Echec()
    '
End Try
End Sub
'
'Cet événement est déclenché par notre référence de service
'lorsque la réponse du serveur est obtenue.
Private Sub svc_EndSendAsync(ByVal sender As Object, _
ByVal e As WebService.SendMailCompletedEventArgs) Handles svc.SendMailCompleted
'
pg_Wait.Visible = False
OK_Button.Enabled = True
'
'La propriété Error retourne l'exception généré par la méthode.
'Si aucune exception n'est généré elle a pour valeur Nothing.
If e.Error IsNot Nothing Then
'
    Call Echec()
'
Else
    '
    'La propriété résult est le résultat retourné par la fonction SendMail
    'de la classe service de notre service web, elle est bien de type boolean
    'comme nous l'avons définie dans notre méthode.
    If e.Result = True Then
        '
        MessageBox.Show("Merci d'avoir enregistré votre logiciel.", _
        "Enregistrement effectué !", _
        MessageBoxButtons.OK, _
        MessageBoxIcon.Information)
        '
    Else
        '
        Call Echec()
        '
    End If
    '
End If
'
End Sub
'
'Méthode qui permet l'affichage d'un message d'erreur
Private Sub Echec()
'
MessageBox.Show("Le service es indisponible, merci de réessayer ultérieurement.", _
"Echec de l'enregistrement", _
MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
'
End Sub
'
'Evénement qui survient lors de la fermeture de notre formulaire
Private Sub dlg_Enreg_FormClosing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
'
If svc IsNot Nothing AndAlso _
    svc.State <> ServiceModel.CommunicationState.Closed Then
    svc.Abort()
    svc.Close()
End If
'
End Sub
'
Private Sub Cancel_Button_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Cancel_Button.Click
    Me.Close()
End Sub

Conclusion

Dans ce tutoriel vous aurez pu voir comme il est aisé de concevoir et de consommer un service Web ASP .net.

Nous avons vu également que Visual Basic génère des méthodes asynchrones coté client en faisant travailler la méthode dans un autre thread que le thread principal de l'application et ce de façon totalement transparente pour le développeur qui consomme le service Web. Les méthodes synchrones restant cependant toujours disponibles.

Nous avons étudié le principe de base des services web cependant pour ceux qui désirent pousser plus loin l'aventure, vous pouvez voir le code généré par la classe Proxy via WSDL. Pour cela, cliquez sur le menu « Projet dans Visual Basic » et cochez le menu « Afficher tous les fichiers », vous pouvez désormais développer le noeud que compose votre référence de service, et voir comment celle-ci a été conçu.

A voir également
Ce document intitulé « Création et consommation de service web asp.net » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous