.[Tips] Conectarse a un Servicio Web ColdFusion desde ASP.NET

Hola , que tal? Este post es un tip,  no es un tutorial, pero va servir, hace poco tuve que conectarme desde ASP.NET a un Servicio Web que estaba construido con ColdFusión, y el clásico y cómodo método de Agregar Referencia Web no es compatible, lo que debemos hacer es utilizar la clases HTTPRequest

Existe poca documentación y ejemplos sobre el tema. Fue mi Amigo y Maestro Mauricio Gómez que me ayudó a resolver el problema.
Es importante contar con el WSDL para obtener el SOAP Envolpe, para eso puedes ocupar un cliente Soap Genérico

http://www.soapclient.com/soaptest.html

Con esto vamos a obtener el SOAP Env, y hacemos una función para crear el “envoltorio SOAP” que envolverá nuestro mensaje:

Private Function GetSoapString2() As String

        Dim soapRequest As New StringBuilder("")

        soapRequest.Append("<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:apachesoap=""http://xml.apache.org/xml-soap"" xmlns:impl=""http://ws"" xmlns:intf=""http://ws"" xmlns:soapenc=""http://schemas.xmlsoap.org/soap/encoding/"" xmlns:tns1=""http://rpc.xml.coldfusion"" xmlns:wsdl=""http://schemas.xmlsoap.org/wsdl/"" xmlns:wsdlsoap=""http://schemas.xmlsoap.org/wsdl/soap/"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">")

        soapRequest.Append("<SOAP-ENV:Body>")

        soapRequest.Append("<mns:WebMethod xmlns:mns=""http://ws"" SOAP-ENV:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"">")

        soapRequest.Append("<xmlSet xsi:type=""xsd:string"">{0}</xmlSet>")

        soapRequest.Append("</mns:WebMethod>")

        soapRequest.Append("</SOAP-ENV:Body>")

        soapRequest.Append("</SOAP-ENV:Envelope>")

        Return soapRequest.ToString()

    End Function

 

La clave acá es: soapRequest.Append("<xmlSet xsi:type=""xsd:string"">{0}</xmlSet>"), que nos va a servir al momento de “Envolver”

Public Function CrearLlamadaWS(ByVal ServiceUri As String, ByVal requestXmlString As String) As String

        Dim httpRequest As HttpWebRequest = WebRequest.Create(ServiceUri)

        Dim myWriter As StreamWriter

        Dim result As String = String.Empty

        If Not httpRequest Is Nothing Then

            httpRequest.Method = "POST"

            httpRequest.ContentLength = 1049

            httpRequest.ContentType = "text/xml; charset=""utf-8"""

            httpRequest.Timeout = 60000

            httpRequest.Headers.Add("SOAPAction", "")

            myWriter = New StreamWriter(httpRequest.GetRequestStream())

            Dim xx As String = String.Format(Me.GetSoapString2(), requestXmlString)

            myWriter.Write(xx)

            If Not myWriter Is Nothing Then

                myWriter.Close()

            End If

            Dim objResponse As HttpWebResponse

            Dim esr As StreamReader

 

            Try

                objResponse = httpRequest.GetResponse()

            Catch ex As WebException ‘Exception

                esr = New StreamReader(ex.Response.GetResponseStream())

                result = esr.ReadToEnd()

            Catch ex As Exception

                objResponse = Nothing

                Throw

            End Try

 

            Dim sr As StreamReader

            sr = New StreamReader(objResponse.GetResponseStream())

            result = sr.ReadToEnd()

            sr.Close()

 

            objResponse.Close()

            sr.Close()

            objResponse = Nothing

            sr = Nothing

            httpRequest.Abort()

        End If

 

        httpRequest = Nothing

        myWriter = Nothing

        Return result

    End Function

Luego hacemos la llamada:

Dim request As String = "<![CDATA[<misdatos></misdatos>]]>"

