Skip to content

5. Clientes .NET del servicio J2EE de citas

5.1. Un cliente C# 2008

Suponemos ahora que el servicio web anterior está disponible y activo. Un servicio web puede ser utilizado por clientes que pueden estar escritos en diferentes lenguajes. Nos proponemos aquí escribir un cliente de consola C# para mostrar la lista de médicos.

Empecemos por crear el proyecto C#:

Creamos una aplicación de consola [1] llamada [ListeDesMedecins] [2]. En [3], creamos una referencia a un servicio web. Esta herramienta es similar a la utilizada en NetBeans: crea un proxy local del servicio web remoto.

  • En [1], se indica la URI del archivo WSDL del servicio web (véase el apartado 4.10.2).
  • En [2], se solicita al asistente que detecte los servicios web expuestos en esta URI
  • en [3], el servicio web encontrado y en [4] los métodos que expone.
  • En [5], se especifica en qué espacio de nombres deben generarse las clases del proxy C
  • en [6], se genera el proxy C.
  • En [1], la referencia web que acabamos de crear. Haga doble clic en ella.
  • En [2], el explorador de objetos abierto al hacer doble clic.
  • en [3], seleccionamos el espacio de nombres [ListeDesMedecins.Ws.RdvMedecins], que es el espacio de nombres del proxy C generado. El primer término, [ListeDesMedecins], es el espacio de nombres predeterminado de la aplicación C# creada (la hemos llamado ListeDesMedecins). El segundo término, [Ws.Rdvmedecins], es el espacio de nombres que le hemos asignado al proxy C en el asistente. Finalmente, los objetos del proxy C se encuentran en el espacio de nombres [ListeDesMedecins.Ws.RdvMedecins].
  • En [4], los objetos del proxy C generado
  • en [5], [WsDaoJpaClient] es la clase que implementa localmente los métodos del servicio web remoto.
  • en [6], los métodos de la clase [WsDaoJpaClient]. En ella se encuentran los métodos del servicio web remoto, como por ejemplo el método getAllClients en [7].

Examinemos el código de las entidades generadas:

En [1], arriba, se solicita ver el código de la clase [client]:


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

Arriba, solo hemos conservado el código necesario para nuestro estudio.

  • línea 2: la clase [client] deriva de la clase [personne], al igual que en el servicio web.
  • línea 8: una propiedad pública de la clase [personne]

Lo que observamos es que el código generado no respeta las normas habituales de codificación de C#. Los nombres de las clases y de las propiedades públicas deberían comenzar con mayúscula.

Volvamos a nuestra aplicación C#:

[Program.cs] [1] es la clase de prueba. Su código es el siguiente:


using System;
using ListeDesMedecins.Ws.RdvMedecins;
using Client = ListeDesMedecins.Ws.RdvMedecins.client;

namespace ListeDesMedecins {
    class Program {
        static void Main(string[] args) {
            try {
                // instanciación de la capa [dao] del cliente
                WsDaoJpaClient dao = new WsDaoJpaClient();
                // lista de médicos
                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);
            }
        }
    }
}

En la línea 12, se utiliza la clase [Client] del proxy C, cuando acabamos de ver que en realidad se llamaba [client]. Es la declaración de la línea 3 la que nos permite utilizar [Client] en lugar de [client]. Esto nos permite respetar la norma de codificación de los nombres de clase. Siguiendo en la línea 12, se utiliza el método [getAllClients] porque así es como se llama en el proxy C. La norma de codificación de C# exigiría que se llamara [GetAllClients].

La ejecución del programa [1] anterior da los resultados que se muestran en [2].

5.2. Un primer cliente ASP.NET 2008

Ahora escribimos un primer cliente ASP.NET / C# para mostrar la lista de clientes.

En esta arquitectura, hay dos servidores web:

  • el que ejecuta el servicio web remoto
  • el que ejecuta el cliente ASP.NET del servicio web remoto

