Buscar en este blog

miércoles, 11 de febrero de 2015

Consumir servicio personalizado AIF con credenciales – Custom Services, Microsoft Dynamics AX 2012

En el post anterior se vio cómo exponer un servicio desde Ax y consumirlo desde visual studio estando en la misma red y con un usuario de dominio.

Pero existen los casos que son los mas comunes, donde nos preguntamos:

Qué pasa si por ejemplo nos conectamos por vpn a donde se encuentra el servicio expuesto de ax?
Qué pasa si nuestra máquina no esta dentro del dominio?

Dando por sentado que la tecnología desde la que se va invocar el servicio es .Net (o sea visual studio) el siguiente método funciona bien, por qué? porque el servicio que expone Ax por default es NetTCP, si se va a consumir desde otra tecnología o fuera de la red sin vpn, necesita ser http.

1. Verificar que tenemos acceso al servicio expuesto desde nuestra red, esto lo hacemos abriendo el explorador y poniendo la url del servicio que creamos.


Si lo vemos en el explorador, quiere decir que si alcanzamos el servicio.

2. Crear un usuario de active directory y usuario de ax. Este usuario nos va a servir para firmar nuestro usuario y accesar al servicio.


3. Crear un proyecto de visual studio de tipo windows form (aquí el tipo no importa, solo es para probar la invocación) y agregamos la referencia del servicio. Agregamos un botón al proyecto y sobre el evento click del botón invocamos el servicio, la diferencia con el ejemplo anterior es que se necesita firmar con las credenciales de un usuario, en este caso el usuario que creamos en el paso anterior. El código sería:

private void button1_Click( object sender, EventArgs e)
{
     try
     {
          using (Servicio2NetTCPEmpleados. GRWEmpleadosAxClient servicioWCF = newServicio2NetTCPEmpleados.GRWEmpleadosAxClient ())
          {
               Servicio2NetTCPEmpleados. CallContext contexto = new Servicio2NetTCPEmpleados.CallContext ();
               contexto.Company = "compañiaAx" ;
               contexto.MessageId = Guid.NewGuid().ToString();
               servicioWCF.ClientCredentials.Windows.ClientCredential.Domain = "dominioDeServidor" ;
               servicioWCF.ClientCredentials.Windows.ClientCredential.UserName = "usuario" ;
               servicioWCF.ClientCredentials.Windows.ClientCredential.Password = "contraseña" ;

               //Llamada al servicio
               string respuesta = servicioWCF.metodoServicio(contexto, "parametro1" "parametro2");

               MessageBox .Show(respuesta);
          }
     }
     catch ( Exception ex)
     {
          MessageBox .Show(ex.Message);
     }
}

Algo importante por mencionar, es que el dominio, debe ser el que dice la maquina donde se esta exponiendo el servicio sobre ax, por ejemplo:


Sino se hace de esta forma, al invocar el servicio, el error que veríamos seria: "El objeto de comunicación, Systema.ServiceModel.Channels.ServiceChannel, no se puede usar para la comunicación porque se encuentra en el estado Faulted."




Y por cierto, acuérdate de darle click a algún anuncio si el post te sirvió de algo.

No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma. 


<<<<----   Crear servicio personalizado AIF                            Publicar servicio como HTTP  --->>>



No hay comentarios.:

Publicar un comentario