Parcourir par tags

Tous les tags » Développement (RSS )

Il se peut que vous ayez un jour besoin, comme ce fut le cas pour moi aujourd’hui, de :

  • Créer un service WCF (facile)
  • Le publier sur un IIS 7 (facile aussi)
  • Rendre les services accessibles par https (mhhh...)
  • Qu’ils soient accessibles par un site avec un binding précis (sur un sous-domaine particulier)
  • Utiliser un certificat émis par le serveur lui-même (no comment)

Host name Binding et HTTPS

Il faut déjà savoir que host name binding et HTTPS ne font pas bon ménage, pour une raison assez logique : étant donné que l’entête http est chiffrée lors d’un échange HTTPS, du coup l’information sur l’host interrogé par le client l’est aussi. Il est donc impossible de savoir vers quel site la requête doit être renvoyée sans déchiffrer l’entête. Sauf que chacun des sites peut avoir un certificat différent pour déchiffrer l’entête. Mais on ne sait pas quel certificat utiliser sans avoir lu l’entête HTTP, etc.

Donc l’interface de IIS 7 ne permet tout simplement pas d’indiquer un host name lorsque l’on ajoute un binding HTTPS :

Add Https Binding

Cependant, il peut y avoir des cas où c’est le même certificat qui va servir pour toutes les requêtes. Dans un tel cas IIS n’aurait qu’un certificat à utiliser, donc il pourrait utiliser le seul certificat déclaré pour déchiffrer les entêtes et faire son “aiguillage”. Sauf que non.

Host name Binding et WCF

Là où cela devient drôle, c’est lorsque WCF se joint à la partie. En effet, celui-ci se base sur l’host name pour renvoyer l’adresse à interroger dans le contrat WSDL. Si votre service nécessite l'utilisation de HTTPS, le contrat renverra donc une url de la forme suivante :

<soap:address location="https://mymachine/Service.svc/Soap"/>

Etant donné que IIS ne fournir aucune information sur le host name, WCF renvoie le nom de la machine comme adresse à interroger. Un client se basant sur le contrat WSDL pour déterminer l'url du service n'arrivera pas à accéder à votre serveur si celui-ci se trouve sur Internet.

La solution

Trois outils sont nécessaires pour réussir à configurer correctement IIS : appcmd, netsh et SelfSSL

  • Le premier permet d’administrer la metabase IIS et de passer outre certaines restrictions de l’interface. Il est disponible dans le répertoire %systemroot%\System32\inetsrv
  • Le second permet d’affecter des certificats SLL sur un ensemble application/port/binding (l’outil de configuration IIS manipule aussi netsh en fait).
  • SelfSLL est disponible dans IIS 6.0 Resource Kit Tools (mais aussi directement via un lien du post de Rob Bagby dont il est question plus loin).

Dans mon exemple, j'utiliserai les postulats suivants :

  • Le nom de la machine est "mymachine"
  • L'adresse du site sur laquelle on souhaite exposer le service est www.example.com
  • L'identifiant numérique du site sous IIS est 2 (colonne ID sous IIS Manager)
  • Le nom du site sous IIS est My Site (colonne Name sous IIS Manager)

1ère étape : génération du certificat auto-signé

Premier problème : la génération d’un certificat à l’aide de IIS Manager utilise le nom de la machine comme "Issued To" et ne permet pas de le changer.

La seule astuce trouvée consiste à utiliser l’application SelfSSL (à lancer en mode administrateur), qui permet de générer un certificat auto-signé en permettant de spécifier la valeur du champ CN.

Vous trouverez les étapes nécessaires décrites sur le blog de Rob Bagby, mais en gros la commande ressemblera à ça :

SelfSSL.exe /N:CN=www.example.com /V:1000 /S:SiteId (où SiteId vaut 2 dans notre exemple)

Vous obtenez donc un certificat qui sera installé dans les certificats du serveur (visibles à la racine de IIS Manager, cf. blog de Rob Bagby).

Si vous pensez que cela suffira, ce n’est pas le cas. Certes, cela vous permet d’accéder à votre site en https sans recevoir une erreur indiquant que le site interrogé ne correspond pas au site désigné par le certficat, mais WCF continue de renvoyer l’adresse de la machine comme adresse SOAP à interroger.

Note : MakeCert, fourni avec Visual Studio, semble aussi permettre la génération de certficats auto-signés avec un CN personnalisé.