Vamos a crear el proyecto web del cliente ASP.NET con la versión Visual Web Express 2008 SP1. El siguiente párrafo muestra cómo crear el mismo proyecto si no se dispone de la versión SP1 de Visual Web Express 2008.

Se crea una aplicación web [1, 2, 3] llamada [ListeDesClients1] [4,5,6]. El proyecto así creado se puede ver en [7].

  • En [5], al hacer clic con el botón derecho del ratón sobre el nombre del proyecto, se añade una referencia al servicio web.
  • En [6], se indica la URI del archivo WSDL del servicio web (véase el apartado 4.10.2).
  • En [7], se solicita al asistente que detecte los servicios web expuestos en esta URI
  • En [8] se muestra el servicio web encontrado y en [9] los métodos que expone.
  • En [10], se especifica en qué espacio de nombres deben generarse las clases del proxy C
  • en [11], la referencia del servicio web generado

Al hacer doble clic en la referencia [Ws.Rdvmedecins] [12] se muestran las clases e interfaces generadas para el proxy C:

  • en [1], el explorador de objetos abierto al hacer doble clic.
  • En [2], se selecciona el espacio de nombres [ListeDesClients1.Ws.RdvMedecins], que es el espacio de nombres del proxy C generado. El primer término, [ListeDesClients1], es el espacio de nombres predeterminado de la aplicación ASP.NET creada (la hemos llamado ListeDesClients1). El segundo término, [Ws.Rdvmedecins], es el espacio de nombres que le hemos asignado al proxy C en el asistente. Al final, los objetos del proxy C tienen el espacio de nombres [ListeDesClients1.Ws.RdvMedecins].
  • En [3], los objetos del proxy C generado
  • en [4], [WsDaoJpaService] es la clase que implementa localmente los métodos del servicio web remoto.
  • en [5], los métodos de la clase [WsDaoJpaService]. En ella se encuentran los métodos del servicio web remoto, como por ejemplo el método getAllClients en [6].

Examinemos el código de las entidades generadas:

En [1], arriba, se solicita ver el código de la clase [client]:


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

Arriba, solo hemos conservado el código necesario para nuestro estudio.

  • línea 1: la clase [client] deriva de la clase [personne], al igual que en el servicio web.
  • línea 5: la clase [personne]
  • línea 7: una propiedad pública de la clase [personne]

Encontramos un código similar al ya comentado para el cliente C# en el apartado 5.1.

  • El espacio de nombres del proxy C generado es el definido en su asistente de creación, precedido por el espacio de nombres del propio proyecto web: ListeDesClients1.Ws.RdvMedecins
  • La clase proxy que implementa localmente los métodos del servicio web remoto se llama WsDaoJpaService.
  • Los nombres de las clases y las propiedades comienzan con una minúscula

Podemos escribir una página [Default.aspx] que muestre la lista de clientes. La página es la siguiente:

N.º
Tipo
Nombre
Función
1
MultiView
Vistas
Contenedor de vistas
2
Vista
VueClients
la vista que contiene la lista de clientes
3
Repetidor
RepeaterClients
muestra la lista de clientes en forma de lista con viñetas
4
Ver
VueErreurs
la vista que muestra cualquier error
5
Etiqueta
LabelErreur
Texto del error

El código de presentación de esta página es el siguiente:


<%@ 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 como cliente).nombre%>,
                <%#(Container.DataItem como cliente).nombre%>
              </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>

Cabe destacar, en la línea 3, la necesidad de importar el espacio de nombres [ListeDesClients1.Ws.RdvMedecins] del proxy C del servicio web para que se pueda acceder a la clase [client] de las líneas 20 y 21.

