Skip to content

5. .NET-Clients des Terminservices J2EE

5.1. Ein C#-Client 2008

Wir gehen nun davon aus, dass der vorherige Webdienst verfügbar und aktiv ist. Ein Webdienst kann von Clients genutzt werden, die in verschiedenen Sprachen geschrieben sein können. Wir wollen hier einen C#-Konsolen-Client schreiben, 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 entfernten Webdienst.

  • In [1] wird die URI der Datei WSDL des Webdienstes angegeben (siehe Abschnitt 4.10.2).
  • In [2] wird der Assistent aufgefordert, die unter dieser URI bereitgestellten Webdienste zu ermitteln
  • In [3] wird der gefundene Webdienst und in [4] die von ihm bereitgestellten Methoden angegeben.
  • In [5] wird angegeben, in welchem Namensraum die Klassen des Proxys C generiert werden sollen
  • In [6] wird der C-Proxy generiert.
  • In [1] wird die soeben erstellte Webreferenz angezeigt. Doppelklicken Sie darauf.
  • In [2]: der durch den Doppelklick geöffnete Objekt-Explorer.
  • In [3] wählen wir den Namespace [ListeDesMedecins.Ws.RdvMedecins] aus, der der Namespace des generierten C-Proxys ist. Der erste Begriff [ListeDesMedecins] ist der Standard-Namespace der erstellten C#-Anwendung (wir haben diese ListeDesMedecins genannt). Der zweite Begriff, [Ws.Rdvmedecins], ist der Namespace, den wir dem C-Proxy im Assistenten zugewiesen haben. Letztendlich befinden sich die Objekte des C-Proxys im Namespace [ListeDesMedecins.Ws.RdvMedecins].
  • In [4] befinden sich die Objekte des generierten C-Proxys
  • in [5] ist [WsDaoJpaClient] die Klasse, die die Methoden des Remote-Webdienstes lokal implementiert.
  • in [6] die Methoden der Klasse [WsDaoJpaClient]. Darin finden sich die Methoden des Remote-Webdienstes, wie zum Beispiel die Methode getAllClients in [7].

Sehen wir uns den Code der generierten Entitäten an:

In [1] oben wird der Code der Klasse [client] angefordert:


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

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

  • Zeile 2: Die Klasse [client] leitet sich wie im Webdienst von der Klasse [personne] ab.
  • Zeile 8: Eine öffentliche Eigenschaft der Klasse [personne]

Auffällig ist, dass der generierte Code nicht den üblichen C#-Codierungsstandards 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 {
                // Instanziierung der Client-Schicht [dao]
                WsDaoJpaClient dao = new WsDaoJpaClient();
                // Liste der Ärzte
                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] des C-Proxys verwendet, obwohl wir gerade gesehen haben, dass sie eigentlich [client] heißt. Dank der Deklaration in Zeile 3 können wir [Client] anstelle von [client] verwenden. So können wir die Konvention zur Benennung von Klassen einhalten. Ebenfalls in Zeile 12 wird die Methode [getAllClients] verwendet, da sie im C-Proxy so heißt. Nach der C#-Namenskonvention müsste sie eigentlich [GetAllClients] heißen.

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

5.2. Ein erster Client ASP.NET 2008

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

In dieser Architektur gibt es zwei Webserver:

  • derjenige, auf dem der Remote-Webdienst ausgeführt wird
  • derjenige, auf dem der Client ASP.NET für den Remote-Webdienst ausgeführt wird

Wir werden das Webprojekt für den Client ASP.NET mit der Version Visual Web Express 2008 SP1 erstellen. Der folgende Abschnitt zeigt, wie man dasselbe Projekt erstellt, wenn man die Version SP1 von Visual Web Express 2008 nicht hat.

Man erstellt eine Anwendung mit dem Namen web [1, 2, 3]. Das so erstellte Projekt ist unter [7] sichtbar.

  • In [5] fügt man durch einen Rechtsklick auf den Projektnamen einen Webdienstverweis hinzu.
  • In [6] geben Sie die URI der Datei WSDL des Webdienstes an (siehe Abschnitt 4.10.2).
  • In [7] wird der Assistent aufgefordert, die unter dieser URI bereitgestellten Webdienste zu ermitteln.
  • In [8] wird der gefundene Webdienst und in [9] die von ihm bereitgestellten Methoden angezeigt.
  • In [10] wird angegeben, in welchem Namensraum die Klassen des Proxy C generiert werden sollen
  • In [11] wird die generierte Webdienstreferenz angezeigt

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

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

Sehen wir uns den Code der generierten Entitäten an:

Im oben genannten [1] wird der Code der Klasse [client] angefordert:


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

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

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

Der Code entspricht dem bereits in Abschnitt 5.1 für den C#-Client erläuterten.

  • Der Namespace des generierten C-Proxys ist derjenige, der in dessen Erstellungsassistenten definiert wurde, vorangestellt durch den Namespace des Webprojekts selbst: ListeDesClients1.Ws.RdvMedecins
  • Die Proxy-Klasse, die die Methoden des Remote-Webdienstes lokal implementiert, heißt WsDaoJpaService.
  • Die Namen der Klassen und Eigenschaften 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