2ème étape : Récupération des informations de binding sur le certificat

Pour une étape ultérieure, il va nous falloir connaître l’idenfiant de l’application IIS ainsi que la signature SHA du certificat.

Pour cela, il vous faut tout d’abord assigner votre certificat SSL auto-signé sur l’un de vos sites (temporairement), ensuite, exécutez en ligne de commande "netsh http show sslcert".

Netsh Http Show SSLCert

Le programme vous renverra 2 informations intéressantes :

  • Certificate Hash, ici "079…"
  • Application Id, ici "{4dc...}"

Notez ces informations puis supprimez votre binding IIS.

3ème étape : Création du binding IIS HTTPS avec host name

Pour pouvoir forcer la création d’un binding HTTPS avec le certificat créé précédement ET le host name de notre adresse publique, il nous faut utiliser appcmd, comme expliqué sur cet autre blog.

La commande ressemblera à :

appcmd set site /site.name:"MySite" /+bindings.[protocol='https',bindingInformation='*:443:www.example.com']

La partie que vous devez remplacer sera "MySite", à remplacer par le nom de votre site sous IIS, et www.example.com à remplacer par l’url de votre site web https.

Pour vérifier si tout s’est bien déroulé, rendez-vous sur votre site IIS et vérifiez qu'un binding HTTPS a été ajouté. Normalement, la partie host name devrait être remplie avec l'adresse que vous avez saisi. Surtout ne modifiez pas le binding par IIS Manager, celui-ci supprimera les informations sur le host name.