El código de control [Default.aspx.cs] asociado a la página de presentación [Default.aspx] es el siguiente:


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
      {
        // instanciación del proxy local de la capa [dao] remota
        WsDaoJpaService dao = new WsDaoJpaService();
        // vista de cliente
        Vues.ActiveViewIndex = 0;
        // inicialización de la vista del cliente
        RepeaterClients.DataSource = dao.getAllClients();
        RepeaterClients.DataBind();
      }
      catch (Exception ex)
      {
        // vista de errores
        Vues.ActiveViewIndex = 1;
        //Inicialización de la vista de errores
        LabelErreur.Text = ex.ToString();
      }
    }
  }
}
  • línea 8: el método Page_Load se ejecuta al cargar la página por primera vez. Esta carga tiene lugar cada vez que un cliente solicita la página.
  • línea 13: se instancia el proxy local C. Este proxy C implementa la interfaz del servicio web remoto. La aplicación se comunicará con este proxy C.
  • línea 15: si no se produce ninguna excepción al instanciar el proxy local C, se debe mostrar la vista denominada «VueClients», c.a.d. la vista n.º 0 en el MultiView «Vistas» de la página.
  • línea 17: la fuente de datos de répéteur es la lista de clientes proporcionada por el método getAllClients del proxy C.
  • línea 23: en caso de excepción durante la instanciación del proxy local C, se debe mostrar la vista denominada «VueErreurs», c.a.d. la vista n.º 1 en el MultiView «Vistas» de la página.
  • línea 25: la excepción se muestra en el label «LabelErreur».

La ejecución del proyecto web da el siguiente resultado:

5.3. Un segundo cliente ASP.NET 2008

Ahora escribimos un segundo cliente ASP.NET / C#, esta vez con la versión Visual Web Developer Express 2008, que precedió a la versión SP1.

Creemos el proyecto web del cliente .NET:

Creamos un sitio web [1, 2] llamado [ListeDesClients] [3].

  • en [4], el proyecto web
  • en [5], haciendo clic con el botón derecho del ratón sobre el nombre del proyecto, se añade una referencia de servicio tal y como se ha hecho anteriormente.
  • en [6], el proyecto una vez añadida la referencia al servicio web remoto

A diferencia del proyecto web SP1 estudiado anteriormente, no se tiene acceso a los objetos del cliente del servicio web a través del explorador de objetos.

Lo que hay que saber:

  • el espacio de nombres del proxy C generado es el definido en su asistente de creación: Ws.RdvMedecins
  • la clase proxy que implementa localmente los métodos del servicio web remoto se llama WsDaoJpaClient.
  • Los nombres de las clases y las propiedades comienzan con una minúscula

Podemos escribir una página [Default.aspx] que muestre la lista de clientes. La página es la siguiente:

N.º
Tipo
Nombre
Función
1
MultiView
Vistas
Contenedor de vistas
2
Vista
VueClients
la vista que contiene la lista de clientes
3
Repetidor
RepeaterClients
muestra la lista de clientes en forma de lista con viñetas
4
Ver
VueErreurs
la vista que muestra cualquier error
5
Etiqueta
LabelErreur
Texto del error

El código de presentación de esta página es el siguiente:


<%@ 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 como cliente).apellido%>, <%#(Container.DataItem como cliente).nombre%>
                                </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>

Cabe destacar, en la línea 2, la necesidad de importar el espacio de nombres [Ws.RdvMedecins] del proxy C del servicio web para que se pueda acceder a la clase [client] de la línea 19.

El código de control [Default.aspx.cs] asociado a la página de presentación [Default.aspx] es el siguiente:


using System;
using Ws.RdvMedecins;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    try
    {
      // instanciación del proxy local de la capa [dao] remota
      WsDaoJpaClient dao = new WsDaoJpaClient();
      // vista de cliente
      Vues.ActiveViewIndex = 0;
      // inicialización de la vista del cliente
      RepeaterClients.DataSource = dao.getAllClients();
      RepeaterClients.DataBind();
    }
    catch (Exception ex)
    {
      // vista de errores
      Vues.ActiveViewIndex = 1;
      //Inicialización de la vista de errores
      LabelErreur.Text = ex.ToString();
    }
  }
}

Este código es similar al de la versión anterior. La ejecución del proyecto web da el siguiente resultado:

Image