Bienvenidos, Desarrollo de software a la medida.

Ofrezco mi amplia experiencia y conocimiento para desarrollar soluciones de software: Windows, Web, Móviles. utilizando C#, Visual Basic .Net, ASP.NET, SQL Server 2000/2005/2008, Windows Phone, Android-Java, Google Maps, API Google, AJAX, Crystal report, Xml, etc.

Soy ingeniero de sistemas, director de varios proyectos exitosos de software, utilización de Uml y modelado orientado a objetos, así como Auditor interno certificado ISO 9001:2000. Desarrollo como Freelance para empresas y particulares. Si desea que desarolle su aplicación, con mucho gusto estaré atento para apoyarle. m.riveros130@egresados.uniandes.edu.co

sábado, 29 de agosto de 2009

Desarrollo de aplicación wml Avaya 9600 con Visual Studio 2005, ASP.NET (Visual Basic)

Estoy desarrollando una aplicación hotelera para los teléfonos AVAYA 9600, pudiendo un huésped del hotel, desde el navegador Web del teléfono consultar el estado de su cuenta, leer los mensajes de texto, consultar inventarios de productos, etc.

Los teléfonos AVAYA soportan WML 1.1, al desarrollar con ASP.NET, el servidor Web, genera el código WML requerido para estos teléfonos, así que se puede desarrollar tranquilamente en asp.net sin tener que pensar en cumplir la estructura WML, solo debe tener en cuenta de crear paginas .aspx tipo: “Formulario Mobile Web Forms” .

Hasta allí todo es sencillo, el problema empieza cuando se inicia a navegar por la aplicación desde el teléfono Avaya y se empiezan a ver errores en el teléfono de “No se puede mostrar la pagina” o problemas de render. Mi idea es compartirles mi experiencia en el desarrollo de este tipo de aplicaciones, los problemas que he tenido y como los he solucionado.

1. PROBLEMA: El Browser no puede guardar el estado de sesión de los controles de los formularios, es decir si usted asigna a un Label1.text = now.ToLongTimeString, cuando la pagina vuelva a mostrarse va a obtener un mensaje de error, por que no puede conservar el valor que contiene la propiedad Label1.text.

SOLUCION: Los formularios .aspx para los teléfonos AVAYA, no pueden utilizar la propiedad EnableViewState=True, para que los formularios funcionen correctamente debe establecerse EnableViewState=False al formulario. Esta propiedad puede asignarse a nivel de formulario o nivel del web.config con lo que aplica para todos los formularios.

A. En nivel de formulario se hace en:
<body>
<mobile:Form id="Form1" runat="server" EnableViewState=False >
<mobile:Label ID="Label1" Runat="server">Label</mobile:Label>

</mobile:Form>
</body>
</html>

B. En nivel del Web.config:
<configuration>
<system.web>
<pages enableViewState="false">
<namespaces>
<clear/>
<add namespace="System"/>

2. PROBLEMA. No se pueden guardar variables de sesión de Session(“Var1”) =Valor lo que he encontrado es que las variables de sesión, del navegador no permanecen, cada vez que se recarga una pagina desde el teléfono, se crea una nueva sesión en el servidor Web, perdiéndose los valores de sesión que previamente se habían guardado, lo que impide conservar valores que en el desarrollo de una aplicación son tan importantes.

Aquí el problema es: Si no puedo conservar los valores en las atributos de los controles, ni en las variables de sesión, donde los guardo?

SOLUCION: Si se desea conservar valores en un formulario, deben enviarse en el formulario, parámetros de Request, que estos a pesar de que el mismo formulario se invoque varias veces por que se hizo clic en uno de sus botones, las variables pueden volverse a consultar, por que automáticamente se vuelven a pasar el URL, los parámetros Request se pasan así a las paginas que se desean invocar:

http://localhost/AvayaDemo/Pedidos.aspx?Valor=1500&Nombre=Tomate&imagen=Producto1.jpg

Luego puede recuperarles en el evento Page_Load de la siguiente manera:

