5. Clientes .NET del servicio J2EE de citas
5.1. Un cliente en 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. Aquí nos proponemos escribir un cliente de consola en C# para mostrar la lista de médicos.
![]() |
Comencemos por crear el proyecto en 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 que se usa 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 párrafo 4.10.2).
- En [2], se le pide al asistente que detecte los servicios web expuestos en esta URI
- En [3], se muestra 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 en C.
![]() |
- En [1], la referencia web que acabamos de crear. Hagamos doble clic en ella.
- En [2], el explorador de objetos que se abrió 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 (a la que hemos llamado ListeDesMedecins). El segundo término, [Ws.Rdvmedecins], es el espacio de nombres que le asignamos al proxy C en el asistente. Al final, los objetos del proxy C pertenecen al 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]. Aquí se encuentran los métodos del servicio web remoto, como por ejemplo el método getAllClients en [7].
Analicemos el código de las entidades generadas:
![]() |
En [1], mencionado anteriormente, 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 análisis.
- línea 2: la clase [client] deriva de la clase [personne], tal como ocurre en el servicio web.
- línea 8: una propiedad pública de la clase [personne]
Lo que se observa 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 en 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, aunque acabamos de ver que en realidad se llama [client]. Es la declaración de la línea 3 la que nos permite utilizar [Client] en lugar de [client]. Esto nos permite cumplir con la norma de codificación de los nombres de clase. También en la línea 12, se utiliza el método [getAllClients] porque así se llama en el proxy en C. La norma de nomenclatura de C# indicaría que se llamara [GetAllClients].
La ejecución del programa [1] anterior arroja 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 cuenta con 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 sobre el nombre del proyecto, se agrega una referencia de servicio web.
- En [6], se indica la URI del archivo WSDL del servicio web (véase el párrafo 4.10.2).
- En [7], se le pide 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], se muestra la referencia del servicio web generada
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 que se abre 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 (a la que hemos llamado ListeDesClients1). El segundo término, [Ws.Rdvmedecins], es el espacio de nombres que le asignamos al proxy C en el asistente. Al final, los objetos del proxy C pertenecen al 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]. Aquí se encuentran los métodos del servicio web remoto, como por ejemplo el método getAllClients en [6].
Analicemos el código de las entidades generadas:
![]() |
En [1], mencionado anteriormente, 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 análisis.
- línea 1: la clase [client] deriva de la clase [personne], tal como ocurre 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 que ya se comentó para el cliente C# en el párrafo 5.1.
- El espacio de nombres del proxy en 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 letra 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 |
MultiView | Vistas | Contenedor de vistas | |
Vista | VueClients | la vista que contiene la lista de clientes | |
Repetidor | RepeaterClients | muestra la lista de clientes en forma de lista con viñetas | |
Ver | VueErreurs | la vista que muestra cualquier error | |
Etiqueta | LabelErreur | El 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
{
// instancia del proxy local de la capa [dao] remota
WsDaoJpaService dao = new WsDaoJpaService();
// vista del 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 ocurre 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 la sección «Vistas» de la página MultiView.
- 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 al instanciar el proxy local C, se debe mostrar la vista denominada «VueErreurs», c.a.d. la vista n.º 1 en la sección «Vistas» de la página MultiView.
- línea 25: la excepción se muestra en el label «LabelErreur».
Al ejecutar el proyecto web se obtiene 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]; al hacer clic con el botón derecho sobre el nombre del proyecto, se agrega una referencia de servicio tal como se hizo anteriormente.
- en [6], el proyecto una vez que se ha agregado la referencia al servicio web remoto
A diferencia del proyecto web SP1 analizado 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 |
MultiView | Vistas | Contenedor de vistas | |
Vista | VueClients | la vista que contiene la lista de clientes | |
Repetidor | RepeaterClients | muestra la lista de clientes en forma de lista con viñetas | |
Ver | VueErreurs | la vista que muestra cualquier error | |
Etiqueta | LabelErreur | El 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 del 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. Al ejecutar el proyecto web se obtiene el siguiente resultado:




















