Programación y Estrategias de Negocios RSS 2.0
# Tuesday, October 21, 2008

Se acerca el PDC 2008, la conferencia para desarrolladores profesionales de Microsoft, donde se mostraran todas las novedades de la plataforma como Cloud Computing, Windows 7, etc, etc. Lamentablemente no voy a ir…, tampoco he ido a los anteriores…

 

Entonces porque este post se llama PDC y Yo?, bien porque aunque yo no voy, voy a mandar a mi representante: Una aplicación desarrollada con WPF, LINQ, y Windows LiveMesh que se estará mostrando en una de las conferencias y que con un poco de suerte será publicada en CodePlex como ejemplo de referencia, algo como lo que ha hecho Vertigo con Family.Show.

 

Ha sido un volumen de trabajo absurdo en las últimas semanas, días de 20 y 22 horas, pero finalmente estuvo listo. En cuanto pase el NDA comentare sobre la aplicación. 

 

Gracias a la gente de studiocom quienes nos consideraron para el trabajo, espero que hayamos superado la expectativa.

 

Creo que es la primera vez que una aplicación hecha en Colombia se usa de esta forma. (Si estoy equivocado por favor, envíeme una nota).

La Arquitectura de la Aplicación.
  • Una librería de clases serializada para WCF.
  • Un Publicador de Contenido. Con WPF consumiendo servicios RSS
  • Muchos Clientes. Desarrollados con WPF
  • LiveMesh Service como contenedor y encargado de las comunicaciones entre Clientes y Publicador.

En próximos días publicare sobre la experiencia de desarrollo, los problemas que encontramos, los que resolvimos, los que no pudimos resolver, y como trabajamos desde distribuciones remotas con la gente de studiocom en Atlanta, el cliente (MS) en Readmond, el Desarrollador (yo) en Bogotá y el Diseñador (TF) en cualquier lugar del mundo.

 

Juan Pelaez

Arquitecto de Software

 

Publicado Originalmente en : www.juanpelaez.com/blog.

 

 

Keywords: PDC2008, PDC 2008, LiveMesh, Live Services, WCF, WPF, Distributed Applications.

Tuesday, October 21, 2008 12:35:58 PM (SA Pacific Standard Time, UTC-05:00)  #    Comments [0] - Trackback
LiveMesh | WCF | Windows Live | WPF
# Wednesday, August 20, 2008

Me han preguntado un par de veces como invocar Web Services que tienen certificados digitales desde aplicaciones web (y tambien desde aplicaciones Windows), asi que aqui una nota de referencia rapida y algunos enlaces al respecto:

 

Existen muchas formas de invocar servicios web seguros desde aplicaciones web, pero basicamente dos son rapidas y eficaces y dependen de la tecnología que se este usando para invocar los servicios web. (es decir como los esta llamando), si esta usando framework 2.0 lo mejor es usar Web Services Enhancements (WSE) 3.0 for Microsoft .NET, una serie de extensiones para Visual Studio que implementan mejoras significativas en seguridad, gestión de archivos como parte del mensaje, etc. Con WSE* puede usar muchas de las características más avanzadas de Web Services y hacen parte de los estándares avalados por OASIS y otras sugerencias de Microsoft, incluidos los certificados digitales, mas información de esta técnica aquí. Este complemento es gratuito, no hay que pagar nada por él y se puede descargar del sitio de Microsoft haciendo clic aquí.

 

Ahora si está usando el framework 3.0 puede utilizar Windows Communication Foundation (WCF) que trae incluido desde el core el soporte para esquemas de seguridad como el que menciona, Microsoft ha desarrollado una guía de mejores prácticas de seguridad para servicios de WCF. Y una guía muy completa de casos practicos (how-to) y escenarios que se puede descargar de forma gratuita haciendo clic aquí.

 

 

Juan Peláez

Developer Evangelist

Microsoft Colombia.

Wednesday, August 20, 2008 8:33:57 AM (SA Pacific Standard Time, UTC-05:00)  #    Comments [0] - Trackback
.net | Articulos de Desarrollo | Developer Evangelist | Visual Studio | WCF | Web Services
# Friday, July 13, 2007
 
Durante el desarrollo de la nueva versión de nuestras aplicaciones usando arquitecturas distribuidas con WCF encontré los siguientes problemas en las herramientas de Visual Studio que quiero compartir aqui.
 
El primero, que muchos habran identificado, es que al generar el código usando la opción de nueva libreria de WCF en visual basic genera una clase datacontract1 que no tiene marcada ninguna de sus propiedades como datamember, por lo que cuando se publica el servicio y se genera el proxy esta clase no tiene ninguna propiedad publica que pueda trasmitirse con por el cable, esto se soluciona facilmente marcando como datamember la propiedad generada para que quede asi: (en negrillas lo que hay que adicionar)
 