Protected Sub Page_Load(…) Handles Me.Load
Me.Image1.ImageUrl = Request.QueryString("imagen")
Me.LblNomProducto.Text = Request.QueryString("Nombre")
Me.LblPrecio.Text = Request.QueryString("Valor")
End Sub

Esto me permite conservar valores de variables entre llamados de páginas.


NOTAS: En la documentación de .NET, existe la opción que las variables de sesión de los controles no se guarde en las Cookies del Browser ya que los teléfonos no lo soportan sino que se guarden en el URL cuando se invoca, algo como:

http://ServerAvaya/Pagina1.aspx?Variables=DatosDelasVaribalesdeSesion

Para esto en el Web.config puede configurarse el parámetro:
<sessionState cookieless="AutoDetect">
</sessionState>

En cookieless puede cambiarse el valor de AutoDetect por varias opciones entre ellos: UseDeviceProfile, AutoDetect, UseUri, true, false. Aunque todas estas opciones las utilice buscando poder guardar las variables de sesión, ninguna funciona sobre el teléfono, es como si el navegador no pudiese conservar estos valores en el link que se invoca.


3. PROBLEMA. Obtengo error al hacer un Response.redirect(“”): Para los teléfonos AVAYA no debe usarse la sentencia: Response.Redirect() por que el navegador queda perdido y muestra un mensaje de error: 'Pagina sin poder procesar'

SOLUCION: debe utilizarse: Server.Transfer().

También es una buena opción crear controles Links dinámicos en tiempo de ejecución y colocarlos en el formulario, para después hacer clic en ellos y navegar a otras páginas, funciona perfecto, ejemplo

For Each Fila In Tabla.Rows
Link = New System.Web.UI.MobileControls.Link

Link.Text = Fila("messagedescription")
Link.NavigateUrl = ~/ Mensaje.aspx?IdMensaje=1&NroHabitacion=2"

Me.Form1.Controls.Add(Link)

Next


4. PROBLEMA. Uso de Autenticación de formularios:

<authentication mode="Forms">
<forms loginUrl="~/login.aspx" defaultUrl="~/Default.aspx" cookieless="AutoDetect"/>
</authentication>

Como muchas aplicaciones que se desarrollan en ASP.NET, se maneja la autenticación de usuarios tipo formularios. El problema es que esto no puede hacerse para teléfonos Avaya 9600, por que cuando se muestra el formulario en el teléfono, para que se ingrese un Login y Password (Utilizando 2 controles TextBox), esto funciona perfecto, pero cuando se necesita registrar que el usuario esta autenticado haciendo:

FormsAuthentication.SetAuthCookie(Me.TxtLogin.Text, False)
FormsAuthentication.RedirectFromLoginPage(TxtPassword.Text, False)

Al hacer SetAuthCookie genera una excepción, tal vez por que se trata de escribir una Cookie, aunque la propiedad segunda esta en False. También trate de que las Cookies se escriban en el URL de la página estableciendo en web.config:

defaultUrl="~/DefaultHuesped.aspx" cookieless="AutoDetect"

Pero no me funciono con ninguno de los valores que coloque en cookieless. Hice que se imprimiera en un label si el Browser soportaba las Cookies, pero siempre me escribe False, en los teléfonos.

Me.Label1.Text = FormsAuthentication.CookiesSupported


SOLUCION: Finalmente me toco no dejar autenticación de ningún tipo. Lo hago es que en cada pagina .aspx que requiero autenticación, solicito el login y password e internamente valido que estos sean correctos. Esto aunque no es lo mas adecuado es una buena solución cuando se tienen que ejecutar paginas que requieren de un usuario válido.

Espero les sea útil, los invito a dejar sus comentarios en mi Blog.

En otro artículo escribiré sobre como enviar alarmas a los teléfonos AVAYA tipo:
POP UP, TOP LINE, DISPLAY.

1 comentario:

Javier dijo...

Grande inge!!, valioso aporte, siga asi apoyando a los sufridos programadores!!!

Seguidores

Datos personales

Bogotá, Colombia
Especialista en Construcción de software. Universidad de los ANDES. m.riveros130@egresados.uniandes.edu.co