Il ne reste qu'un détail à régler. En l'état, le site n'est pas encore accessible en HTTPS. En effet, le fait d'ajouter le binding à la main via appcmd ne rattache pas le certificat au binding (on peut le voir en faisant "Edit" sur le binding : aucun certificat n'est sélectionné, ou par "netsh http show sslcert" qui ne renvoie aucun certificat).

Il va falloir le faire à la main à l'aide d'une dernière commande.

4ème étape : Ajout du certificat sur le binding

Pour cette dernière étape, il va falloir utiliser la commande netsh avec les options suivantes :

netsh http add sslcert ipport=0.0.0.0:443 certhash=<Certificate Hash> appid=<Application Id>

Remplacez les deux valeurs par celles que vous aviez relevé lors de l'étape 2.

Une fois toutes les opérations effectuées, accédez à votre contrat WSDL, l'attribut "location" devrait désormais valoir https://www.example.com/Service.svc/Soap.

Références

C’est ce que je me suis finalement dis après avoir passé mes deux journées sur cette pauvre fonctionnalité.

Tout partait d’une volonté louable : implémentation d’une “petite” fonctionnalité en apparence assez simple. Comme souvent en fait.

Dans mon cas, il s’agissait de rendre virtuel le chargement d’une grosse liste dans une gridview. La technique est assez bien rodée : passage par une classe qui se charge de découper la liste en pages, et lorsque la gridview demande une ligne, on cherche si la page correspondante a été chargée. Si ce n’est pas le cas, on interroge le service, on stocke le résultat, et ça roule… J’avais d’ailleurs déjà développé une telle fonctionnalité pour un autre endroit de l’application.

Dans ma volonté de faire du réutilisable, je me suis dit que c’était donc le bon moment pour créer une classe générique implémentant capable de faire un tel traitement. Je commence donc à prototyper une classe DeferredList<T>, en gardant en tête que je souhaitais quelque chose de simple, avec peu de calculs et peu de variables pour conserver une empreinte mémoire faible (étant donné que l’on allait déjà avoir une liste assez conséquente en taille).

Mais j’avais plus ou moins involontairement oublié un aspect de cette gridview (et qui n’existait pas dans mon cas précédent) : elle permet d’ajouter ou de supprimer des éléments. Soit. Sauf que non, mon prototype omettait un détail : les modifications apportées à la liste ne sont envoyées au serveur qu’à un moment précis, lorsque l’utilisateur souhaite enregistrer les modifications apportées. Entre temps, le chargement des pages continue de me renvoyer la liste non modifiée.

Du coup, lorsque l’on supprime un élément (par exemple au début de la grille, dans la première page), cela décale automatiquement toutes les pages qu’il faudra charger. Exemple si dessous avec la suppression de l’élément situé à la ligne de la gridview d’index 2.

DeferredList-1

Imaginons que les pages 2 et 3 n’aient pas été chargées : avant l’opération, la demande de l’élément affiché à la ligne d’index 9 provoque le chargement de la page 2, et après l’opération celui de la page 3.

L’ajout provoque forcément l’effet inverse.

J’ai donc modifié mon code pour gérer ce cas. Ça commençait déjà à sentir le sapin : répercuter le décalage sur toutes les pages suivantes dans le cas de listes avec plusieurs milliers de pages ne me plaisait pas.

Et la baleine commença à apparaître : la gestion de la page renvoyée par l’évènement ne correspondait donc pas forcément à l’emplacement réel des éléments. Exemple avec le cas précédent, en cas de chargement de la page :

DeferredList-2

Comment savoir que l’élément d’index 2 devait être ignoré et que les suivants devaient être décalés ? A part stocker dans chaque page les éléments supprimés (et leur index)...

Voilà donc comment, à force de réécrire du code, on se retrouve à perdre sa journée. La solution existe bien, mais elle ressemble désormais à une énorme baleine au lieu d’un simple petit gravier blanc.

Conclusion : Shelve, Undo changes, et s’efforcer d’oublier le code écrit pour repartir de zéro sur quelque chose intégrant dès le départ ce type de contrainte, et voir si quelque chose de simple reste possible. Si c’est le cas je partagerai ma solution.

Note : Et pour la forme, on risque finalement d’abandonner la possibilité d’interagir avec la liste directement lorsqu’elle dépasse un certain nombre d’éléments, tant le rapport intérêt utilisateur/développement semble faible. A priori les modifications seront immédiatement envoyées au serveur (la suppression d’un seul élément sera impossible) et la liste des éléments ne sera plus affichée.

Inspiré de ce message, qui m'a rappellé que je n'avais pas parlé de ce problème qui m'était pourtant arrivé.

Il arrive que vous ayez besoin d'avoir une application web située sous un autre (répertoire virtuel).

Problème : votre application située virtuellement en dessous héritera automatiquement du web.config de l'application parente. Avec tous les problèmes qui en découlent : déclaration de paramètres en doublons (chaînes de connexions, appSettings, etc.), déclaration de types dont l'assembly n'est pas présente, etc.

Exemple (pompé sur l'autre message) :

<httpModules>

  <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>

  <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

</httpModules>

Avec une telle déclaration dans votre site racine, toutes les applications descendantes se retrouveront avec les extensions ajax déclarées. (Peu importe la version du framework d'ailleurs)

Première solution trouvée : celle consistant à supprimer les anciennes déclarations à l'aide d'un <clear /> (là où c'est supporté).

<httpModules>

  <clear/>

</httpModules>

Sauf qu'il y a une autre solution, liée à cette fameuse balise <location /> que l'on utilise souvent pour spécifier des droits sur une page spécifique.

Il suffit en fait d'utiliser l'attribut inheritInChildApplications="false" sur une balise location avec path="." dans votre web.config racine pour pouvoir ainsi y insérer des éléments de configuration qui ne seront pas hérités par les applications descendantes.

<location path="." inheritInChildApplications="false">

  <system.web>
    <httpModules>

      ...

    </httpModules>

  </system.web>
</location>

Ainsi, si vous avez des sections dont vous ne souhaitez surtout pas que les applications descendantes héritent (par prévention), il vous suffit de les déclarer dans cette section.

Emacs.net ?

27 Dec 2007 Classé sous : ,

Tiens tiens... Il semblerait que MS s'intéresse au développement d'un IDE light, vu qu'il est question d'embaucher quelqu'un pour un projet pouvant être décrit comme un "Emacs.net".

Affaire à suivre.

Dans la famille "on en apprend tous les jours", aujourd'hui, l'utilisation des colonnes de type IDENTITY comme compteur dans une table.

Je ne le savais donc pas (la faute, je trouve, à la documentation totalement inexistante à ce propos), mais l'incrémentation des valeurs des colonnes IDENTITY sous Sql Server est totalement déconnectée de toute notion de transaction.

Conséquence directe : si vous effectuez un rollback après une insertion dans une table avec une colonne identité, la valeur du compteur sera consommée et perdue pour la ligne suivante (vous aurez donc un trou dans votre séquence).

Autant la documentation semble parler de trous pouvant survenir lorsque l'on efface des lignes (ce que je conçois tout à fait), autant il m'a fallu me retrouver devant le fait accompli pour constater cette limitation.

Conclusion (on avait déjà quelques tables se servant d'un compteur interne pour générer la séquence, donc on va juste accélérer la migration vers ce mécanisme), n'utilisez pas les colonnes IDENTITY si vous souhaitez avoir une vrai séquence sans trous (même si vous n'effacez pas vos lignes !).

Le titre pourrait laisser penser que je ne connais pas la doc xml déjà proposée par C#, qui permet, par l'intermédiaire des balises <see /> de faire des liens vers des membres.

Non, là je souhaiterai parler d'un nouvel AddIn, HyperAddin, qui permet, dans des commentaire classiques, d'insérer des liens vers d'autres membres directement utilisables depuis Visual Studio.

La syntaxe est relativement simple, comme expliqué dans ce billet : il suffit de précéder le nom du membre recherché par le mot clé "code:".

// Comportement similaire à celui codé dans la méthode code:AutreClasse::Unlock.

Il est aussi possible de créer un lien en commentaire à l'aide d'un #, comme en html

// #exemple

//

// Pour faire un lien, il suffit d'utiliser code:#exemple

Si vous souhaitez référencer un lien nommé d'un autre fichier source, il vous faudra préfixer le nom du lien par le nom d'une classe se trouvant dans le même fichier source.

Je teste ça de suite.

Je viens tout juste de lire ce billet de Scott Hanselman (et suivi par celui de Scott Guthrie) à propos de la sortie de Silverlight 1.0 officiellement aujourd'hui. Il vous suffira de visiter une page hébergeant un contrôle Silverlight pour que la mise à jour vous soit proposée.

Le point le plus intéressant, à mon avis, dans cette annonce est le partenariat officiel de Microsoft et Novell à propos de Moonlight, l'équivalent Mono de Silverlight. Moonlight permettra donc aux utilisateurs de Linux de pouvoir afficher les pages hébergeant des objets Silverlight. Certaines personnes de Microsoft devraient donc participer au développement du projet.

C'est une très bonne chose que Microsoft reconnaisse le boulot fait par les contributeurs de Mono, et ça présage une belle perçée possible pour Silverlight. Personnellement, j'attends surtout la 1.1 pour le support des langages autres que javascript, mais il reste semble-t-il encore pas mal de boulot.

Dommage, à quelques mois près, j'aurais pu proposer à Lasombras de coder le nouveau projet secret sous cette plate-forme :D Peut-être pour la v2...

Le problème des applications et de leurs fichiers ressources est que bien souvent, on souhaiterait que d'autres personnes puissent les modifier. Que ce soit pour corriger des fautes ou modifier la tournure de certaines phrases, voir tout simplement pour traduire l'application.

Comment, donc, permettre à une autre personne de travailler sur cet aspect, sans qu'il ne soit nécessaire de le former à visual studio et toutes les subtilités des fichiers de ressources ?

Je vais faire un petit topo ici des outils que j'ai découverts, étant donné que j'en ai trouvé un de plus aujourd'hui encore, et qu'il me semble être temps de les noter quelque part.

Les éditeurs ResX autonomes

Il s'agit là de simplement permettre d'éditer les fichiers de ressources sans devoir passer par Visual Studio. L'outil "de base" donc pour simplifier le travail d'édition.

  • Resourcer, créé par Ludz Roeder, le créateur de Reflector. Il permet d'éditer les fichiers .resx et .resources (texte et images). Plutôt orienté développeur.
  • Resx Editor, un autre outil dans la même veine, disponible en français mais ne gèrant pas les resources autres que les chaînes.
  • ResEx, un outil qui semble être le plus abouti, plus particulièrement ciblé sur la traduction de resources. Il permet notamment de travailler en mode "side-by-side" entre le fichier en langue originale et la version traduite. Il ajoute des contrôles sur les chaînes formattées (contrôle la présence des {0} dans la version traduite). Celui que je conseillerai le plus à une personne n'était pas développeur.

Les outils pour Visual Studio

  • ResX File Public Code Generator. Il s'agit d'un custom tool qui permet de générer des classes de ressources publiques, au contraire du custom tool de base qui ne génère que des classes internes. Il est ainsi possible d'avoir un .resx dont les ressources seront ensuite accessible depuis d'autres librairies.
  • Resources Refactoring Tool. Un petit AddIn pour visual studio pour permettre d'extraire une chaîne de caractère de votre code directement dans une resource, en remplaçant les autres occurances dans votre projet par cette ressource. Pratique pour repasser derrière du code mal écrit.

Les autres outils (conversion, import/export)

  • Resx To Word est un autre outil de la même société que Resx Editor (PeopleWords) qui permet de transformer un .resx en fichier word, et inversement. Je ne l'ai pas testé personnellement.
  • ResX To Xls (la découverte du jour) permet, lui, d'exporter tous les fichiers ressources d'un projet dans un fichier excel. Le gros avantage est qu'il rassemble tous les fichiers .resx d'un projet dans un seul fichier excel. Il permet ensuite de mettre à jour les fichiers .resx à partir du fichier excel. A tester absolument.

Si vous connaissez d'autres outils, n'hésitez-pas à m'en faire part.

CodeProject : Best of May

31 May 2007 Classé sous :

Je profite de la nouvelle version de Live Writer pour démarrer un petit billet sur les articles les plus intéressants trouvés sur CodeProject pour ce mois-ci. Je tâcherai de partager ainsi quelques trouvailles.

Le système de drafts aidant, j'ai pu noter quelques remarques au fur et à mesure de la publication des articles sur codeprojet.

A noter que je ne parlerai à priori pas d'asp.net dans cette section, tout simplement car je bosse trop peu dessus en ce moment pour m'intéresser à ce qui se fait, même si silverlight me chatouille un peu.

Wizard Control

On commence avec un contrôle d'assistant, pour winforms. Il en existe déjà depuis un moment, mais celui-ci ressemble pas mal à celui que j'ai développé pour nos besoin. Il semble fournir une excellente intégration en mode design, avec un smart menu complet.

Dessin sur document

Un autre framework intéressant (il en existe tellement peu), nommé BizDraw, permettant de créer une interface pour dessiner sur un document (texte, lignes, rectangles, dessin à main levée, etc.) et ensuite l'éditer (impression sur plusieurs pages, mosaique de document). Tellement rare que j'estime indispensable d'en parler.

Création d'un langage pour analyser des expression

Une librairie qui pourra intéresser tous ceux qui se sont un jour frotté à la définition d'un langage et l'analyse d'expressions, ou qui aimeraient en savoir plus en quelques pages. Grammaire, parsers, lexers et toute la petite famille : State of the Art Expression Evaluation.

De la définition de la grammaire au format BNF, suivi de son analyse, de ton test avec des exemples d'AST, et l'implémentation de quelques fonctionnalités pour cette résolution d'expression mathématiques (fonctions mathématiques, fonctions de type IF, etc.)

Un excellent moyen de découvrir ce type de développement si spécifique, très bien illustré ici.

Thème Aero pour tous les contrôles winforms

Pour ceux qui commencent développent des applis winforms pour vista, vous avez certainement remarqué que les thèmes aero ne sont pas systématiquement appliqués aux contrôles, et lorsqu'ils le sont, c'est souvent partiellement.

On revient à la nécessité de renseigner la propriété FlatStyle à System : c'est par exemple nécessaire sur les boutons pour que l'effet de transition soit appliqué lors du survol avec la souris.

Mais certains aspects nécessitent l'appel de SendMessage pour forcer l'activation des thèmes, d'autres l'appel de méthodes de uxtheme.dll, etc.

Cet article permet de se familiariser avec la manipulation des thèmes windows sur les contrôles en passant par du P/Invoke. L'article est développé afin de vous permettre de créer vos contrôles héritant des contrôles de base en ajoutant la gestion complète des nouveautés sur les thèmes de vista.

Utile en attendant de basculer sur WPF (hein mim ?)

Articles mis à jours

Et quelques articles intéressants qui ont été mis à jour ce mois-ci.

Je viens de tomber sur une idée qui m'a d'abord semblée farfelue et inutile, mais dont le résultat m'a finalement agréablement surpris.

C'est une fois de plus le blog de Jeff Atwood qui m'a permis de découvrir cette idée.

Le concept ? Générer une image aléatoire, fonction de votre ip, permettant "d'iconifier" celle-ci et de la rendre mémorisable.

La construction des images est assez simple et les sources (Java) sont fournies. Jeff s'est chargé de porter le code sous .net.

Une belle manière d'afficher l'identifiant unique d'un visiteur, plus agréable qu'une simple ip.

Une question somme toute bête, mais qui pose pas mal de problèmes.

Lorsque vous proposez une couleur de fond dynamique (en particulier pour les pages web), il est parfois difficile de calculer une couleur suffisament contrastée pour le texte.

Voici donc un tout petit morceau de code sensé trouver un résultat convenable dans la majorité des cas.

A noter que les coefficients peuvent être modifiés pour tenter d'obtenir de meilleurs résultats (et oui, l'oeil est plus sensibles aux nuances de vert, les joies de l'évolution).

Pour ceux qui ont déjà eu l'occasion de s'intéresser à l'excellent Enterprise Library, ils seront content d'apprendre que des détails ont été publiés par Tom Hollander sur les Validation Application Block, prévus pour la v3 des Enterprise Library.

Cet outil devrait permettre de définir des contraintes de validation sur vos objets ou leur propriétés, agissant comme des prédicats testés avant exécution du code.

Des espèces d'assert automatisés, définis sur vos classe ou vos propriétés.

A noter que comme les autres composants de EntLib, vous aurez la possibilité de tout piloter via les fichiers de configuration, si vous recherchez ce type de dynamique.

Je suis curieux de voir de quelle manière les problèmes de validation seront remontés à l'appellant, en imaginant que cela devrait permettre de mettre en place d'excellents outils pour garantir la robustesse de votre code métier.

Miam.

Mono Migration Analyzer

28 Nov 2006 Classé sous :

Parce qu'il n'est pas forcément évident de savoir si un programme que l'on a fait pourra être facilement migré vers Mono, Jonathan Pobst vient de publier un outil, Mono Migration Analyzer.

Cet application se charge d'inspecter vos assemblies pour vous fournir une compte rendu indiquant, en 4 chiffres, quelle sont le nombre de méthodes qui pourront poser problème avec l'implémentation actuelle de Mono.

Un exemple d'écran de résultats :

Source : blog de Miguel de Icaza.

Encore une folie en provenance de la team chargée de la vNext de C#, l'ajout d'un nouvel opérateur pour lequel j'ai encore du mal à saisir le réel intérêt.

Il s'agit donc de l'opérateur because, dont la notation est "!!".

L'utilisation est la suivante : on ajoute cet opérateur à la suite d'un prédicat afin de justifier (dans un nouveau prédicat)pourquoi notre premier prédicat est vrai. Si le prédicat "justifiant" est vrai, alors le premier est forcément considéré comme vrai.

Je reprendrais l'exemple du blog d'où je tiens l'info : prenons un prédicat simple :

1 + 1 == 2

On applique l'opérateur because pour confirmer cette assertion.

1 + 1 == 2 !! 2 - 1 == 1

Dans un tel cas, où l'on n'utilise que des constantes, on ne voit pas trop l'intéret d'une telle expression. Maintenant essayez de deviner quel sera le retour de l'évaluation de cette expression :

1 + 1 == 3 !! true

Etrange ? Et bien oui, elle renverra vrai. (A noter que !! true peut être simplement remplacé par !!, on appelle cette notation le "just because").

Je vous laisse vous amuser pour essayer de trouver un cas concret où ce mot-clé pourrait être utile (à part pour redéfinir la vérité).

Y'en a qui s'ennuient :D

On en apprend tous les jours

22 Sep 2006 Classé sous :

Une nouvelle découverte dans les specs du langage c# : l'opérateur ??.

Je connaissais l'opérateur ?:, que j'utilise parfois (même si je m'en méfie dans les codes trop complexes par sa difficulté de lecture), mais je suis tombé sur cette notation en recherchant des infos sur un "singleton par requête".

Bon, je ne suis pas sur qu'il soit raisonnable de l'utiliser en lieu et place d'un bon if classique :

if(toto == null)

  toto = new MaClasse();

return toto;

Surtout que c'est ce qu'il cherche à faire dans son exemple "si telle variable vaut null, l'initialiser ; ensuite renvoyer la variable".

(Pour la petite anecdote, je suis tombé sur ces histoires de ThreadStatic, CallContext, HttpContext car je cherche à mettre en place pour une appli serveur sensée fonctionner à la fois en ASP.NET et en service, donc indépendante de ce fameux HttpContext.Current. Et bien c'est au final loin d'être simple).

Plus de Messages Page suivante »