sábado, 12 de diciembre de 2009

Cambios en descargas de adjuntos con Rollup 7

A veces nos preguntamos por que la vida y evolución del CRM nos hace la vida tan difíciles, por ejemplo sacando "Update Rollups" cada 2 meses y obligándonos a estar a la última.
En general estas actualizaciones no hacen cambios estructurales importantes ni afectan a nuestros desarrollos, pero ya me ha ocurrido mas de una vez que sí afectan funcionamientos, que incluso pueden no estar documentados.
Siempre intento publicar los últimos Rollups ni bien salen, ya que es interesante estar al día y con los últimos "bugs" arreglados, pero como siempre digo, estas actualizaciones deben ser probadas mil y una veces en servidores de desarrollo y pre-producción antes de su subida final a servidores de producción.
Bien, en este caso voy a relatar lo ocurrido con el último Rollup 7 del CRM en relación con el download de ficheros adjuntos del CRM a través de la SDK.
La cronología de lo ocurrido ha sido la siguiente:
1) En Octubre de 2009 sale la versión de SDK de 4.0.10 (desde junio que no se actualizadaba).
2) El 5 de noviembre se publica el "Update Rollup 7" de CRM 4.0.
3) El 24 de noviembre se publica una nueva versión de la SDK 4.0.11 (sólo un mes despues de la anterior).

Mi sorpresa surgió cuando ví que en la nueva SDK habia una sola modificación, en relación a como se descargan los ficheros desde el CRM. Y al lado el siguiente mesaje: "Updated the sample code for downloading an attachment. This new method works with the security enhancements added to Microsoft Dynamics CRM 4.0 Update Rollup 7." (aclarando que dicho documento solo funciona con el Rollup 7)

Bien, lo que ha ocurrido realmente es que han modificado la manera de descargarse ficheros con el Rollup 7 (ya que la forma anterior ya no funciona correctamente), y por esto han tenido que sacar una actualización de la SDK.

La forma antigua para descargar un fichero que funcionaba hasta el Rollup 7 era la siguiente:

string attachid = "{61BB601D-C43F-4738-BD1F-AD22DC8E7F0E}";
string objecttypecode = "1070"; //SaleLiteratureItem
string url = "http://mycrm/Activities/Attachment/download.aspx?AttachmentType=" + objecttypecode + "&AttachmentId=" + attachid;
System.Net.WebClient myWebClient = new System.Net.WebClient();
myWebClient.Credentials = System.Net.CredentialCache.DefaultCredentials;
myWebClient.DownloadFile(url,"C:\\myfile.txt");

Y la nueva forma documentada en la SDK 4.0.11 es:

Guid annotationId = setupAnnotationId;
// Define the columns to retrieve from the annotation record.
ColumnSet cols1 = new ColumnSet();
cols1.Attributes = new string[] { "filename", "documentbody" };
// Retrieve the annotation record.
annotation annotationAttachment = (annotation)service.Retrieve(EntityName.annotation.ToString(), annotationId, cols1);
// Download the attachment in the current execution folder.
using (FileStream fileStream = new FileStream(annotationAttachment.filename, FileMode.OpenOrCreate))
{
byte[] fileContent = new UTF8Encoding(true).GetBytes(annotationAttachment.documentbody);
fileStream.Write(fileContent, 0, fileContent.Length);
}

A pesar de que esto podría parecer que ya está solucionado, no es así, ni mucho menos. Este código que han sacado para la SDK nueva, es incorrecto y no funciona!
Para hacer que funcione el código correcto para descargar ficheros con el Rollup 7 es el siguiente:

Guid annotationId = setupAnnotationId;
ColumnSet cols1 = new ColumnSet();
cols1.Attributes = new string[] { "filename", "documentbody" };
annotation annotationAttachment = (annotation)service.Retrieve(EntityName.annotation.ToString(), annotationId, cols1);
using (FileStream fileStream = new FileStream(annotationAttachment.filename, FileMode.OpenOrCreate))
{
//la siguiente línea es la que estaba mal en la SDK que debería ser:
byte[] filebytes = Convert.FromBase64String(annotationAttachment.documentbody);

fileStream.Write(filebytes, 0, filebytes.Length);
}

Realmente el error recae en que "annotationAttachment.documentbody" contiene el texto en base64 del fichero que es el mismo campo que esta almcenado en la base de datos (ver mi artículo sobre el tema: Descarga de adjuntos desde SQL Server).

Bueno, como siempre digo, cuidado con las actualizaciones, estar al día con todo (SDKs, Rollups, etc) he informarse de los cambios, es la mejor práctica para evitar posibles dolores de cabeza.

Espero les sea útil...

un saludo

No hay comentarios:

Publicar un comentario