BugNET – Error with attachments in version 0.9.142.0

A new version of BugNET was released recently (18th of December 2011). You might encounter a problem with attachments to an issue, with an error page.

Here is the error you’ll get in the logs :

System.Web.HttpUnhandledException (0x80004005): Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.ArgumentOutOfRangeException: Length cannot be less than zero.
Parameter name: length
   at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)
   at BugNET.Issues.UserControls.Attachments.CleanFileName(String fileName)
   at BugNET.Issues.UserControls.Attachments.AttachmentsDataGridItemDataBound(Object sender, DataGridItemEventArgs e)
   at System.Web.UI.WebControls.DataGrid.CreateItem(Int32 itemIndex, Int32 dataSourceIndex, ListItemType itemType, Boolean dataBind, Object dataItem, DataGridColumn[] columns, TableRowCollection rows, PagedDataSource pagedDataSource)
   at System.Web.UI.WebControls.DataGrid.CreateControlHierarchy(Boolean useDataSource)
   at System.Web.UI.WebControls.BaseDataList.OnDataBinding(EventArgs e)
   at BugNET.Issues.UserControls.Attachments.BindAttachments()
   at BugNET.Issues.UserControls.Attachments.Initialize()
   at BugNET.Issues.UserControls.IssueTabs.LoadTab(String selectedTab)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.HandleError(Exception e)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest()
   at System.Web.UI.Page.ProcessRequest(HttpContext context)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Unfortunately this is a bug, that has been described and fixed here : http://support.bugnetproject.com/Issues/IssueDetail.aspx?id=2028

In case you cannot wait for the next release that will inlcude this fix, or if don’t want to bother downloading the source code, fix the bug and compile it, you’ll find below some easy step to fix the bug on your platform (it will litterally take you 2 minutes), assuming you are using version 0.9.142.0

Step 0 : Make sure you are using version 0.9.142.0. If you are using another version, DO NOT follow the next steps.

Step 1 : Download the attached file and unzip it.

Step 2 : Copy the file BugNET.dll to your bugNET platform in the bin folder. Just replace the existing file.

Done ! Try to upload or view an attachment, you’ll see that it works.

Hope this will help someone.

Générer son propre certificat SSL pour IIS

Voici un petit tutoriel pour générer un certificat SSL Self Signed (auto signé) pour IIS. Ceci permet d’exposer un site web sur le port 443 avec un certificat SSL gratuit.

A noter que les navigateurs internet signaleront que le certificat n’a pas été signé par une autorité reconnue mais c’est la seule façon de ne pas dépenser une fortune dans un véritable certificat SSL signé par VeriSign ou une autre entité proposant ce type de service.

ETAPE 1 : Télécharger et installer le Resource Kit Tools de IIS

Disponible ici pour ISS 6.
Suivez simplement les étapes d’installation : next, next, next…

ETAPE 2 : Lancer SelfSSL

Allez dans le menu démarrer, puis IIS Resources, SelfSSL, SelfSSL. Cela va lancer une fenêtre Command Shell.

ETAPE 3 : Générer votre certificat

Tappez la ligne de commande suivante

C:\Program Files\IIS Resources\SelfSSL>selfssl.exe /N:CN=MYMACHINENAME /K:1024 /V:10950 /S:1 /P:443

K = 1024 : La clé sera sur 1024 bits
V = 1095 : Le certificat sera valide pour 1095 jours (30 ans !)
S = 1 : Le certificat sera appliqué sur le site IIS portant l’ID = 1
P = 443 : Le port utilisé sera le port 443 (recommandé)

ETAPE 4 : C’est terminé

Allez sur votre site avec votre navigateur préféré
https://monserveur/ et vous constaterez que votre certificat SSL est bien appliqué

Generation de certification PFX pour publier un add-in Office 2007

Vous venez de réaliser que le fichier PFX généré par Visual Studio 2008 lors de la publication de vos add-in Office 2007 (Publish avec Click Once) expirait très (trop) rapidement. Pas de problème vous dites vous, je vais me générer un petit fichier PFX des familles qui me permettra d’avoir un certificat qui expire en 2050.

Et google vous amène sur cette page… elle est pas belle la vie !

ETAPE 1 : Petite leçon de vie

