[How To] Consumir un Java Web Service desde VS2010

Introducción

Estoy haciendo un desarrollo que va a hacer uso de servicios web creados en Java. Pese a que el desarrollo lo tengo que realizar en Visual Studio 2005, quería hacer unas pruebas en Visual Studio 2010.

Mi primera sorpresa fue cuando en Visual Studio 2005 los Servicios funcionaban “correctamente” y en Visual Studio 2010 no, para ello vamos a ver un par de cosas en el siguiente apartado.

Soluciones

Hablando del problema por twitter con Alberto Díaz y Lluís Franco, me comentaban que para que el Servicio se referenciara como se hacia en Visual Studio 2005 era necesario seguir los siguientes pasos:

1) Con el botón secundario sobre el proyecto de VS, Agregar Referencia de Servicio.

2) En el cuadro de dialogo seleccionar Avanzadas:

image3) En el siguiente cuadro de dialogo, elegir Agregar Referencia web.

image4) Agregar la referencia de nuestro servicio y pulsar aceptar:

image

Siguiendo estos pasos, dentro de nuestro proyecto se va a crear una carpeta WebReferences donde van a estar las referencias a nuestros servicios agregados de esta manera.

Una vez realizado esto ya podríamos crear instancias y llamar a los métodos del Servicio realizado en Java.  

Yo quería ir un paso mas alla, y intentar conectarme al servicio Java como si estuviera tratando un servicio WCF, es decir, agregando la referencia al servicio en el paso 1 del listado anterior.

Para ello, se plantean varias opciones de servicio, yo voy a tratar un Servicio securizado (HTTPS) y uno normal (HTTP)

Caso HTTP:

Una vez agregada la referencia al servicio, Visual Studio habrá generado un conjunto de clases para tratar con el servicio.

   1: EndpointAddress address = new EndpointAddress(@"MyWebServiceUrl");

   2: BasicHttpBinding binding = new BasicHttpBinding();

   3: MyService.MyServiceEndPointClient cliente = new MyService.MyServiceEndPointClient(binding, address);

   4: try

   5: {

   6:     string cadena=cliente.Method1("TORRECILLA PUERTAS JAVIER");

   7: }

   8: catch (Exception ex)

   9: {

  10:     MessageBox.Show(ex.Message);

  11: }

Lo que estoy haciendo es definir un Binding Basic, cuya seguridad por defecto está desactivada. Y por otro lado estoy definiendo el Endpoint de mi servicio (“es una larga historia que no viene muy al caso”).

Una vez definidos el enlace y la dirección crearemos una instancia del servicio indicándole dichos valores, y ya podríamos invocar a nuestro servicio Java no securizado.

 

Caso HTTPS:

Al igual que en el caso anterior vamos a agregar la referencia al servicio, y a definir un Binding y un  Endpoint. En este caso, dentro del Binding será necesario que definamos la seguridad puesto que el WebService va por HTTPS.

 

   1: try    

   2: {

   3:     EndpointAddress address = new EndpointAddress(@"https://MyServiceURL");

   4:     BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);

   5:     binding.Security.Transport = new HttpTransportSecurity { ClientCredentialType = HttpClientCredentialType.Certificate };

   6:     MyService2.MyService2Client cliente = new MyService2.MyService2Client (binding, address);

   7:     X09Certificate2 certificate = GetMyCertificate();

   8:     cliente.ClientCredentials.ClientCertificate.Certificate = certificate;

   9:     var result= cliente.MyMethod("Javier Torrecilla Puertas");

  10:  

  11: }

  12: catch (Exception ex)

  13: {

  14:     MessageBox.Show(ex.Message);

  15: }

En este caso vamos agregar a la petición un certificado existente en el almacén. (How to Obtener Certificados Digitales), para securizar la llamada y vamos a definir:

– Que la seguridad se de tipo “Transport”

– Y además que sea de tipo Certificado de Cliente.

 

Bueno, espero que este post os sea de utilidad.

Saludos

Problema con el emulador de WP en Windows 7

Introducción

Este post es para tratar un problema con el que me he encontrado este fin de semana en el portátil al intentar desarrollar una aplicación para Windows Phone 7, en el Hack-A-Ton organizado por Microsoft en Fuengirola.

¿Cuál es el problema?

El problema, a parte de no haber comprobado que todo funcionaba correctamente antes de irme a Fuengirola (por falta de tiempo), era que no podía ejecutar el emulador de WP, ni desde Visual Studio / Blend, ni desde el propio emulador en las tools del SDK.

Al intentar ejecutar el emulador desde las tools obtenía este mensaje de error:

image

 

Si lo ejecutaba desde VS/Blend me indicaba que faltaba algún parámetro y no podía hacer el deploy.

Buscando y buscando todo el fin de semana, a pesar de los problemas de la conexión a internet, descubrí que la DLL “MFPlat.dll” es una dll integrada en el SDK de Windows Media Format.

