Comment exploiter le format MHTML (archive Web) retourné par SSRS

image

Je travaille sur un outil d’assurance qualité automatisé spécialement conçu pour la plate-forme Reporting Services. Cet outil doit permettre (entre autres) de définir des jeux d’essais et des instances de jeu d’essai.

Puisque le HTML retourné par SSRS au fureteur contient une multitude de IFRAME ce n’est pas pratique pour stocker le résultat de l’exécution dans une base de données.

Heureusement Microsoft permet d’exporter un rapport SSRS en format MHTML (MHT). Ce fichier MIME contient le HTML et toutes les images du rapport ce qui le rend idéal pour être stocké dans une base de données de test. Voici un extrait de ce fichier:

MIME-Version: 1.0
Content-Type: multipart/related;
boundary= »—-=_NextPart_01C35DB7.4B204430″
X-MSSQLRS-ProducerVersion: V10.0.4000.0

This is a multi-part message in MIME format.

——=_NextPart_01C35DB7.4B204430
Content-Disposition: inline;
filename= »P-WTM-A-1.rdl »
Content-Type: text/html;
name= »P-WTM-A-1.rdl »;
charset= »utf-8″
Content-Transfer-Encoding: base64

PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFs
Ly9FTiI+PGh0bWw+DQo8aGVhZD48dGl0bGU+

(…)

——=_NextPart_01C35DB7.4B204430
Content-ID: <20ab75f5777a4fe8b08ad8501772655c>
Content-Disposition: inline;
filename= »20ab75f5777a4fe8b08ad8501772655c »
Content-Type: image/jpeg;
name= »20ab75f5777a4fe8b08ad8501772655c »
Content-Transfer-Encoding: base64

/9j/4AAQSkZJRgABAQAAAQABAAD/

Il y a trois manières de présenter cette information:

  1. En utilisant Internet Explorer pour faire l’affichage;
  2. Afficher le texte MIME (duh);
  3. Lister les fichiers:image

Afficher le MHT via Internet Explorer

En C#, il existe un contrôle WebBrowser qui est directement capable d’afficher le contenu d’un fichier MHT. Il suffit d’écrire le MHT dans un fichier temporaire et de changer l’hyperlien du contrôle pour pointer sur ce fichier:

void tabs_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
switch (tabs.SelectedIndex)
{
case gnTabBrowser:
if (!mbBrowserLoaded && !String.IsNullOrEmpty(txtMime.Text))
{
string sTempFilePath = TempFilesManager.Instance.AddTempFile(« mht », null);
FileSystemUtils.SaveOrOverrideFile(sTempFilePath, txtMime.Text);
ctlBrowser.Url = new Uri(sTempFilePath);
mbBrowserLoaded = true;
}
break;

         case gnTabFiles:
ShowMIMEFiles();
break;
}
}
catch (Exception pException)
{
ErrorHelper.ReportException(this, pException);
}
}

Extraire la liste des fichiers du MHT

Le projet Lumisoft.Net.Mime contient du code permettant de facilement extraire les différents fichiers (de différents types) à partir du MHT.

private void ShowMIMEFiles()
{
if (!mbFilesLoaded)
{
lstFiles.Clear();
byte[] abytMIME = Encoding.ASCII.GetBytes(txtMime.Text);
Mime pMime = Mime.Parse(abytMIME);

    foreach (MimeEntity pCurEntity in pMime.MainEntity.ChildEntities)
{
int nImageIndex = GetImage(pCurEntity);
ListViewItem pCurItem = lstFiles.Items.Add(pCurEntity.ContentDisposition_FileName, nImageIndex);
pCurItem.Tag = pCurEntity;
}

    mbFilesLoaded = true;
}
}

Dans mon cas, je ne fais qu’ajouter une entrée dans la liste des fichiers pour chaque enfant de l’entitée principale. Je garde une référence vers l’objet MimeEntity à même l’élément de la liste pour être en mesure de sauvegarder le fichier sur demande.

Pour sauvegarder le fichier sur le disque il suffit de faire ceci:

File.WriteAllBytes(dlgSaveFile.FileName, pMIMEEntity.Data);

Une dernière note: si vous procédez à l’extraction de tous les fichiers vers un répertoire afin de le rendre fonctionnel dans un fureteur, vous devrez effectuer une modification au HTML.

Les images (ou CSS) qui réfèrent aux images du MHT, le font via un mot clé spécial (cid):

<IMG SRC= »cid:7b02c90c0a5d4958be7316eba58fb39f »/>

Où 7b02c90c0a5d4958be7316eba58fb39f est le nom de l’image dans le MHT. Si vous avez extrait cette image vers Images/7b02c90c0a5d4958be7316eba58fb39f.jpg et bien vous devriez modifier le HTML afin qu’il contienne plutôt:

<IMG SRC= »Images/7b02c90c0a5d4958be7316eba58fb39f.jpg »/>

Et voilà, si vous aviez à exploiter le format MHT retourné par SSRS et que cet article vous a orienté dans la bonne direction, n’hésitez pas à me laisser un commentaire!

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s