Skip to content

5. .NET-Clients des J2EE-Termin-Dienstes

5.1. Ein C# 2008-Client

Wir gehen nun davon aus, dass der zuvor beschriebene Webdienst verfügbar und aktiv ist. Ein Webdienst kann von Clients genutzt werden, die in verschiedenen Sprachen geschrieben sind. Hier schreiben wir einen C#-Konsolen-Client, um die Liste der Ärzte anzuzeigen.

Beginnen wir mit der Erstellung des C#-Projekts:

Wir erstellen eine Konsolenanwendung [1] mit dem Namen [ListeDesMedecins] [2]. In [3] erstellen wir eine Referenz auf einen Webdienst. Dieses Tool ähnelt dem in NetBeans verwendeten: Es erstellt einen lokalen Proxy für den Remote-Webdienst.

  • Geben Sie in [1] die URI der WSDL-Datei des Webdienstes an (siehe Abschnitt 4.10.2).
  • In [2] weisen wir den Assistenten an, die unter dieser URI verfügbaren Webdienste zu ermitteln
  • In [3] wird der gefundene Webdienst angezeigt, und in [4] die von ihm bereitgestellten Methoden.
  • Geben Sie in [5] den Namespace an, in dem die C-Proxy-Klassen generiert werden sollen
  • In [6] wird der C-Proxy generiert.
  • In [1] die soeben erstellte Webreferenz. Doppelklicken Sie darauf.
  • In [2] der durch Doppelklick geöffnete Objekt-Explorer.
  • Wählen Sie in [3] den Namespace [ListeDesMedecins.Ws.RdvMedecins] aus, bei dem es sich um den Namespace des generierten C-Proxys handelt. Der erste Teil [ListeDesMedecins] ist der Standard-Namespace der erstellten C#-Anwendung (wir haben sie ListeDesMedecins genannt). Der zweite Teil [Ws.RdvMedecins] ist der Namespace, den wir dem C-Proxy im Assistenten zugewiesen haben. Letztendlich gehören die C-Proxy-Objekte zum Namespace [ListeDesMedecins.Ws.RdvMedecins].
  • In [4] sind die Objekte des generierten C-Proxys
  • in [5] ist [WsDaoJpaClient] die Klasse, die die Methoden des Remote-Webdienstes lokal implementiert.
  • In [6] sind die Methoden der Klasse [WsDaoJpaClient] aufgeführt. Hier finden wir die Methoden des Remote-Webdienstes, wie beispielsweise die Methode getAllClients in [7].

Sehen wir uns den Code für die generierten Entitäten an:

In [1] oben fordern wir die Anzeige des Codes für die Klasse [client] an:


...
    public partial class client : personne {
    }
 
....
    public partial class personne : object, System.ComponentModel.INotifyPropertyChanged {
    ...
        public long id {
       ...
        }
 
...
}

Oben haben wir nur den für unsere Studie erforderlichen Code aufgeführt.

  • Zeile 2: Die Klasse [customer] leitet sich von der Klasse [person] ab, genau wie im Webservice.
  • Zeile 8: Eine öffentliche Eigenschaft der Klasse [person]

Uns fällt auf, dass der generierte Code nicht den Standardkonventionen für C#-Programmierung entspricht. Die Namen von Klassen und öffentlichen Eigenschaften sollten mit einem Großbuchstaben beginnen.

Kehren wir zu unserer C#-Anwendung zurück:

[Program.cs] [1] ist die Testklasse. Ihr Code lautet wie folgt:


using System;
using ListeDesMedecins.Ws.RdvMedecins;
using Client = ListeDesMedecins.Ws.RdvMedecins.client;
 
namespace ListeDesMedecins {
    class Program {
        static void Main(string[] args) {
            try {
                // client [dao] layer instantiation
                WsDaoJpaClient dao = new WsDaoJpaClient();
                // list of doctors
                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);
            }
        }
    }
}

In Zeile 12 wird die Klasse [Client] aus dem C-Proxy verwendet, obwohl wir gerade gesehen haben, dass sie eigentlich [client] hieß. Es ist die Deklaration in Zeile 3, die es uns ermöglicht, [Client] anstelle von [client] zu verwenden. Dadurch können wir die Namenskonvention für Klassen einhalten. Ebenfalls in Zeile 12 wird die Methode [getAllClients] verwendet, da sie im C-Proxy so heißt. Der C#-Codierungsstandard würde verlangen, dass sie [GetAllClients] heißt.

Die Ausführung des vorherigen Programms [1] liefert die in [2] gezeigten Ergebnisse.

5.2. Ein erster ASP.NET 2008-Client

Wir werden nun einen ersten ASP.NET-/C#-Client schreiben, um die Liste der Clients anzuzeigen.