<DataContract()> _
Public Class DataContract1
Private m_firstName As String
Private m_lastName As String
 
<DataMember()> _
Public Property FirstName() As String
Get
Return m_firstName
End Get
Set(ByVal value As String)
m_firstName = value
End Set
End Property
 
<DataMember()> _
Public Property LastName() As String
Get
Return m_lastName
End Get
Set(ByVal value As String)
m_lastName = value
End Set
End Property
End
Class
 
El segundo tiene que ver con el nombre por default para el namespace que coloca Visual Studio a los proyectos, este namespace genera un problema en la serialización de los objetos marcados como datacontract ya que estos llegan correctamente al servicio pero no estan inicializados, si se depura el cliente se ve correctamente creado el objeto pero en el servicio no estan los valores.
 
Este punto se puede resolver usando alguno de los siguientes procedimientos:
 
a. Eliminado el namespace colocado por default en el cliente, el host y el servicio. (usando las propiedades del proyecto dentro de visual studio).
b. al generar el proxy del servicio usando la herramienta svcutil.exe usar el modificar /n para indicar que se quiere generar un proxy con el namespace del cliente, algo como esto:
 
svcutil.exe *.wsdl *.xsd /namespace:*,MyNamespace /language:VB
 
siendo MyNamespace el nombre del namespace del cliente del servicio.
 
Estos problemas no se presentan cuando se usan servicios con tipos basicos del CRL como strings o enteros o en algun otro tipo de contracto (operacion,fault,etc), es unicamente para cuando tiene contratos de datos del tipo datacontract, tampoco se presentan en C#.
 
espero que sea de utilidad.
 
Juan Carlos Peláez
MCTS
 
KeyWords: WCF, svcutil, Visual Basic, Framework, net, Arquitectura, Componentes Distribuidos, Cliente, Servicio, Host, Microsoft
Friday, July 13, 2007 7:33:19 PM (SA Pacific Standard Time, UTC-05:00)  #    Comments [0] - Trackback
.net | Arquitectura | Articulos de Desarrollo | WCF | Web Services
# Tuesday, July 10, 2007

Aunque no sé si sea  un escenario muy común, (para nosotros en Gattaca si lo es), hay aplicaciones legacy escritas en ASP clásico que empiezan a integrarse con aplicaciones en .Net, bien sea como parte de un proceso paulatino de migración o como parte del proceso de agregar nuevas funcionalidades a la aplicación existente, en ambos escenarios una forma simple de integrar la aplicación asp con la nueva aplicación .net es exponer las nuevas funcionalidades de la aplicación .Net por medio de servicios web.

Aunque existe en La Red literatura respecto a la forma como debe hacerse esta invocación del web service desde la página web no todos los ejemplos apuntan a escenarios reales, el objetivo de este post es mostrar cómo debe realizarse esta integración para aplicaciones del mundo real.

1. El primer problema consisten en identificar cuáles son los tipos de datos que se van a transferir entre la aplicación asp y la aplicación .net, mi recomendación es pasar datos de tipos básicos del CRL, es decir, strings, longs, integers. Aunque es posible pasar objetos representados como XML para que después sean des-serializados por la aplicación .net esto complica bastante el escenario e incluye nuevos elementos de error. (Nosotros transferimos solo strings y creamos los objetos en la aplicación .net, para lo cual creamos los constructores adecuados)

2. El siguiente problema es identificar quien es el realmente el cliente del servicio, en la mayoría de los escenarios el cliente del servicio es código del lado del servidor, (el código que esta entre los tags <%%> es el código del servidor), también es posible que el cliente sea alguna de las funciones JavaScript de la página que se quiere invocar. (Este es el escenario que derivo en la existencia de AJAX Asynchronous JavaScript And XML).  Por ahora nos enfocaremos en el escenario donde el código del lado del servidor es quien consume el web service.

3. Ahora debemos seleccionar la forma como se comunicará la aplicación asp con el servicio web, básicamente hay dos opciones, usar SOAP, o usar el parser de xml (HTTP Post) que contiene un objeto poco conocido llamado MSXML2.ServerXMLHTTP que puede ayudarnos a realizar estas llamadas. Básicamente es un tema de gusto, facilidad y conveniencia, sin embargo como es necesario tener instalado el Toolkit de SOAP para poder usar los objetos de SOAP desde asp clásico y dicho componente se queda sin soporte a partir de Marzo 31  del 2008, entonces nosotros preferimos usar HTTP Post.

4. Bien lo siguiente es escribir el código del servicio web y modificar la página asp para que lo consuma, lo del servicio web no lo vamos a profundizar, es una clase con la decoración webservice con algunos métodos decorados webmethod, etc. un ejemplo sencillo puede ser algo como esto:

Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel

<System.Web.Services.WebService(Namespace:="http://MyNameSpace/services/MyProduct> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class WorkFlowServices
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function ServiceTest() As String
        Return "En Ejecucion..."
    End Function

    <WebMethod()> _
    Public Function MyMetodoconParametros(ByVal Client As String, ByVal UserID As Long, ByVal IDProcessCase As Long, _
                                                ByVal Sequence As Long, ByVal EntryDataType As String, ByVal IDEntryData As String, ByVal EntryData As String) As Long

...hacer algo, retornar algo.

    End Function

End Class 

5. Ahora como consumir este web service desde la página asp clásica, es algo como esto:

<%

Dim xmlhttp

Dim DataToSend

Dim postUrl

postUrl = "http://IPMyServer/Services/WorkFlowServices.asmx/MyMetodoconParametros"

DataToSend="Client=Tester&UserID=1&IDProcessCase=80&Sequence=0" & _

"&EntryDataType=TestWebService&IDEntryData=0&EntryData=1"

 

Response.write postURL

Response.write "<br>"

 

Set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP")

xmlhttp.Open "POST",postUrl,false

xmlhttp.setRequestHeader "Content-Type","application/x-www-form-urlencoded"

xmlhttp.send DataToSend

 

Response.Write(xmlhttp.responseText)

%>

Lo importante de este segmento de código, es la forma como se construye la invocación del método, la variable postURL tiene la dirección del servicio web asi como el nombre del método que se va a invocar. Luego la variable DataToSend tiene la información de los valores que toman los diferentes parametros que se van a pasar al metodo del web service (la recolección de estos parámetros depende del tipo de uso e interfaz que se tenga con los usuarios pero puede ser la recolección de una forma usando request.form o la recolección de los parámetros del QueryString que invocó la páginas ASP).  

Otra cosa importante es la definición del encabezado en la linea xmlhttp.setRequestHeader "Content-Type","application/x-www-form-urlencoded" .

Listo, se invocó el web service, ahora el resultado puede recuperarse de una de estas propiedades: responseBody, responseStream, responseText, and responseXML., (nosotros usamos response.text que nos retorna todo el entity body como un stream)

Tips Súper Importantes:

· Cuando su cliente del servicio web sea el propio código asp ("del lado del servidor") se recomienda usar el objeto MSXML2.ServerXMLHTTP que ha sido diseñado y optimizado para comunicaciones entre servidores.

· El código anterior genera un error en la mayoría de los servicios web del framework 2.0, es un error del tipo "Request format is unrecognized for URL" o en español "Formato de solicitud no reconocido para la dirección URL" esto se debe a que los protocolos Get y Post estan deshabilitados por omisión (default) en las aplicaciones del framework 2.0 para todas las peticiones de orígenes diferentes a Localhost. (Esa es la razón por la que la página de prueba de los servicios web como se ve desde otra maquina no tiene el formulario Test Service), por lo tanto para que efectivamente se realice la invocación hay que habilitar estos protocoles, eso se hace incluyendo las siguientes líneas en el archivo web.config del servicio web de .net.

<system.web>

    <webServices>
        <protocols>
            <add name="HttpGet"/>
            <add name="HttpPost"/>
        </protocols>
    </webServices>

(...)

</system.web>

En este articulo hay más información del comportamiento de los protocolos, aunque solo habla del framework 1.1. también ocurren con en el framework 2.0.

Espero que sea de utilidad

 

Juan Carlos Peláez
MCTS

Keywords: Web Services, ASP Clasic, .Net, Framework 2.0, VB, "Formato de Solicitud no reconocido",

Tuesday, July 10, 2007 1:12:34 PM (SA Pacific Standard Time, UTC-05:00)  #    Comments [0] - Trackback
.net | Arquitectura | Articulos de Desarrollo | WCF | Web Services
Contácteme
mail: jpelaez at juanpelaez.com
Archivo
<November 2008>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
FeedBurner
Maps
Locations of visitors to this page
Sponsors
Acerca de...

Aviso Legal
Las opiniones expresadas en este sitio representan el punto de vista de Juan Peláez sobre diferentes temas y no representan la posición de Studiocom.com.Inc, Microsoft. o de cualquier otra compañía que haya contratado los servicios de consultoría de Juan Peláez

© Copyright 2008
Juan Carlos Peláez
Sign In

Technorati Profile
Estadísticas
Total Posts: 69
This Year: 40
This Month: 2
This Week: 0
Comments: 10
All Content © 2008, Juan Carlos Peláez
El tema 'Business' para DasBlog fue creado por Christoph De Baene (delarou) y modificado para espa�ol por Juan Peláez
Powered by FeedBurner