VueClients
Die Ansicht, die die Kundenliste enthält
3
Repeater
RepeaterClients
zeigt die Kundenliste in Form einer Aufzählungsliste an
4
Ansicht
VueErreurs
die Ansicht, die einen eventuellen Fehler anzeigt
5
Bezeichnung
LabelErreur
Fehlertext

Der Quellcode dieser 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 als Client).Nachname%>,
                <%#(Container.DataItem als Client).Vorname%>
              </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 Namensraum [ListeDesClients1.Ws.RdvMedecins] des Proxy C 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
      {
        // lokale Proxy-Instanz der entfernten Schicht [dao]
        WsDaoJpaService dao = new WsDaoJpaService();
        // Client-Ansicht
        Vues.ActiveViewIndex = 0;
        // Initialisierung der Client-Ansicht
        RepeaterClients.DataSource = dao.getAllClients();
        RepeaterClients.DataBind();
      }
      catch (Exception ex)
      {
        // Fehleransicht
        Vues.ActiveViewIndex = 1;
        //Initialisierung der Fehleransicht
        LabelErreur.Text = ex.ToString();
      }
    }
  }
}
  • Zeile 8: Die Methode Page_Load wird beim ersten Laden der Seite ausgeführt. Dieses Laden erfolgt bei jeder Anfrage eines Clients, der die Seite anfordert.
  • Zeile 13: Der lokale Proxy C wird instanziiert. Dieser Proxy C implementiert die Schnittstelle des Remote-Webdienstes. Die Anwendung kommuniziert mit diesem Proxy C.
  • Zeile 15: Wenn bei der Instanziierung des lokalen Proxys C keine Ausnahme auftritt, muss die Ansicht mit dem Namen „VueClients“ angezeigt werden, c.a.d. die Ansicht Nr. 0 in den „Ansichten“ der Seite MultiView.
  • Zeile 17: Die Datenquelle von répéteur ist die von der Methode getAllClients des Proxys C bereitgestellte Kundenliste.
  • Zeile 23: Im Falle einer Ausnahme bei der Instanziierung des lokalen Proxys C muss die Ansicht mit dem Namen „VueErreurs“ angezeigt werden, c.a.d. die Ansicht Nr. 1 in der Seite „Ansichten“ von MultiView.
  • Zeile 25: Die Ausnahme wird im label „LabelErreur“ angezeigt.

Die Ausführung des Webprojekts liefert folgendes Ergebnis:

5.3. Ein zweiter ASP.NET-Client 2008

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

Erstellen wir das Webprojekt des Clients .NET:

Wir erstellen eine Website mit den Bezeichnungen web und [1, 2], die den Namen [ListeDesClients] und [3] trägt.

  • in [4], das Webprojekt
  • in [5]: Durch einen Rechtsklick auf den Projektnamen fügt man eine Dienstreferenz hinzu, wie zuvor beschrieben.
  • in [6], das Projekt nach dem Hinzufügen der Referenz auf den Remote-Webdienst

Im Gegensatz zu dem zuvor behandelten Webprojekt SP1 hat man über den Objekt-Explorer keinen Zugriff auf die Objekte des Webdienst-Clients.

Wissenswertes:

  • Der Namensraum des generierten C-Proxys ist derjenige, der in dessen Erstellungsassistenten definiert wurde: Ws.RdvMedecins
  • Die Proxy-Klasse, die die Methoden des Remote-Webdienstes lokal implementiert, heißt WsDaoJpaClient.
  • Die Namen der Klassen und Eigenschaften 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
VueClients
Die Ansicht, die die Kundenliste enthält
3
Repeater
RepeaterClients
zeigt die Kundenliste in Form einer Aufzählungsliste an
4
Ansicht
VueErreurs
die Ansicht, die einen eventuellen Fehler anzeigt
5
Bezeichnung
LabelErreur
Fehlertext

Der Quellcode dieser 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 als Kunde).Nachname%>, <%#(Container.DataItem als Client).Vorname%>
                                </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 Namensraum [Ws.RdvMedecins] des Proxy C des Webdienstes importiert werden muss, damit die Klasse [client] aus Zeile 19 zugänglich ist.

Der zur Darstellungsseite [Default.aspx] gehörende Steuerungscode [Default.aspx.cs] 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
    {
      // lokale Proxy-Instanz der entfernten Schicht [dao]
      WsDaoJpaClient dao = new WsDaoJpaClient();
      // Client-Ansicht
      Vues.ActiveViewIndex = 0;
      // Initialisierung der Client-Ansicht
      RepeaterClients.DataSource = dao.getAllClients();
      RepeaterClients.DataBind();
    }
    catch (Exception ex)
    {
      // Fehleransicht
      Vues.ActiveViewIndex = 1;
      //Initialisierung der Fehleransicht
      LabelErreur.Text = ex.ToString();
    }
  }
}

Dieser Code entspricht dem der vorherigen Version. Die Ausführung des Webprojekts liefert folgendes Ergebnis:

Image