In dieser Architektur gibt es zwei Webserver:

  • derjenige, auf dem der Remote-Webdienst läuft
  • derjenige, auf dem der ASP.NET-Client für den Remote-Webdienst läuft

Wir erstellen das ASP.NET-Client-Webprojekt mit Visual Web Express 2008 SP1. Im folgenden Abschnitt wird gezeigt, wie Sie dasselbe Projekt erstellen können, wenn Sie Visual Web Express 2008 SP1 nicht haben.

Wir erstellen eine Webanwendung [1, 2, 3] mit dem Namen [ClientList1] [4, 5, 6]. Das so erstellte Projekt ist in [7] zu sehen.

  • Klicken Sie in [5] mit der rechten Maustaste auf den Projektnamen, um eine Webdienstreferenz hinzuzufügen.
  • Geben Sie in [6] die URI der WSDL-Datei des Webdienstes an (siehe Abschnitt 4.10.2).
  • Bitten Sie den Assistenten in [7], die unter dieser URI verfügbaren Webdienste zu ermitteln
  • In [8] wird der gefundene Webdienst angezeigt, und in [9] werden die von ihm bereitgestellten Methoden angezeigt.
  • Geben Sie in [10] den Namespace an, in dem die C-Proxy-Klassen generiert werden sollen
  • In [11] die Referenz des generierten Webdienstes

Ein Doppelklick auf die Referenz [Ws.Rdvmedecins] [12] zeigt die für den C-Proxy generierten Klassen und Schnittstellen an:

  • In [1] der durch Doppelklick geöffnete Objekt-Explorer.
  • Wählen Sie in [2] den Namespace [ListeDesClients1.Ws.RdvMedecins] aus, der dem Namespace des generierten C-Proxys entspricht. Der erste Teil [ListeDesClients1] ist der Standard-Namespace der erstellten ASP.NET-Anwendung (wir haben sie ListeDesClients1 genannt). Der zweite Teil [Ws.RdvMedecins] ist der Namespace, den wir dem C-Proxy im Assistenten zugewiesen haben. Letztendlich gehören die C-Proxy-Objekte zum Namespace [ListeDesClients1.Ws.RdvMedecins].
  • In [3] sind die Objekte des generierten C-Proxys
  • In [4] ist [WsDaoJpaService] die Klasse, die die Methoden des Remote-Webdienstes lokal implementiert.
  • In [5] die Methoden der Klasse [WsDaoJpaService]. Hier finden wir die Methoden des Remote-Webdienstes, wie beispielsweise die Methode getAllClients in [6].

Sehen wir uns den Code für die generierten Entitäten an:

In [1] oben fordern wir die Anzeige des Codes für die Klasse [client] an:


public partial class client : personne {
    }
 
...
    public partial class personne {
  ...
        public long id {
...
        }

Oben haben wir nur den für unsere Untersuchung notwendigen Code aufgeführt.

  • Zeile 1: Die Klasse [client] leitet sich von der Klasse [person] ab, genau wie im Webdienst.
  • Zeile 5: Die Klasse [person]
  • Zeile 7: Eine öffentliche Eigenschaft der Klasse [person]

Dieser Code ähnelt dem bereits in Abschnitt 5.1 für den C#-Client besprochenen.

  • Der Namespace des generierten C-Proxys ist derjenige, der im Erstellungsassistenten definiert wurde, vorangestellt ist der Namespace des Webprojekts selbst: ListeDesClients1.Ws.RdvMedecins
  • Die Proxy-Klasse, die die Methoden des Remote-Webdienstes lokal implementiert, heißt WsDaoJpaService.
  • Klassen- und Eigenschaftsnamen beginnen mit einem Kleinbuchstaben

Wir können eine Seite [Default.aspx] erstellen, die die Liste der Kunden anzeigt. Die Seite sieht wie folgt aus:

Nr.
Typ
Name
Rolle
1
MultiView
Ansichten
Ansichtscontainer
2
Ansicht
CustomerView
die Ansicht mit der Kundenliste
3
Repeater
RepeaterClients
zeigt die Liste der Kunden als Aufzählung an
4
Ansicht
ErrorView
die Ansicht, die etwaige Fehler anzeigt
5
Bezeichnung
Fehlerbeschriftung
der Fehlertext

Der Code für diese Seite lautet wie folgt:


<%@ 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 as client).nom%>,
                <%#(Container.DataItem as client).prenom%>
              </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>

Beachten Sie in Zeile 3, dass der Namespace [ListeDesClients1.Ws.RdvMedecins] aus dem C-Proxy des Webdienstes importiert werden muss, damit die Klasse [client] in den Zeilen 20 und 21 zugänglich ist.