Bien, ¿por qué no tengo instalado el SDK de Windows Media Format?. No recordaba que la versión de Windows 7 que tenía instalada en mi equipo era de la serie “N”, la cual no tiene instaladas las características de Media center.

 

Solución

Si os encontráis alguna vez con este problema, basta con que descarguéis el paquete de características multimedia para Windows Serie N desde aquí.

Espero que os sea de utilidad.

Saludos!!

[How To] Rellenar un ListView con un DataTable

Introducción

Hace algún tiempo publique en mi antiguo Blog donde explicaba como rellenar un ListView usando Visual Basic.

Es un tema bastante recurrente en los foros MSDN, y aun hoy, recibo bastantes visitas a dicho post, por lo que he decidido, publicarlo nuevamente pero en este caso en C#.

En el ejemplo voy a utilizar Visual Studio 2010.

Código

Existe varías formas de realizarlo:

– Crear un control propio que herede de ListView.

– Definir un método en una clase que reciba como parámetros el ListView a rellenar,  y un DataTable con los datos a rellenar.

– Un método Extensor que extienda la funcionalidad de ListView. (No válido en VS 2003 ni VS2005)

 

En este caso, me he decantado por hacerlo de la última forma que indicaba, es decir, con un método Extensor.

Para ello, será necesario que creemos una nueva clase estática en nuestro proyecto, y definamos el método encargado de rellenar el ListView.

   1: public static class ListViewExtensions

   2:     {

   3:         public static void Fill(this ListView listView, DataTable data)

   4:         {

   5:             if (data == null) throw new ArgumentNullException("Es necesario enviar una tabla.");

   6:             if (data.Columns.Count == 0) return;

   7:             if (data.Rows.Count == 0) return;

   8:             data.Columns.Cast<DataColumn>().ToList().ForEach(column => listView.Columns.Add(column.Caption));

   9:             

  10:             data.AsEnumerable().ToList().ForEach(row=>

  11:                 {

  12:                     ListViewItem item = new ListViewItem(Convert.ToString(row[0]));

  13:                     row.ItemArray.ToList().Skip(1).ToList().ForEach(value =>

  14:                         item.SubItems.Add(Convert.ToString(value)));

  15:                     listView.Items.Add(item);

  16:                 });

  17:         }

  18:     }

El método va a recibir como parámetros el objeto que extiende (gracias a la palabra this), y el objeto DataTable que queremos visualizar.

En primer instancia vamos a realizar algunas validaciones para evitar posibles errores.

Después rellenaremos los nombres de las cabeceras de las columnas del ListView con las columnas de la Tabla, y a continuación rellenaremos los elementos del ListView con las filas de la tabla.

Para que funcione correctamente será necesario establecer la propiedad “View.Details” del ListView al valor: “View.Details”.

¿Cómo invocamos a este método?

   1: Datatable dtbDatos=new DataTable();

   2: ...

   3: myListView.Fill(dtbDatos);

Cuando estemos escribiendo el intellisense de VS nos mostrará las opciones disponibles y veremos el método Fill con el icono extensor .

 

Espero que os sea de utilidad.

 

Saludos!

[How To] Obtener los certificados Digitales instalados.

Introducción

En este pequeño post vamos a ver como obtener los certificados digitales instalados en un ordenador desde C#.

¿Qué necesitas?

Para el ejemplo que voy a explicar he utilizado Visual Studio 2010, pero es completamente válido desde la versión 2005.

Para la clase que voy a crear he agregado la referencia al namespace System.Security.Cryptography.X509Certificates.

Obtener los certificados

Voy a definir una nueva clase que va a contener dos funciones:

– Obtención de los certificados

– Definición del almacén.

   1: public class CertificateInfo

   2:     {

   3:         public static List<X509Certificate2> GetCertificatesList(X509Store store)

   4:         {

   5:             List<X509Certificate2> certificates = new List<X509Certificate2>();

   6:             if (store == null)

   7:                 return null;

   8:             store.Open(OpenFlags.ReadOnly);

   9:             certificates.AddRange(store.Certificates.Cast<X509Certificate2>().ToList());

  10:             store.Close();

  11:  

  12:             return certificates;

  13:         }

  14:         public static X509Store CreateX509Store()

  15:         {

  16:             return new X509Store();

  17:         }

  18:     }

La función GetCertificatesList va a recibir un objeto de tipo X509Store que va a representar el almacén de los certificados que queremos obtener, y va a devolver una lista de objetos de tipo X509Certificate2 que van a representar toda la información relativa al certificado digital.

La función CreateX509Store nos va definir un nuevo objeto de tipo X509Store con la definición que nostros queramos aportarle.(Ver los distintos constructores existentes)

¿Cómo utilizar este código?

   1: var store = CertificateInfo.CreateX509Store();

   2: var certificates = CertificateInfo.GetCertificatesList(store);

Bueno espero que os sea de utilidad.

Un saludo!