Archive

Archive for août 2013

JSON et navigateurs…âgés

Récemment, j’ai du modifier du code pour changer le format de données des échanges.

Naturellement, j’ai utilisé le format JSON.
D’abord parce que je le connais bien, ensuite par qu’il est efficace, simple à utiliser et surtout…l’objet JSON possède deux méthodes ô combien pratique : stringify et parse qui permettent, respectivement, de sérialiser et désérialiser en chaîne de caractères un objet.
Pour plus de détails, vous pouvez (entre autres) consulter ce billet : Native JSON in IE8 (EN).

Du coup, c’est bien mieux que le XML !

Côté .Net, on pourra utiliser la librairie JSON.Net (EN), aussi connue sous le nom de Newtonsoft.Json. Elle fait la même chose que son pendant en Javascript, plus quelques autres choses bien utiles.

Et puis, quelques jours plus tard, c’est le Drame (oui, oui, avec un grand D).
Le Drame, c’est que sur le poste d’un collègue, l’objet JSON n’existe pas. Il est…indéfini.
Là, je me dis « monde de merde » (enfin, j’avais d’autres termes plus imagés en tête, sur le coup, mais bon, passons).
Le problème vient du fait qu’il est en compatibilité IE7.

Et oui, comme nous apprends Wikipédia :

Les navigateurs commencent (en 2009) à intégrer un support natif du format JSON, ce qui facilite sa manipulation, la sécurité (contre l’évaluation de scripts malveillants inclus dans une chaine JSON), et la rapidité de traitement. Ainsi les navigateurs Firefox 3.5, IE 8 ou encore Opera 10.5 l’intègrent en natif.

Donc, IE7 n’est pas dedans.
Et ça, c’est moche.

Alors, comment contourner le problème et surtout, comment le tester avec un navigateur plus à jour ?

Pour régler le problème, il faut aller pêcher un Javascript qui gère le format JSON.
Et c’est donc ici que l’on peut le trouver : JSON 3 (EN).

Après, il suffit d’ajouter les quelques lignes ci-dessous dans un fichier Javascript qui est présent sur toutes les pages :

$(document).ready(function () {
    if (typeof JSON !== 'object') {
        var script = document.createElement("script");
        script["src"] = 'JS\\json2.js';
        document.getElementsByTagName("head")[0].appendChild(script);
    }
});

Et voilà, le tour est joué.

Pour tester cela, allons dans IE9, plus spécifiquement dans la console de DEBUG (touche F12).
JSON - Compatibilité IE7

Comme ça, l’objet JSON n’existe pas et il est donc possible de tester le fonctionnement sur les navigateurs…disons plus âgés que prévu.

Catégories :Développement, JSON

[C# – IIS] Récupérer les sites web sur le IIS local

Toujours concernant [Sécurité] Chiffrer les données de configuration, j’ai un cherché à récupérer les sites web présents sur le IIS local.
Histoire de proposer une dropdown list sur mon application plutôt qu’un champ de texte (ce qui est moins susceptible d’erreurs).

Et là, ce fut quand même assez simple, bien plus que ce que je ne m’attendais.

Il est possible, via le namespace System.DirectoryServices (on doit donc référencer l’assembly du même nom), d’avoir un paquet assez incroyable d’informations sur IIS.

Je me suis limité aux sites web (et répertoires virtuels, en fait).
Voici le bout de code :

List<string> listeWebSites = new List<string>();

// Le "root" de IIS.
DirectoryEntry w3svc = new DirectoryEntry("IIS://localhost/w3svc");
foreach (DirectoryEntry de in w3svc.Children)
{
    // Ne récupérer que le "Default Web Site".
    if (de.SchemaClassName == "IIsWebServer"
        && de.Properties["ServerComment"].Value.Equals("Default Web Site"))
    {
        // Ici, comprends toute la configuration et tout plein de choses !
        foreach (DirectoryEntry child in de.Children)
        {
            // Le "ROOT" correspond uniquement aux sites web.
            if (child.Name.Equals("ROOT"))
            {
                // Pour chaque site web, donc.
                foreach (DirectoryEntry webSite in child.Children)
                {
                    listeWebSites .Add(string.Format("/{0}", webSite.Name));

                    // On peut aussi aller chercher les répertoires virtuels.
                    // Il y a peut-être un autre niveau pour les répertoires virtuels dans les répertoires virtuels
                    // mais c'est du vice, à ce niveau là...
                    foreach (DirectoryEntry webSiteVirtual in webSite.Children)
                    {
                        listeWebSites .Add(string.Format("/{0}/{1}", webSite.Name, webSiteVirtual.Name));
                    }
                }
            }
        }
    }
}

Bon, j’avoue, c’est un peu (beaucoup) à retravailler, mais c’est pour montrer l’idée.
Ça vaut le coup de jeter un oeil !

Catégories :.Net, C#, Développement, IIS

[C#] Lire les (groupes de) sections d’un fichier App.Config

Dans un précédent billet, [Sécurité] Chiffrer les données de configuration, nous avons vu comment crypter les données d’un fichier de configuration.

Mais toutes les sections ne sont pas éligibles.
Si vous vous souvenez bien, il y a plusieurs niveaux de configurations.
Outre le fichier App.Config, il y a aussi et avant tout le fichier Machine.Config, situé (par exemple) dans le répertoire suivant :

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config

Les deux fichiers sont donc fusionnés et, lorsque l’on ouvre (via code) le fichier de configuration de l’application, il y a toutes les sections des deux.
Mais dans le cas du chiffrement du fichier de configuration de l’application, il n’y a pas forcément intérêt à chiffrer aussi le fichier Machine.Config (ça reste sur la même machine, donc on peut supposer que le chiffrement du fichier Machine.Config soit sans incidence).

Du coup, comment choisir, via code, les sections à chiffrer ?
Lire la suite…

Catégories :.Net, C#, Développement