Der Steuerungscode [Default.aspx.cs], der der Präsentationsseite [Default.aspx] zugeordnet ist, lautet wie folgt:


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
      {
        // local proxy instantiation of remote [dao] layer
        WsDaoJpaService dao = new WsDaoJpaService();
        // customer view
        Vues.ActiveViewIndex = 0;
        // client view initialization
        RepeaterClients.DataSource = dao.getAllClients();
        RepeaterClients.DataBind();
      }
      catch (Exception ex)
      {
        // error view
        Vues.ActiveViewIndex = 1;
        //initialization error view
        LabelErreur.Text = ex.ToString();
      }
    }
  }
}
  • Zeile 8: Die Page_Load-Methode wird ausgeführt, wenn die Seite zum ersten Mal geladen wird. Dieser Ladevorgang findet jedes Mal statt, wenn ein Client die Seite anfordert.
  • Zeile 13: Der lokale C-Proxy wird instanziiert. Dieser C-Proxy implementiert die Remote-Webservice-Schnittstelle. Die Anwendung kommuniziert mit diesem C-Proxy.
  • Zeile 15: Wenn während der Instanziierung des lokalen C-Proxys keine Ausnahme auftritt, muss die Ansicht mit dem Namen „VueClients“ angezeigt werden, d. h. Ansicht Nr. 0 im MultiView „Vues“ der Seite.
  • Zeile 17: Die Datenquelle des Repeaters ist die Liste der Clients, die von der Methode getAllClients des C-Proxys bereitgestellt wird.
  • Zeile 23: Wenn bei der Instanziierung des lokalen C-Proxys eine Ausnahme auftritt, muss die Ansicht „VueErreurs“ angezeigt werden, d. h. Ansicht Nr. 1 im MultiView „Vues“ der Seite.
  • Zeile 25: Die Ausnahme wird im Label „LabelErreur“ angezeigt.

Die Ausführung des Webprojekts führt zu folgendem Ergebnis:

5.3. Ein zweiter ASP.NET 2008-Client

Wir werden nun einen zweiten ASP.NET-/C#-Client schreiben, diesmal unter Verwendung der Visual Web Developer Express 2008-Version, die dem SP1 vorausging.

Erstellen wir das .NET-Client-Webprojekt:

Wir erstellen eine Website [1, 2] mit dem Namen [ClientList] [3].

  • In [4] fügen wir dem Webprojekt
  • in [5] fügen wir durch einen Rechtsklick auf den Projektnamen wie zuvor eine Dienstreferenz hinzu.
  • In [6] das Projekt, nachdem die Referenz auf den Remote-Webdienst hinzugefügt wurde

Im Gegensatz zu dem zuvor besprochenen SP1-Webprojekt haben wir über den Objekt-Explorer keinen Zugriff auf die Webdienst-Client-Objekte.

Wichtig zu beachten:

  • Der Namespace des generierten C-Proxys ist derjenige, der im Erstellungsassistenten definiert wurde: Ws.RdvMedecins
  • Die Proxy-Klasse, die die Methoden des Remote-Webdienstes lokal implementiert, heißt WsDaoJpaClient.
  • Klassen- und Eigenschaftsnamen beginnen mit einem Kleinbuchstaben

Wir können eine Seite [Default.aspx] erstellen, die die Liste der Clients anzeigt. Die Seite sieht wie folgt aus:

Nr.
Typ
Name
Rolle
1
MultiView
Ansichten
Ansichtscontainer
2
Ansicht
Kundenansicht
die Ansicht, die die Liste der Kunden enthält
3
Repeater
RepeaterClients
zeigt die Kundenliste als Aufzählung an
4
Ansicht
ErrorView
die Ansicht, die etwaige Fehler anzeigt
5
Bezeichnung
Fehlerbeschriftung
der Fehlertext

Der Code für diese Seite lautet wie folgt:


<%@ 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 as client).nom%>, <%#(Container.DataItem as client).prenom%>
                                </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>

Beachten Sie in Zeile 2, dass der Namespace [Ws.RdvMedecins] aus dem C-Proxy des Webdienstes importiert werden muss, damit auf die Klasse [client] in Zeile 19 zugegriffen werden kann.

Der Steuerungscode [Default.aspx.cs], der der Präsentationsseite [Default.aspx] zugeordnet ist, lautet wie folgt:


using System;
using Ws.RdvMedecins;
 
public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    try
    {
      // local proxy instantiation of remote [dao] layer
      WsDaoJpaClient dao = new WsDaoJpaClient();
      // customer view
      Vues.ActiveViewIndex = 0;
      // client view initialization
      RepeaterClients.DataSource = dao.getAllClients();
      RepeaterClients.DataBind();
    }
    catch (Exception ex)
    {
      // error view
      Vues.ActiveViewIndex = 1;
      //initialization error view
      LabelErreur.Text = ex.ToString();
    }
  }
}

Dieser Code ähnelt dem der vorherigen Version. Die Ausführung des Webprojekts liefert das folgende Ergebnis:

Image