Un fichier PFX (Personnal Information Exchange) contient un clé publique et une clé privée qui permet à notre ami Visual Studio 2008 de garantir la sécurité et l’intégrité de votre application (un add-in pour Office 2007 dans notre cas).

ETAPE 2 : Génération de la clé publique et de la clé privée

makecert.exe -sv MyPrivateKey.pvk -n “CN=EfelantGuru” MyPublicKey.cer

L’option -e permet de préciser la date de fin de validiter. Mais je vous laisse un peu chercher dans la documentation MSDN les options qui vous conviennent.

Note : l’outil en ligne de commande makecert est disponible dans le SDK de Windows
Windows Server 2003 SDK
Windows Server 2008 SDK

ETAPE 3 : Création du PFX

pvk2pfx.exe -pvk MyPrivateKey.pvk -spc MyPublicKey.cer -pfx MyPFX.pfx -po votre_mot_de_passe

Note : L’outil en ligne de command pvk2pfx est également disponible dans le SDK de Windows Server.

ETAPE 4 : Ajout dans Visual Studio 2008

Un petit clic droit dans Visual Studio sur votre projet, puis proprerties, vous permettra de préciser le certificat ainsi généré à ClickOnce dans l’onglet “Signing”. Vous voilà prêt à balancer votre Add-in dans la face du monde entier.

Le tour est joué, presque trop facile !

Un petit article intéressant pour ceux qui veulent en savoir plus sur le sujet : http://msdn.microsoft.com/en-us/library/bb172338(VS.85).aspx

Les droits d’auteur qui vont bien (merci Maxime) :
http://blogs.msdn.com/maximelamure/archive/2007/01/24/create-your-own-pfx-file-for-clickonce.aspx

Convertir un objet Image (ou Bitmap) en objet IPictureDisp

Ne vous méprenez pas, il est parfois très utile de pouvoir faire simplement ce type de conversion. J’ai rencontré ce problème lors de la réalisation d’un Add-in pour Outlook 2007 avec Visual Studio 2008 alors que je souhaitais ajouter une image à un CommandBarButton (bouton dans Outlook 2007).

L’opération semble simple en théorie. Dans la pratique vous serez confronté à une difficulté de taille : Être capable de créer un objet IPictureDisp contenant votre image.

Voici comment procéder pour ajouter une image (icône) à votre CommandBarButton.

ETAPE 1 : Ajout d’une image dans votre projet

Ajouter votre image à vos ressources dans Visual Studio 2008. Il suffit pour cela de cliquer sur le répertoire Properties dans votre projet Visual Studio, puis de cliquer sur Ressources et d’ajouter votre image.

ETAPE 2 : Ajouter la classe permettant de convertir vos images au format IPictureDisp

Ajouter une nouvelle classe à votre projet que vous appellerez AxHostConverter. Pour réaliser cela, il suffit faire clique droit dans VS 2008, puis Add New Item, Class…

Le code de cette classe sera le suivant :

class AxHostConverter : AxHost

{

    private AxHostConverter() : base(“”) { }

    static public stdole.IPictureDisp ImageToPictureDisp(Image image)

    {

        return (stdole.IPictureDisp)GetIPictureDispFromPicture(image);

    }

    static public Image PictureDispToImage(stdole.IPictureDisp pictureDisp)

    {

        return GetPictureFromIPicture(pictureDisp);

    }

}

Explications : Cette classe permettra de réaliser la conversion d’un objet Image (ou Bitmap puisque ce dernier hérite du premier !). L’explication technique (en version courte est simple) tient dans le fait que la classe AxHost permet de réaliser cette conversion via deux méthodes statiques. le problème est que ces méthodes ne sont pas accessible (protected) et qu’il est nécessaire d’encapsuler ces méthodes dans une classe de notre fabrication que nous exposerons publiquement afin de pouvoir les utiliser librement.

ETAPE 3 : Ajout d’une image à votre bouton

Via le code, juste après avoir créé votre bouton, vous pouvez faire un appel du type :

myCommandBarButton.Picture = AxHostConverter.ImageToPictureDisp((Image)Properties.Resources.monImage);

 

