sFTP en Dynamics AX 2012

 En Desarrollo, Dynamics AX

sFTP

Debido a la sensibilidad de los datos que maneja un ERP, poder transferir ficheros mediante sFTP en Dynamics AX es un buen método para asegurar la confidencialidad de los datos, tanto en internet, como en la propia intranet de la empresa.

Hasta la fecha de publicación de esta entrada Microsoft no ha publicado ninguna biblioteca para AX, ni para .NET, que implemente sFTP.

putty

Una solución puede ser instalar un programa como putty y ejecutarlo desde AX. El inconveniente principal es la incomodidad de tener que instalar el programa en todos los clientes de AX y escribir una API en X++ para formatear los comandos de putty que se quieren ejecutar en el sistema operativo.

SSH.NET

Mucho mejor solución es usar bibliotecas en .NET como ssh.net. El sistema de despliegue de ensamblados .dll desde la versión 2012 de Dynamics AX y el acceso a la estructura de la API con intellisense en el editor de X++ hace más sencillas, auto contenidas y elegantes las soluciones de transferencia de ficheros.

Es fácil encontrar tutoriales y ejemplos de cómo usar ssh.net para transferir ficheros por sFTP con C#, información que se puede utilizar casi tal cual en X++.
Pero como el diablo se esconde en los detalles, a continuación vemos el escollo y cómo evitarlo para que transferir ficheros sFTP, aunque no sea un camino de rosas, al menos sea un camino transitable.

El problema

El acceso a métodos de una biblioteca C# en X++ no es exactamente igual que desde C#, y la biblioteca ssh.net tiene un parámetro opcional en los métodos DownloadFile y UploadFile de tipo Action<ulong> dentro de la clase SftpClient. Estos parámetros tienen la utilidad de poder llamar a un método que se ejecuta en un nuevo hilo para cualquier funcionalidad extra requerida cuando se sube o baja un fichero.
Dicho parámetro en X++ es obligatorio, con lo cual hay que darle un valor Action<ulong> en la llamada al método.
El problema es que el tipo Action no tiene equivalente en X++, y por tanto tampoco puede generar un valor null válido (que resulta ser el valor por defecto en los dos métodos que nos ocupan). Nos fijaremos en el método DownloadFile (el método UploadFile es análogo).

La llamada al método desde X++:

sftpClient.DownloadFile(_file, fs, null);

Devuelve el error:

DownloadFile is not a member of SftpClient

Ya que no hay ningún método DownloadFile en la clase que se ajuste a la “firma” de la llamada.

La solución

Afortunadamente, la biblioteca ssh.net tiene una licencia MIT y el código fuente es público, con lo que solo hay que sobrecargar los dos métodos que nos ocupan quitando el parámetro opcional y dentro llamar al método existente. Así no se pierde la funcionalidad previa en la biblioteca y podremos enviar y recibir ficheros mediante sFTP sin problemas con AX.

El método existente es el siguiente:

public void DownloadFile(string path, Stream output, Action downloadCallback = null)
{
  CheckDisposed();

  InternalDownloadFile(path, output, null, downloadCallback);
}

Sólo hay que añadir un nuevo método como el siguiente:

public void DownloadFile(string path, Stream output)
{
  DownloadFile(path, output, null, null);
}
Entradas recomendadas

Dejar un comentario