MakeWebServiceCall(“http://10.0.0.1/ws/test.cfc?method=WebMethod”, request)

En la mayoria de los casos, el argumento, aunque nos indican que es un XML, en realidad es “en formato XML” pero no un XML propiamente tal, si no que un String:

        soapRequest.Append("<xmlSet xsi:type=""xsd:string"">{0}</xmlSet>")

La llamada es entonces, la hacemos con la URL, que incluye en nombre el WebMethod, y luego el xml con CDATA ya que en realidad es un String.

Vuelvo a dar las gracias a Mauricio Gómez, por ayudarme y por querer compartir esta información Sonrisa

Espero que te sirva,
Saludos,
Chalalo

¡Internet Explorer 9 está disponible! Descárgalo!

ban_lat_ie9_728x90_blue

¡Internet Explorer 9 está disponible!

Internet Explorer 9 Beta ya está aquí para que puedas comenzar a desarrollar. Más velocidad, interoperabilidad y belleza para que tus sitios brillen en Internet. Construido sobre HTML 5, provee un entorno interoperable que te permitirá diseñar fácilmente aplicaciones y páginas web ricas en gráficos y altamente funcionales. Ingresa ahora a www.labellezadeinternet.com y empieza ya mismo a experimentar las nuevas características, entre las cuales se destacan:

+ Velocidad: La aceleración de gráficos por GPU permite aprovechar completamente la capacidad del equipo. El procesador de gráficos, posibilita la mejor visualización de videos en alta definición y la carga rápida de contenidos. Junto al nuevo motor de JavaScript, provee un rendimiento optimizado, que significa más rapidez.

+ Interoperabilidad: Olvídate de escribir el mismo sitio más de una vez o de crear prefijos de navegación para navegadores específicos, gracias al soporte de HTML5 y CSS3, y a la compatibilidad con estándares internacionales como WC3.

+ Belleza: Una interfaz de usuario con un diseño limpio que permite visualizar más contenido de los sitios web, abrir y organizar pestañas fácilmente entre muchas características que mejoran la navegación, como la gestión de descargas; la integración con Windows posibilita anclar sitios web en la barra de herramientas, utilizar JumpLists, arrastrar pestañas con Aero Snap: los sitios web se comportan como programas instalados en el equipo.

En la Guía para desarrolladores de Internet Explorer 9 Beta, encontrarás muchísima información detallada sobre estas características y temas como SGV, DOM, EMAScript5 y más. Puedes encontrar más herramientas en MSDN. Y si ya has empezado a trabajar ¡Prueba lo que sabes!

Además incluye una excelente herramienta para los desarrolladores, en donde podremos ver como se van cargando nuestros componentes de la página, solo presiona f12 y comienza a analizar!.

image

Saludos,
Gonzalo

Importante!: Vulnerabilidad de Seguridad detectada en ASP.NET

Importante aviso!, Scott Guthrie da el aviso en su blog, sobre una falla de seguridad detectada en todas las versiones de ASP.NET también indica como poder evitarla.

¿En que consiste esta vulnerabilidad?
Un atacante utilizando esta vulnerabilidad puede solicitar y descargar archivos dentro de una aplicación ASP.NET , como el archivo web.config (que a menudo contiene datos sensibles).
El atacante al explotar esta vulnerabilidad también puede descifrar los datos enviados al cliente en un estado encriptado (como datos de ViewState en una página).

Revisa esta información para saber como protegerte:
http://weblogs.asp.net/scottgu/archive/2010/09/18/important-asp-net-security-vulnerability.aspx

Revisa el Post de José Fernandez para mayor información:
http://geeks.ms/blogs/fernandezja/archive/2010/09/18/asp-net-vulnerabilidad-de-seguridad-todas-las-versiones.aspx

Saludos,
Gonzalo

[OFf-Topic] F1{Code} Profesores al servicio de los alumnos, a Preguntar!!!!

image

Link:http://www.f1code.cl/

Tengo el agrado de participar en esta gran comunidad de Profesores, que como dice el título, están al servicio de las preguntas de programación de los Alumnos, tal como dice el gestor de esta iniciativa Luis Lastra:

F1{code} es una idea que nace de la necesidad de tener un lugar donde poder consultar, como estudiante, las dudas que se presentan en programación al momento de cursar las carreras relacionadas con el área de la Computación e Informática. ¿Alguna vez te haz encontrado con un error en tu tarea de programación en un lenguaje determinado el cual no puedes solucionar?, ¿Tienes alguna duda de porque funciona una parte de tu código y realmente no comprendes el “por que”?, ¿Warnings por doquier al momento de generar tu tarea y quieres aprender a eliminarlos?, ¿No sabes como abordar un problema y necesitas una manito? Estás en el lugar correcto. F1{code} es el sitio donde podrás preguntar todas tus dudas, las cuales, serán respondidas por un grupo de computines por default, entre los que se encuentran Docentes de distintas Instituciones Educacionales Chilenas, estudiantes de excelencia y profesionales del área con años de experiencia. La idea es sencilla, ayudar a aprender en un lugar en el que sea fácil consultar y en el que se pueda buscar entre todas las consultas anteriores una posible respuesta a tu situación. El conocimiento de uno es el conocimiento de todos.

Cabe destacar que  F1{code}  no es el sitio donde te “haremos la tarea“, sino que, es el lugar donde intentaremos ayudar a liberarte de las dudas y problemas que puedas tener en tu vida de estudiante computín. Cabe destacar que el tiempo de respuesta va en directa relación con el tiempo disponible de nuestro equipo, por lo que no intentes hacer una pregunta el día antes o el mismo día del deadline, puede que no tengas suerte hasta después del plazo.

Sean bienvenidos!

Equipo F1{code}

Ahora bien, los docentes y colaboradores de este grupo son gente que tiene pedagogía en las venas, no te van a enviar un link, si no a explicar lo que estas haciendo de manera incorrecta o en que mejorar. (link a la página de colaboradores: http://www.f1code.cl/?page_id=8)

Puedes hacer preguntas de Python, PHP, ASP.NET, C#, VB.NET, C, C++, JavaScript entre otros, también sobre conceptos de materia.

Así que si tienes una duda te invito a que revises la página:

image

Saludos!
Gonzalo

[Tutorial] Google Maps, JQuery y ASP.NET ejemplo práctico de este Mix

Hola!, ha pasado un tiempo sin postear, lamentablemente he estado súper corto de tiempo, pero sin embargo quiero compartir algo con ustedes.

Hace un tiempo un buen amigo mío me comentó la inquietud de hacer algo con google maps, para distintos dispositivos, lo que me pareció bastante interesante. El tema es que me desperté con ese bicho de programar y leer documentación así que , antes que te aburras leyendo esto, te muestro el ejemplo final en un video para que te entusiasmes.

Como vez, vamos a mostrar las panaderías cercanas, pero con nuestra información, la que esta almacenada en una Base de Datos y mediante un WS vamos a obtener estos datos para mostrarlos en el mapa y además, vamos a agregar una leyenda para cada uno de estos puntos

Revisemos los pasos a seguir para obtener este resultado…

Paso 1: Obtener el Key desde google Map

Debes obtenerlo desde la siguiente URL:  API key for Google Maps , debes contar con una cuenta en gmail, y registrar de que servidor vas a utilizar esta API (no necesario para probar en Localhost).  Luego vas a obtener la key , que con la cual tienes que hacer referencia a la API.
En mi caso:

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true&amp;key=ABQIAAAA3e9bpW5mHEGS7LVaB4R-3BQx6TWrfC8bNfnC-vtzzHJYkwhD6xTwJS9V3UI-UBnyi98SwuzCxumFSw" type="text/javascript"></script>

<script src="jquery-1.4.1.min.js" type="text/javascript"></script>

Paso 2: Crear el div para el mapa

 

<body>

    <div id="map_canvas" style="width: 580px; height: 381px">

    </div>

    <ul id="list">

    </ul>

</body>

Este va a ser el contenedor de nuestro mapa, además tenemos un tag ul para mostrar los puntos que vamos a marcar.

 

Paso 3: Crear el  Código JavaScript

 

Luego viendo la documentación de la Api, vamos a configurar las siguientes características:

Icono de Marca Personalizado

$(document).ready(function () {

   if (GBrowserIsCompatible()) {

      var map = new GMap2(document.getElementById("map_canvas"));

      map.setCenter(new GLatLng(-36.809731, -73.042903), 15);

      map.setUIToDefault();

     

      var baseIcon = new GIcon(G_DEFAULT_ICON);

      baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";

      baseIcon.iconSize = new GSize(20, 34);

      baseIcon.shadowSize = new GSize(37, 34);

      baseIcon.iconAnchor = new GPoint(9, 34);

      baseIcon.infoWindowAnchor = new GPoint(9, 2);

      getMarkersWS(map);             

            }

Esta es la primera parte  con esto instanciamos el mapa y lo asignamos al div que tenemos en el body. También damos las coordenadas para ubicar inicialmente el mapa (-36.809731, -73.042903), que es la ciudad donde vivo, y el zoom ,en este caso 15.

Para buscar tu ubicación, utiliza http://itouchmap.com/latlong.html

Luego vamos a modificar el icono partiendo de la base del icono por defecto, cambiamos la sombra y el tamaño,  y como veremos, vamos a modificar  con la función createMarker, que recibe el punto, y el html a imprimir, el icono sobre la marca.

function createMarker(point, htmlVentana) {

       var Icon = new GIcon(baseIcon);

       Icon.image = "empanadas.png";

       markerOptions = { icon: Icon };

       var marker = new GMarker(point, markerOptions);

       GEvent.addListener(marker, "click", function () {

             marker.openInfoWindowHtml(htmlVentana);

        });

       return marker;

     }

Como comentaba antes, esta función se va a encargar de dibujar la marca, asignar además una ventana de información sobre la misma, asociada al evento click.

El ícono que elejí es la de una empanada, ya que es una comida típica Chilena y estamos celebrando el Bicentenario de mi Pais Sonrisa.

image[3]

La ventana a la que le pasamos la variable  (htmlVentana), se va a mostrar sobre el marker:image

Obviamente, los datos son obtenidos desde la base de datos.

Paso 4: Crear la Base de Datos.

Creamos una tabla Panaderías, con la siguiente estructura:image

Con los Datos:

image

Para hacerla como dice Pablo Campos “Short & Good”, voy a crear un modelo LinqToSql para el manejo de datos:

image

Agregamos el WebService y codificamos la función GetPanaderias() que devuelve una lista de Objetos PanaderiaItem.

  <WebMethod()> _

    Public Function GetPanaderias() As List(Of PanaderiaItem)

        Dim Items As New List(Of PanaderiaItem)

        Dim modelo As New ModeloDataContext

        Dim lista = From p In modelo.Panaderias

        For Each p As Panaderia In lista

            Items.Add(New PanaderiaItem With {.nombre = p.nombre, _

                                              .direccion = p.direccion, _

                                              .precio = p.precio, _

                                             .descripcion = p.descripcion, _

                                              .foto = p.foto, _

                                              .lng = p.Lng.ToString, _

                                              .lat = p.Lat.ToString})

        Next

        Return Items

    End Function

 

    Public Class PanaderiaItem

        Public nombre As String

        Public direccion As String

        Public precio As Integer

        Public descripcion As String

        Public foto As String

        Public lng As String

        Public lat As String

    End Class

Paso 5: Obtener los datos del WebService:

 

Vamos a crear un WebService que nos permita recuperar los datos mediante JSON:

function getMarkersWS(map) {

                $.ajax({

                    type: "POST",

                    url: "MiWebService.asmx/GetPanaderias",

                    data: "{}",

                    contentType: "application/json; charset=utf-8",

                    dataType: "json",

                    success: function (response) {

                        var panaderias = response.d;

                        $.each(panaderias, function (index, pan) {

                            var point = new GLatLng(pan.lng, pan.lat);

                            var htmlVentana = "<img src=’fotos/" + pan.foto + "’><br> Panadería:" + pan.nombre + "</b><br><i>Precio:" + pan.precio + "</i><br>Direccion:" + pan.direccion;

                            var marker = createMarker(point, htmlVentana);

                            map.addOverlay(marker);

                            $("<li />").html(pan.nombre + "  " + pan.direccion + " <b>" + pan.precio + "</b>").click(function () {

                                marker.openInfoWindowHtml(htmlVentana);

                            }).appendTo("#list");

 

                        });

 

                    },

 

                    failure: function (msg) {

                        alert(msg);

                    }

 

                }); //fin llamada ajax

            } //fin funcion getMarkersWS

Como puedes ver el código , obtenemos los datos desde el WebService, mediante JSON, cuando ocurre el ok (success), y vamos recorriendo la colección de Objetos que nos devuelve el WS con la función $.each de Jquery

 $.each(panaderias, function (index, pan)

Luego armamos el punto (var point) y el mensaje HTML para pasarlo a la función createMarker. Luego vamos a dibujar el listado y vamos agregando el handlers click , para que al pinchar cada elemento, se muestre en el mapa el punto y la ventana. Gracias al encadenamiento de Jquery, podemos finalmente agregarlo al list (appendTo).

$("<li />").html(pan.nombre + "  " + pan.direccion + " <b>" + pan.precio + "</b>").click(function () {

                             marker.openInfoWindowHtml(htmlVentana);

                            }).appendTo("#list");

 

Paso 6: El Proyecto Web.

 

image

Esta es la estructura de nuestro proyecto, como vez es bastante sencillo, y podemos lograr un sistema de seguimiento, por ejemplo refrescando de manera asíncrona los markers.

image

Recursos:

Documentación Api de Google:
http://code.google.com/intl/es-ES/apis/maps/index.html

Búscate en el Mapa
http://itouchmap.com/latlong.html

Descarga la aplicación Sonrisa

image

Como siempre digo, espero que te sirva, y si sigues este blog, sorry que no haya posteado, pero creo que con esto me revindico Sonrisa. Si no te funciona postea porfa, así nos ayudamos entre todos!
Saludos,
Gonzalo

PD: Esta manera es más práctico que marcar de esta manera:

image