Note : “myCommandBarButton” devra être remplacé par le nom de votre bouton. “monImage” sera le nom de votre image dans les Ressources de votre projet Visual Studio. vous noterez également la conversion de la ressource Bitmap en objet Image afin de respecter la type d’entrée. Bitmap héritant de Image, cela ne pose aucun problème.

Conclusion :

Tout ça pour ça me direz vous. Et bien oui, mais parfois, une petite lutte acharnée permet de faire de belles choses.

Dans un prochain billet, je tâcherais d’expliquer comment gérer la transperence sur votre nouveau bouton ainsi créé.

Naviguer sur une page web avec un Add-in outlook 2007

- Vous venez d’écrire un Add-in outlook 2007 sous Visual Studio.
- Vous souhaiteriez afficher une page web directement dans outlook (sans ouvrir une fenêtre IE) en vous servant du navigateur intégré disponible dans outlook.

C’est simple, et cela se fait en deux lignes de code :

Office.CommandBarComboBox webControl1 = (Office.CommandBarComboBox)this.Application.ActiveExplorer().CommandBars.FindControl(26, 1740, missing, missing);
webControl1.Text = "http://skiii.com";

Vous pouvez placer ces deux lignes dans la methode ThisAddIn_Startup automatiquement créée par Visual Studio dans le fichier ThisAddIn.cs.

Note : “ThisAddIn” pourra changer en fonction de vos paramètres et du contexte de développement.

Récupérer le login d’un utilisateur en c#

Vous souhaitez récupérer le login de l’utilisateur courant dans une application windows en c# .NET.
Cela se fait en une ligne :

string login = WindowsIdentity.GetCurrent().Name;

A noter que vous aurez besoin pour effectuer cette action de référencer le namespace suivant :

using System.Security.Principal;
 

Et voilà, pratique et rapide.

Superbes graphiques en ASP.NET avec Fusion Charts Free

Voici une librairie très pratique et simple à utiliser qui permet de générer de très beaux graphiques (22 types de graphiques différents) en ASP.NET (entre autres, puisque la librairie peut être utilisée aussi en PHP, ASP, Javascript, Ruby On Rail, JSP, …).


Le site : http://www.fusioncharts.com/free/

Démo online : http://www.fusioncharts.com/free/Gallery.asp?gMenuItemId=3

Il suffit de télécharger la librairie, vous y trouverez une série d’exemples en .NET (répertoire csnet ou vbnet) très pratiques pour réaliser rapidement vos premiers graphiques. L’effet est garantie dans votre application.

A noter qu’il est aussi possible d’opter pour la version payante, plus complète que la version gratuite. Mais rassurez-vous, la version gratuite est déjà très riche en fonctionnalité et saura certainement satisfaire la plupart d’entre vous.

Effecuter une requête HTTP en .NET

Il se peut que dans vos programmes vous ayez besoin de récupérer ou d’effectuer une requête HTTP ou HTTPS via du code. Il se trouve que cela n’a rien de très complexe, faut-il encore savoir comment s’y prendre.

Ce petit tutoriel vous donnera un point de départ pour récupérer des pages web via du code .NET. Vous trouverez un projet Visual Studio complet à la fin de ce post.

  • Effecuter une requête HTTP simple

Il suffit d’utiliser l’objet HttpWebRequest, qui retournera à son tour un objet HttpWebResponse :

HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(“http://google.com”);

HttpWebResponse response = (HttpWebResponse)httpReq.GetResponse();

  • Lire le contenu de la réponse HTTP

Pour lire le contenu (HTML) de la réponse, vous pouvez utiliser le code suivant. Vous récupérerez le contenu dans la variable content sous la forme d’une chaîne de caractère :

Stream receiveStream = response.GetResponseStream();

StreamReader sr = new StreamReader(receiveStream);

string content = sr.ReadToEnd();

  • Support des requêtes HTTPS

Afin d’être certains que les requêtes HTTPS passent bien dans le cas où le certificat n’est pas complètement valide, il vous faudra ajouter le code suivant (au début de votre bout de code) pour ignorer toutes les erreurs potentielles sur les certificats :

ServicePointManager.ServerCertificateValidationCallback += AcceptAllCertificatePolicy;

Vous devrez ajouter bien entendu la méthode suivante afin que le callback fonctionne correctement :

public static bool AcceptAllCertificatePolicy(object sender,

X509Certificate certificate,

X509Chain chain,

SslPolicyErrors sslPolicyErrors)

{

return true;

}

  • Gestion de l’authentification

Dans l’éventualité où vous seriez contraint de vous authentifier sur le site auquel vous cherchez à accéder, voici un moyen simple de passer en paramètre des identifiants de connexion :

httpReq.Credentials = new NetworkCredential(“monLogin”, “monPassword”);

  • Pour finir : un projet Visual Studio 2005 complet qui illustre les points ci-dessus :


Ce petit projet est une simple démonstration des points mentionnés ci-dessus pour ceux qui souhaitent avoir une base de départ qui fonctionne afin de s’inspirer pour la suite…

Télécharger le code source complet

Télécharger le code compilé (executable)

Manipuler un fichier Excel 2003 en .NET

Si vous souhaitez créer un programme en .NET qui bénéficie de toute la puissance d’Excel, ou si vous souhaitez manipuler en .NET un fichier Excel, alors ce petit article est fait pour vous.

Nous allons aborder ici une méthode (ce n’est pas la seule) relativement simple qui permet de manipuler Excel via du code .NET (C#). Un tutoriel vous guidera dans la démarche, pour finir vous pourrez télécharger un code source de démo illustrant une manipulation simple d’Excel via .NET

  • Pré-requis

Pour démarrer ce tutoriel vous aurez besoin de :
- Visual Studio (2005 dans mon cas)
- Excel 2003

  • Installation de Office Primary Interop Assemblies

Office Primary Interop Assemblies est ce qui va permettre (via COM) à notre programme en .NET de communiquer avec Excel pour exploiter toutes ses fonctionnalités.

- Pour Office 2003, télécharger ici
- Dézipper ensuite le fichier télécharger
- Lancer le package d’installation (fichier MSI).

Une fois l’installation terminée, vous disposez de tout ce dont vous avez besoin pour manipuler Excel 2003 avec du code en .NET.

  • Création d’un petit programme de test

- Ouvrez Visual Studio et créez un petit projet de test (Windows Application ou Console Application à votre convenance).

- Dans “Solution Explorer”, clic droit sur “References”, clic sur “Add Reference…”. Une fenêtre s’ouvre.

- Cliquez sur l’onglet “Com” et choisissez “Microsoft Excel 11.0 Object Library”. En fonction de votre version d’Excel (il se peut que le 11.0 devienne un 10.0 pour Excel 2000 ou un 12.0 pour Excel 2003). Validez en cliquant sur OK.

- Il ne reste plus qu’à ajouter dans votre code la référence à ce composant :
using Microsoft.Office.Interop.Excel;

- Puis à ajouter la méthode ci-dessous permettant de manipuler Excel

///<summary>

/// A method to test Excel COM Interop

///</summary>

public void RunTest()

{

    try

    {

        // We start a new instance of Excel and make it visible

        Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

        xlApp.Visible = true;

        // We create a default workbook

        Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);

        Worksheet ws = (Worksheet)wb.Worksheets[1];

        // We loop and fill in some cells randomly

        Random rand = new Random((int)DateTime.Now.Ticks); // Random number generator

        for (int i = 1; i <= 20; i++)

        {

            Range aRange = ws.get_Range(“A” + i.ToString(), “A” + i.ToString()); // We get cells one by one

            aRange.Value2 = rand.Next(0, 10000);

        }

    }

    catch (Exception ex)

    {

        throw ex;

    }

}

 

  • Téléchargement d’un exemple

Si vous rencontrez des difficultés ou que vous voulez gagner un peu de temps, téléchargez simplement l’exemple ci-dessous :
- Solution Complète Visual Studio
- Le programme (.exe) seul

Cette exemple contient un petit projet Visual Studio qui illustre le fonctionnement et vous donnera un point de départ qui compile et qui marche, le reste sera facile.

  • Conclusion

Excel est une application de fou, vraiment ! Et vous pouvez désormais l’utiliser dans vos programmes en .NET pour :

- générer des fichiers Excel dynamiquement
- traiter des fichiers Excel en masse
- gérer l’upload de fichier Excel par un utilisateur dans une interface web
- …