5. .NET-clients van de J2EE-service voor afspraken
5.1. Een C# 2008-client
We gaan er nu vanuit dat de vorige webservice beschikbaar en actief is. Een webservice kan worden gebruikt door clients die in verschillende talen kunnen zijn geschreven. We gaan hier een C#-consoleclient schrijven om de lijst met artsen weer te geven.
![]() |
Laten we beginnen met het aanmaken van het C#-project:
![]() |
We maken een console-applicatie [1] met de naam [ListeDesMedecins] [2]. In [3] maken we een verwijzing naar een webservice. Deze tool is vergelijkbaar met die in NetBeans: hij maakt een lokale proxy van de externe webservice.
![]() |
- In [1] geeft men de URI op van het bestand WSDL van de webservice (zie paragraaf 4.10.2).
- In [2] wordt de wizard gevraagd om de webservices te detecteren die onder deze URI beschikbaar zijn
- in [3] wordt de gevonden webservice vermeld en in [4] de methoden die deze aanbiedt.
- in [5] wordt aangegeven in welke naamruimte de klassen van proxy C moeten worden gegenereerd
- in [6] wordt de C-proxy gegenereerd.
![]() |
- in [1], de webverwijzing die we zojuist hebben aangemaakt. Laten we erop dubbelklikken.
- in [2], de objectverkenner die door de dubbelklik is geopend.
- in [3] selecteren we de naamruimte [ListeDesMedecins.Ws.RdvMedecins], de naamruimte van de gegenereerde C-proxy. De eerste term [ListeDesMedecins] is de standaardnaamruimte van de aangemaakte C#-toepassing (we hebben deze ListeDesMedecins genoemd). De tweede term, [Ws.Rdvmedecins], is de naamruimte die we in de wizard aan de C-proxy hebben toegekend. Uiteindelijk bevinden de objecten van de C-proxy zich in de naamruimte [ListeDesMedecins.Ws.RdvMedecins].
- In [4] bevinden zich de objecten van de gegenereerde C-proxy
![]() |
- in [5] is [WsDaoJpaClient] de klasse die de methoden van de externe webservice lokaal implementeert.
- in [6], de methoden van de klasse [WsDaoJpaClient]. Hierin vinden we de methoden van de externe webservice terug, zoals bijvoorbeeld de methode getAllClients in [7].
Laten we de code van de gegenereerde entiteiten eens bekijken:
![]() |
In [1] hierboven wordt gevraagd om de code van de klasse [client] te bekijken:
...
public partial class client : personne {
}
....
public partial class personne : object, System.ComponentModel.INotifyPropertyChanged {
...
public long id {
...
}
...
}
Hierboven hebben we alleen de code behouden die nodig is voor onze analyse.
- regel 2: de klasse [client] is afgeleid van de klasse [personne], net als in de webservice.
- regel 8: een openbare eigenschap van de klasse [personne]
Wat opvalt, is dat de gegenereerde code niet voldoet aan de gebruikelijke coderingsnormen van C#. De namen van klassen en openbare eigenschappen zouden met een hoofdletter moeten beginnen.
Laten we teruggaan naar onze C#-toepassing:
![]() |
[Program.cs] [1] is de testklasse. De code ervan is als volgt:
using System;
using ListeDesMedecins.Ws.RdvMedecins;
using Client = ListeDesMedecins.Ws.RdvMedecins.client;
namespace ListeDesMedecins {
class Program {
static void Main(string[] args) {
try {
// instantie van de [dao]-laag van de client
WsDaoJpaClient dao = new WsDaoJpaClient();
// lijst met artsen
foreach (Client client in dao.getAllClients()) {
Console.WriteLine(String.Format("{0} {1} {2}", client.titre, client.prenom, client.nom));
}
} catch (Exception e) {
Console.WriteLine(e);
}
}
}
}
Op regel 12 wordt de klasse [Client] van de C-proxy gebruikt, terwijl we zojuist hebben gezien dat deze in werkelijkheid [client] heet. Dankzij de declaratie op regel 3 kunnen we [Client] gebruiken in plaats van [client]. Zo voldoen we aan de coderingsnorm voor klassenamen. Nog steeds in regel 12 wordt de methode [getAllClients] gebruikt, omdat ze zo heet in de C-proxy. Volgens de C#-coderingstandaard zou ze [GetAllClients] moeten heten.
Het uitvoeren van het voorgaande programma [1] levert de resultaten op die worden weergegeven in [2].
5.2. Een eerste client ASP.NET 2008
We schrijven nu een eerste client ASP.NET / C# om de lijst met clients weer te geven.
![]() |
In deze architectuur zijn er twee webservers:
- de server waarop de externe webservice draait
- de server waarop de client ASP.NET voor de externe webservice draait
We gaan het webproject van de client ASP.NET maken met de versie Visual Web Express 2008 SP1. In de volgende paragraaf wordt uitgelegd hoe je hetzelfde project kunt maken als je de versie SP1 van Visual Web Express 2008 niet hebt.
![]() |
We maken een toepassing web [1, 2, 3] met de naam [ListeDesClients1] [4,5,6]. Het aldus aangemaakte project is zichtbaar in [7].
![]() |
- In [5] voeg je met een rechtermuisklik op de projectnaam een webserviceverwijzing toe.
- In [6] geeft u de URI op van het bestand WSDL van de webservice (zie paragraaf 4.10.2).
- In [7] vraagt u de wizard om de webservices te detecteren die onder deze URI beschikbaar zijn.
![]() |
- in [8] wordt de gevonden webservice weergegeven en in [9] de methoden die deze aanbiedt.
- In [10] wordt aangegeven in welke naamruimte de klassen van proxy C moeten worden gegenereerd
- in [11] wordt de gegenereerde webdienstreferentie weergegeven
Een dubbelklik op de referentie [Ws.Rdvmedecins] [12] toont de gegenereerde klassen en interfaces voor de C-proxy:
![]() |
- in [1], de objectverkenner die door de dubbelklik wordt geopend.
- In [2] selecteert u de naamruimte [ListeDesClients1.Ws.RdvMedecins], de naamruimte van de gegenereerde C-proxy. De eerste term [ListeDesClients1] is de standaardnaamruimte van de aangemaakte toepassing ASP.NET (we hebben deze ListeDesClients1 genoemd). De tweede term, [Ws.Rdvmedecins], is de naamruimte die we in de wizard aan de C-proxy hebben toegekend. Uiteindelijk hebben de objecten van de C-proxy de naamruimte [ListeDesClients1.Ws.RdvMedecins].
- In [3] bevinden zich de objecten van de gegenereerde C-proxy
![]() |
- in [4] is [WsDaoJpaService] de klasse die de methoden van de externe webservice lokaal implementeert.
- in [5], de methoden van de klasse [WsDaoJpaService]. Hierin vinden we de methoden van de externe webservice terug, zoals bijvoorbeeld de methode getAllClients in [6].
Laten we de code van de gegenereerde entiteiten eens bekijken:
![]() |
In de hierboven genoemde [1] wordt gevraagd om de code van de klasse [client] te bekijken:
public partial class client : personne {
}
...
public partial class personne {
...
public long id {
...
}
Hierboven hebben we alleen de code behouden die nodig is voor onze analyse.
- regel 1: de klasse [client] is afgeleid van de klasse [personne], net als in de webservice.
- regel 5: de klasse [personne]
- regel 7: een openbare eigenschap van de klasse [personne]
We zien hier code die vergelijkbaar is met de code die al in paragraaf 5.1 voor de C#-client is besproken.
- De naamruimte van de gegenereerde C-proxy is die welke is gedefinieerd in de aanmaakwizard, voorafgegaan door de naamruimte van het webproject zelf: ListeDesClients1.Ws.RdvMedecins
- De proxyklasse die de methoden van de externe webservice lokaal implementeert, heet WsDaoJpaService.
- De namen van klassen en eigenschappen beginnen met een kleine letter
We kunnen een pagina [Default.aspx] schrijven die de lijst met klanten weergeeft. De pagina ziet er als volgt uit:
![]() |
Nr. | Type | Naam | Rol |
MultiView | Weergaven | Weergavecontainer | |
Weergave | VueClients | de weergave met de klantenlijst | |
Repeater | RepeaterClients | geeft de klantenlijst weer in de vorm van een lijst met opsommingstekens | |
Weergave | VueErreurs | de weergave waarin een eventuele fout wordt getoond | |
Label | LabelErreur | de foutmelding |
De weergavecode van deze pagina is als volgt:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ListeDesClients1._Default" %>
<%@ Import Namespace="ListeDesClients1.Ws.RdvMedecins" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Liste des clients</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:MultiView ID="Vues" runat="server">
<asp:View ID="VueClients" runat="server">
Liste des clients :<br />
<br />
<ul>
<asp:Repeater ID="RepeaterClients" runat="server">
<ItemTemplate>
<li>
<%#(Container.DataItem als client).naam%>,
<%#(Container.DataItem als client).voornaam%>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</asp:View>
<asp:View ID="VuesErreurs" runat="server">
L'erreur suivante s'est produite :<br />
<br />
<asp:Label ID="LabelErreur" runat="server"></asp:Label></asp:View>
</asp:MultiView><br />
</div>
</form>
</body>
</html>
Let op: in regel 3 moet de naamruimte [ListeDesClients1.Ws.RdvMedecins] van de C-proxy van de webservice worden geïmporteerd, zodat de klasse [client] in de regels 20 en 21 toegankelijk is.
De controlecode [Default.aspx.cs] die bij de presentatiepagina [Default.aspx] hoort, is als volgt:
using System;
using ListeDesClients1.Ws.RdvMedecins;
namespace ListeDesClients1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
// lokale proxy-instantie van de externe laag [dao]
WsDaoJpaService dao = new WsDaoJpaService();
// klantweergave
Vues.ActiveViewIndex = 0;
// initialisatie van de clientweergave
RepeaterClients.DataSource = dao.getAllClients();
RepeaterClients.DataBind();
}
catch (Exception ex)
{
// foutweergave
Vues.ActiveViewIndex = 1;
//initialisatie foutweergave
LabelErreur.Text = ex.ToString();
}
}
}
}
- regel 8: de methode Page_Load wordt uitgevoerd bij het eerste laden van de pagina. Dit laden vindt plaats bij elk verzoek van een client die de pagina opvraagt.
- regel 13: de lokale proxy C wordt geïnstantieerd. Deze proxy C implementeert de interface van de externe webservice. De applicatie zal communiceren met deze proxy C.
- regel 15: als er geen uitzondering optreedt bij het instantiëren van de lokale proxy C, moet de weergave met de naam "VueClients" worden weergegeven, c.a.d. Weergave nr. 0 in de "Weergaven" van de pagina MultiView.
- regel 17: de gegevensbron van répéteur is de lijst met klanten die wordt geleverd door de methode getAllClients van de C-proxy.
- regel 23: in geval van een uitzondering bij het instantiëren van de lokale proxy C, moet de weergave met de naam "VueErreurs" worden weergegeven, c.a.d. weergave nr. 1 in de "Weergaven" van de pagina MultiView.
- regel 25: de uitzondering wordt weergegeven in de label "LabelErreur".
De uitvoering van het webproject levert het volgende resultaat op:
![]() |
5.3. Een tweede ASP.NET-client 2008
We schrijven nu een tweede client ASP.NET / C#, ditmaal met de versie Visual Web Developer Express 2008 die voorafging aan de versie SP1.
![]() |
Laten we het webproject van de client .NET aanmaken:
![]() |
We maken een website web [1, 2] met de naam [ListeDesClients] [3].
![]() |
- in [4], het webproject
- in [5]; door met de rechtermuisknop op de projectnaam te klikken, voegt men een serviceverwijzing toe zoals eerder is gedaan.
- in [6], het project nadat de verwijzing naar de externe webservice is toegevoegd
In tegenstelling tot het eerder besproken webproject SP1 heeft men via de objectverkenner geen toegang tot de objecten van de webdienstclient.
Wat u moet weten:
- de naamruimte van de gegenereerde C-proxy is die welke is gedefinieerd in de aanmaakwizard: Ws.RdvMedecins
- de proxyklasse die de methoden van de externe webservice lokaal implementeert, heet WsDaoJpaClient.
- de namen van klassen en eigenschappen beginnen met een kleine letter
We kunnen een pagina [Default.aspx] schrijven die de lijst met klanten weergeeft. De pagina ziet er als volgt uit:
![]() |
Nr. | Type | Naam | Rol |
MultiView | Weergaven | Weergavecontainer | |
Weergave | VueClients | de weergave met de klantenlijst | |
Repeater | RepeaterClients | geeft de klantenlijst weer in de vorm van een lijst met opsommingstekens | |
Weergave | VueErreurs | de weergave waarin een eventuele fout wordt getoond | |
Label | LabelErreur | de foutmelding |
De weergavecode van deze pagina is als volgt:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Import Namespace="Ws.RdvMedecins" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Liste des clients</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:MultiView ID="Vues" runat="server">
<asp:View ID="VueClients" runat="server">
Liste des clients :<br />
<br />
<ul>
<asp:Repeater ID="RepeaterClients" runat="server">
<ItemTemplate>
<li>
<%#(Container.DataItem als klant).achternaam%>, <%#(Container.DataItem als klant).voornaam%>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</asp:View>
<asp:View ID="VuesErreurs" runat="server">
L'erreur suivante s'est produite :<br />
<br />
<asp:Label ID="LabelErreur" runat="server"></asp:Label></asp:View>
</asp:MultiView><br />
</div>
</form>
</body>
</html>
Let op: in regel 2 moet de naamruimte [Ws.RdvMedecins] van de C-proxy van de webservice worden geïmporteerd, zodat de klasse [client] uit regel 19 toegankelijk is.
De controlecode [Default.aspx.cs] die bij de presentatiepagina [Default.aspx] hoort, is als volgt:
using System;
using Ws.RdvMedecins;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
// lokale proxy-instantie van de externe laag [dao]
WsDaoJpaClient dao = new WsDaoJpaClient();
// klantweergave
Vues.ActiveViewIndex = 0;
// initialisatie van de clientweergave
RepeaterClients.DataSource = dao.getAllClients();
RepeaterClients.DataBind();
}
catch (Exception ex)
{
// foutweergave
Vues.ActiveViewIndex = 1;
//initialisatie foutweergave
LabelErreur.Text = ex.ToString();
}
}
}
Deze code is vergelijkbaar met die van de vorige versie. De uitvoering van het webproject levert het volgende resultaat op:




















