Partager via


Nouveautés d’ASP.NET MVC 2

Ce document décrit les nouvelles fonctionnalités et améliorations introduites dans ASP.NET MVC 2.

Introduction
Mise à niveau d’un projet MVC 1.0 ASP.NET vers ASP.NET MVC 2
Nouvelles fonctionnalités
Helpers avec modèle
Zones (Areas)
Prise en charge des contrôleurs asynchrones
Prise en charge de DefaultValueAttribute dans les paramètres Action-Method
Prise en charge de la liaison de données binaires avec des classeurs de modèles
Classes ModelMetadata et ModelMetadataProvider
Prise en charge des attributs DataAnnotations
Fournisseurs de validateurs de modèle
Validation côté client
Nouveaux extraits de code pour Visual Studio 2010
Nouveau filtre d’action RequireHttpsAttribute
Substitution du verbe de méthode HTTP
Nouvelle classe HiddenInputAttribute pour les helpers templated
La méthode d’assistance Html.ValidationSummary peut afficher les erreurs Model-Level
Les modèles T4 dans Visual Studio génèrent du code spécifique à la version cible des améliorations de l’API .NET Framework
Changements importants
Clause d’exclusion de responsabilité

Introduction

ASP.NET MVC 2 s’appuie sur ASP.NET MVC 1.0 et introduit un large ensemble d’améliorations et de fonctionnalités axées sur l’augmentation de la productivité. Cette version étant compatible avec ASP.NET MVC 1.0, toutes vos connaissances, compétences, code et extensions pour ASP.NET MVC 1.0 continuent de s’appliquer.

Pour plus d’informations sur ASP.NET MVC, consultez les ressources suivantes :

Mise à niveau d’un projet MVC 1.0 ASP.NET vers ASP.NET MVC 2

ASP.NET MVC 2 peut être installé côte à côte avec ASP.NET MVC 1.0 sur le même serveur, ce qui permet aux développeurs d’applications de choisir quand mettre à niveau une application MVC 1.0 ASP.NET vers ASP.NET MVC 2. Pour plus d’informations sur la mise à niveau, consultez le document Mise à niveau d’une application MVC 1.0 ASP.NET vers ASP.NET MVC 2.

Nouvelles fonctionnalités

Cette section décrit les fonctionnalités qui ont été introduites dans la version 2 de MVC.

Helpers avec modèle

Les assistances avec modèle vous permettent d’associer automatiquement des éléments HTML pour la modification et l’affichage avec des types de données. Par exemple, lorsque des données de type System.DateTime sont affichées dans une vue, un élément d’interface utilisateur du sélecteur de date peut être automatiquement rendu. Cela est similaire au fonctionnement des modèles de champ dans ASP.NET données dynamiques. Pour plus d’informations, consultez Utilisation de modèles d’assistance pour afficher des données sur le site Web MSDN.

Zones (Areas)

Les zones vous permettent d’organiser un projet volumineux en plusieurs sections plus petites afin de gérer la complexité d’une application web volumineuse. Chaque section (« zone ») représente généralement une section distincte d’un site Web volumineux et est utilisée pour regrouper des ensembles de contrôleurs et d’affichages associés. Pour plus d’informations, consultez Procédure pas à pas : organisation d’une application MVC ASP.NET par zones sur le site Web MSDN.

Pour créer une zone, dans Explorateur de solutions, cliquez avec le bouton droit sur le projet, cliquez sur Ajouter, puis sur Zone. Cela affiche une boîte de dialogue qui vous invite à entrer le nom de la zone. Après avoir entré le nom de la zone, Visual Studio ajoute une nouvelle zone au projet.

La figure suivante montre un exemple de disposition pour un projet avec deux zones, Administration et Blogs.

Capture d’écran montrant un exemple de disposition d’un projet dans la zone de liste déroulante Explorateur de solutions avec deux zones, Administration et blogs.

Lorsque vous créez une zone, Visual Studio ajoute une classe qui dérive de AreaRegistration à chaque zone. Cette classe est requise pour inscrire la zone et ses itinéraires, comme illustré dans l’exemple suivant :

namespace MyApplication.Areas.Blog {
    public class BlogAreaRegistration : AreaRegistration {
        public override string AreaName {
            get { return "blog"; }
        }

        public override void RegisterArea(AreaRegistrationContext context) {
            context.MapRoute(
                "blog_default",
                "blog/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );

            context.MapRoute(
                "blog_whatsnew",
                "whats-new",
                new { action = "WhatsNew", id = UrlParameter.Optional  }
            );
        }
    }
}

Le modèle de projet par défaut pour ASP.NET MVC 2 inclut un appel à la méthode RegisterAllAreas dans le code du fichier Global.asax. Cette méthode inscrit chaque zone du projet en recherchant tous les types qui dérivent de la classe AreaRegistration, en instanciant une instance du type, puis en appelant la méthode RegisterArea sur le instance. L’exemple suivant montre comment procéder.

public class MyMvcApplication : HttpApplication {

    void App_Start() {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);
    }

    public static void RegisterRoutes(RouteCollection routes) {
        routes.MapRoute("default", "{controller}/{action}/{id}", ...);
    }
}

Si vous ne spécifiez pas l’espace de noms dans la méthode RegisterArea en appelant le contexte. Namespaces.Add, méthode, l’espace de noms de la classe d’inscription est utilisé par défaut.

Prise en charge des contrôleurs asynchrones

ASP.NET MVC 2 permet désormais aux contrôleurs de traiter les demandes de manière asynchrone. Cela peut entraîner des gains de performances en autorisant les serveurs qui appellent fréquemment des opérations bloquantes (comme les demandes réseau) à appeler des équivalents non bloquants à la place. Pour plus d’informations, consultez la rubrique Utilisation d’un contrôleur asynchrone dans ASP.NET MVC sur MSDN.

Prise en charge de DefaultValueAttribute dans les paramètres Action-Method

La classe System.ComponentModel.DefaultValueAttribute permet de fournir une valeur par défaut pour le paramètre d’argument à une méthode d’action. Par exemple, supposons que l’itinéraire par défaut suivant est défini :

{controller}/{action}/{id}

Supposons également que le contrôleur et la méthode d’action suivants sont définis :

public class ArticleController {
    public ActionResult View(int id, [DefaultValue(1)]int page) {
    }
}

L’une des URL de requête suivantes appelle la méthode d’action View définie dans l’exemple précédent.

  • /Article/View/123
  • /Article/View/123?page=1 (En fait, identique à la demande précédente)
  • /Article/View/123?page=2

Sans l’attribut DefaultValueAttribute, la première URL de la liste précédente ne fonctionnerait pas, car l’argument page est un type de valeur non nullable dont la valeur n’a pas été fournie.

Si votre code est écrit en Visual Basic 2010 ou Visual C# 2010, vous pouvez utiliser des paramètres facultatifs au lieu de l’attribut DefaultValueAttribute, comme illustré dans l’exemple suivant :

Function View(ByVal id As Integer, Optional ByVal page As Integer = 1) _
        As ActionResult
    ' ...
End Function

public ActionResult MyAction(int id, int page = 1) {
    // ...
}

Prise en charge de la liaison de données binaires avec des classeurs de modèles

Il existe deux nouvelles surcharges de l’assistance Html.Hidden qui encodent les valeurs binaires en tant que chaînes encodées en base 64 :

public static string Hidden(this HtmlHelper htmlHelper, string name, Binary value);

public static string Hidden(this HtmlHelper htmlHelper, string name, byte[] value);

Une utilisation classique consiste à incorporer un horodatage pour un objet dans la vue. Par exemple, votre application peut inclure l’objet Product suivant :

public class Product {
    //... other properties ...	
    public byte[] TimeStamp {
        get;
        set;
    }
}

Un formulaire de modification peut afficher la propriété TimeStamp dans le formulaire, comme illustré dans l’exemple suivant :

<%@ Page Inherits="ViewPage<Product>" %>
<%= Html.Hidden("TimeStamp", Model.TimeStamp) %>

Ce balisage restitue un élément d’entrée masqué avec la valeur timestamp en tant que chaîne encodée en base 64 qui ressemble à l’exemple suivant :

<input type="hidden" name="TimeStamp" value="QVNQLk5FVCBNVkMgaXMgZnVuIQ==" />

Ce formulaire peut être publié dans une méthode d’action qui a un argument de type Product, comme illustré dans l’exemple suivant :

public ActionResult Edit(Product p) {
    // p.TimeStamp is populated from the form
}

Dans la méthode d’action, la propriété TimeStamp est renseignée correctement, car la chaîne encodée en base 64 publiée est convertie en tableau d’octets.

Classes ModelMetadata et ModelMetadataProvider

La classe ModelMetadataProvider fournit une abstraction permettant d’obtenir des métadonnées pour le modèle dans une vue. MVC 2 inclut un fournisseur par défaut qui met à disposition les métadonnées exposées par les attributs dans l’espace de noms System.ComponentModel.DataAnnotations. Il est possible de créer des fournisseurs de métadonnées qui fournissent des métadonnées à partir d’autres magasins de données, tels que des bases de données ou des fichiers XML.

La classe ViewDataDictionary expose un objet ModelMetadata qui contient les métadonnées extraites du modèle par la classe ModelMetadataProvider. Cela permet aux helpers modélysés de consommer ces métadonnées et d’ajuster leur sortie en conséquence.

Pour plus d’informations, consultez la documentation relative aux classes ModelMetadata et ModelMetadataProvider .

Prise en charge des attributs DataAnnotations

ASP.NET MVC 2 prend en charge l’utilisation des attributs de validation RangeAttribute, RequiredAttribute, StringLengthAttribute et RegexAttribute (définis dans l’espace de noms System.ComponentModel.DataAnnotations) lorsque vous liez à un modèle afin de fournir une validation d’entrée.

Pour plus d’informations, consultez Guide pratique pour valider des données de modèle à l’aide d’attributs DataAnnotations sur le site Web MSDN. Un exemple de projet illustrant l’utilisation de ces attributs est disponible en téléchargement à l’adresse https://go.microsoft.com/fwlink/?LinkId=157753.

fournisseurs Model-Validator

La classe de fournisseur de validation de modèle représente une abstraction qui fournit une logique de validation pour le modèle. ASP.NET MVC inclut un fournisseur par défaut basé sur des attributs de validation inclus dans l’espace de noms System.ComponentModel.DataAnnotations. Vous pouvez également créer vos propres fournisseurs de validation qui définissent des règles de validation personnalisées et des mappages personnalisés de règles de validation sur le modèle. Pour plus d’informations, consultez la documentation relative à la classe ModelValidatorProvider .

validation Client-Side

La classe de fournisseur de validateur de modèle expose les métadonnées de validation au navigateur sous la forme de données sérialisées JSON qui peuvent être consommées par une bibliothèque de validation côté client. ASP.NET MVC 2 inclut une bibliothèque et un adaptateur de validation client qui prennent en charge les attributs de validation de l’espace de noms DataAnnotations mentionnés précédemment. La classe de fournisseur vous permet également d’utiliser d’autres bibliothèques de validation client en écrivant un adaptateur qui traite les données JSON et appelle dans la bibliothèque alternative.

Nouveaux extraits de code pour Visual Studio 2010

Un ensemble d’extraits de code HTML pour ASP.NET MVC 2 est installé avec Visual Studio 2010. Pour afficher la liste de ces extraits de code, dans le menu Outils, sélectionnez Gestionnaire d’extraits de code. Pour la langue, sélectionnez HTML et, pour l’emplacement, sélectionnez ASP.NET MVC 2. Pour plus d’informations sur l’utilisation des extraits de code, consultez la documentation Visual Studio.

Nouveau filtre d’action RequireHttpsAttribute

ASP.NET MVC 2 inclut une nouvelle classe RequireHttpsAttribute qui peut être appliquée aux méthodes d’action et aux contrôleurs. Par défaut, le filtre redirige une requête non SSL (HTTP) vers l’équivalent SSL (HTTPS).

Substitution du verbe de méthode HTTP

Lorsque vous créez un site Web à l’aide du style architectural REST, les verbes HTTP sont utilisés pour déterminer l’action à effectuer pour une ressource. REST nécessite que les applications prennent en charge la gamme complète des verbes HTTP courants, notamment GET, PUT, POST et DELETE.

ASP.NET MVC 2 inclut de nouveaux attributs que vous pouvez appliquer aux méthodes d’action et à la syntaxe compacte de cette fonctionnalité. Ces attributs permettent ASP.NET MVC de sélectionner une méthode d’action basée sur le verbe HTTP. Dans l’exemple suivant, une requête POST appelle la première méthode d’action et une requête PUT appelle la deuxième méthode d’action.

[HttpPost]
public ActionResult Edit(int id)

[HttpPut]
public ActionResult Edit(int id, Tag tag)

Dans les versions antérieures de ASP.NET MVC, ces méthodes d’action nécessitaient une syntaxe plus détaillée, comme illustré dans l’exemple suivant :

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id) 

[AcceptVerbs(HttpVerbs.Put)] 
public ActionResult Edit(int id, Tag tag)

Étant donné que les navigateurs prennent uniquement en charge les verbes HTTP GET et POST, il n’est pas possible de publier sur une action qui nécessite un verbe différent. Par conséquent, il n’est pas possible de prendre en charge en mode natif toutes les demandes RESTful.

Toutefois, pour prendre en charge les requêtes RESTful pendant les opérations POST, ASP.NET MVC 2 introduit une nouvelle méthode d’assistance HTML HttpMethodOverride. Cette méthode restitue un élément d’entrée masqué qui permet au formulaire d’émuler efficacement n’importe quelle méthode HTTP. Par exemple, à l’aide de la méthode d’assistance HTML HttpMethodOverride, vous pouvez faire apparaître une soumission de formulaire comme une requête PUT ou DELETE. Le comportement de HttpMethodOverride affecte les attributs suivants :

  • HttpPostAttribute
  • HttpPutAttribute
  • HttpGetAttribute
  • HttpDeleteAttribute
  • AcceptVerbsAttribute

L’élément d’entrée masqué a son nom X-HTTP-Method-Override et sa valeur définie sur le verbe HTTP à émuler. La valeur de remplacement peut également être spécifiée dans un en-tête HTTP ou dans une valeur de chaîne de requête sous la forme d’une paire nom/valeur.

Le remplacement ne peut être utilisé que lorsque la requête réelle est une requête POST. La valeur de remplacement est ignorée pour les requêtes qui utilisent n’importe quel autre verbe HTTP.

Nouvelle classe HiddenInputAttribute pour les helpers avec modèle

Vous pouvez appliquer le nouvel attribut HiddenInputAttribute à une propriété de modèle pour indiquer si un élément d’entrée masqué doit être affiché lors de l’affichage du modèle dans un modèle d’éditeur. (L’attribut définit une valeur UIHint implicite de HiddenInput). La propriété DisplayValue de l’attribut vous permet de spécifier si la valeur est affichée dans les modes d’affichage et d’éditeur. Lorsque DisplayValue a la valeur false, rien n’est affiché, pas même le balisage HTML qui entoure normalement un champ. La valeur par défaut de DisplayValue est true.

Vous pouvez utiliser l’attribut HiddenInputAttribute dans les scénarios suivants :

  • Lorsqu’une vue permet aux utilisateurs de modifier l’ID d’un objet, il est nécessaire d’afficher la valeur et de fournir un élément d’entrée masqué qui contient l’ancien ID afin qu’il puisse être renvoyé au contrôleur.
  • Lorsqu’une vue permet aux utilisateurs de modifier une propriété binaire qui ne doit jamais être affichée, telle qu’une propriété timestamp. Dans ce cas, la valeur et le balisage HTML environnant (par exemple, l’étiquette et la valeur) ne sont pas affichés.

L’exemple suivant montre comment utiliser la classe HiddenInputAttribute.

public class ProductViewModel {
    [HiddenInput] // equivalent to [HiddenInput(DisplayValue=true)]
    public int Id { get; set; }

    public string Name { get; set; }

    [HiddenInput(DisplayValue=false)]
    public byte[] TimeStamp { get; set; }
}

Lorsque l’attribut est défini sur true (ou qu’aucun paramètre n’est spécifié), les opérations suivantes se produisent :

  • Dans les modèles d’affichage, une étiquette est affichée et la valeur est affichée à l’utilisateur.
  • Dans les modèles d’éditeur, une étiquette est affichée et la valeur est rendue dans un élément d’entrée masqué.

Lorsque l’attribut a la valeur false, les opérations suivantes se produisent :

  • Dans les modèles d’affichage, rien n’est rendu pour ce champ.
  • Dans les modèles d’éditeur, aucune étiquette n’est affichée et la valeur est rendue dans un élément d’entrée masqué.

La méthode d’assistance Html.ValidationSummary peut afficher des erreurs Model-Level

Au lieu d’afficher toujours toutes les erreurs de validation, la méthode d’assistance Html.ValidationSummary a une nouvelle option pour afficher uniquement les erreurs au niveau du modèle. Cela permet d’afficher les erreurs au niveau du modèle dans le résumé de validation et les erreurs spécifiques aux champs à afficher en regard de chaque champ.

Les modèles T4 dans Visual Studio génèrent du code spécifique à la version cible du .NET Framework

Une nouvelle propriété est disponible pour les fichiers T4 à partir de l’hôte T4 ASP.NET MVC qui spécifie la version du .NET Framework utilisée par l’application. Cela permet aux modèles T4 de générer du code et du balisage spécifiques à une version du .NET Framework. Dans Visual Studio 2008, la valeur est toujours .NET 3.5. Dans Visual Studio 2010, la valeur est .NET 3.5 ou .NET 4.

Améliorations apportées à l’API

Cette section décrit les modifications apportées aux membres et aux types ASP.NET MVC existants.

  • Ajout d’une méthode CreateActionInvoker virtuelle protégée dans la classe Controller. Cette méthode est appelée par la propriété ActionInvoker de Controller et permet une instanciation différée de l’appelant si aucun appelant n’est déjà défini.
  • Ajout d’une méthode handleUnauthorizedRequest virtuelle protégée dans la classe AuthorizeAttribute. Cela permet aux filtres qui dérivent de AuthorizeAttribute de contrôler le comportement en cas d’échec de l’autorisation.
  • Ajout d’une méthode Add(string key, object value) dans la classe ValueProviderDictionary. Cela vous permet d’utiliser la syntaxe de l’initialiseur de dictionnaire pour ValueProviderDictionary, comme dans l’exemple suivant :
Controller c = new MyController();
c.ValueProvider = new ValueProviderDictionary(null) {
    { "example1", "example1Value" },
    { "example2", "example2Value" },
    { "example3", new int[] { 1, 2, 3 } }
};
  • Ajout d’une méthode get_object dans la classe Sys.Mvc.AjaxContext. Il s’agit d’une méthode JavaScript similaire à la méthode get_data, mais si le type de contenu de la réponse est application/json, get_object retourne l’objet JSON.
  • Ajout d’une propriété ActionDescriptor dans la classe AuthorizationContext.
  • Ajout d’un jeton UrlParameter.Optional qui peut être utilisé pour contourner les problèmes lors de la liaison à un modèle qui contient une propriété ID lorsque la propriété est absente dans un billet de formulaire. Pour plus d’informations, consultez l’entrée ASP.NET Paramètres d’URL facultatifs MVC 2 sur le blog de Phil Haack.

Changements cassants

Les modifications suivantes peuvent entraîner des erreurs dans les applications ASP.NET MVC 1.0 existantes.

Modification du comportement de validation des propriétés pour les classes qui implémentent IDataErrorInfo

Pour les objets de modèle qui utilisent IDataErrorInfo pour effectuer la validation, chaque propriété est validée, qu’une nouvelle valeur ait ou non été définie. Dans ASP.NET MVC 1.0, seules les propriétés qui avaient de nouvelles valeurs définies ont été validées. Dans ASP.NET MVC 2, la propriété Error de IDataErrorInfo est appelée uniquement si tous les validateurs de propriété ont réussi.

Le script de mappage de script IIS n’est plus disponible dans le programme d’installation

Le script de mappage de script IIS est un script de ligne de commande qui est utilisé pour configurer des mappages de script pour IIS 6 et pour IIS 7 en mode classique. Le script de mappage de script n’est pas nécessaire si vous utilisez visual Studio Development Server ou si vous utilisez IIS 7 en mode intégré. Les scripts sont disponibles sous la forme d’un téléchargement distinct non pris en charge sur le ASP.NET WebStack.

La méthode d’assistance Html.Substitute dans MVC Futures n’est plus disponible

En raison des modifications apportées au comportement de rendu des moteurs d’affichage MVC, la méthode d’assistance Html.Substitute ne fonctionne pas et a été supprimée.

L’interface IValueProvider remplace toutes les utilisations d’IDictionary

Chaque argument de propriété ou de méthode qui a accepté IDictionary dans MVC 1.0 accepte désormais IValueProvider. Cette modification affecte uniquement les applications qui incluent des fournisseurs de valeurs personnalisés ou des classeurs de modèles personnalisés. Voici des exemples de propriétés et de méthodes affectées par cette modification :

  • Propriété ValueProvider des classes ControllerBase et ModelBindingContext.
  • Méthodes TryUpdateModel de la classe Controller.

De nouvelles classes CSS ont été ajoutées dans le fichier Site.css

Le fichier Site.css dans les modèles de projet ASP.NET MVC a été mis à jour pour inclure de nouveaux styles utilisés par la fonctionnalité de validation et par les helpers avec modèle.

Les helpers retournent maintenant un objet MvcHtmlString

Afin de tirer parti de la nouvelle syntaxe d’expression d’encodage HTML dans ASP.NET 4, le type de retour pour les helpers HTML est désormais MvcHtmlString au lieu d’une chaîne. Si vous utilisez ASP.NET MVC 2 et les nouvelles assistances sur ASP.NET 3.5, vous ne pourrez pas tirer parti de la syntaxe d’encodage HTML ; la nouvelle syntaxe est disponible uniquement lorsque vous exécutez ASP.NET MVC 2 sur ASP.NET 4.

JsonResult répond désormais uniquement aux requêtes HTTP POST

Afin d’atténuer les attaques de détournement JSON qui ont le potentiel de divulgation d’informations, par défaut, la classe JsonResult répond désormais uniquement aux requêtes HTTP POST. Les appels Ajax GET aux méthodes d’action qui retournent un objet JsonResult doivent être modifiés pour utiliser POST à la place. Si nécessaire, vous pouvez remplacer ce comportement en définissant la nouvelle propriété JsonRequestBehavior de JsonResult. Pour plus d’informations sur l’exploit potentiel, consultez le billet de blog JSON Hijacking sur le blog de Phil Haack.

Les setters des propriétés Model et ModelType sur ModelBindingContext sont obsolètes

Une nouvelle propriété ModelMetadata settable a été ajoutée à la classe ModelBindingContext. La nouvelle propriété encapsule les propriétés Model et ModelType. Bien que les propriétés Model et ModelType soient obsolètes, pour la compatibilité descendante, les getters de propriété fonctionnent toujours ; ils délèguent à la propriété ModelMetadata pour récupérer la valeur.

Les modifications apportées à la classe DefaultControllerFactory interrompent les fabriques de contrôleurs personnalisés qui en dérivent

La classe DefaultControllerFactory a été corrigée en supprimant la propriété RequestContext. À la place de cette propriété, le contexte de requête instance est passé aux méthodes virtuelles protégées GetControllerInstance et GetControllerType. Cette modification affecte les fabriques de contrôleurs personnalisés qui dérivent de DefaultControllerFactory.

Les fabriques de contrôleurs personnalisés sont souvent utilisées pour fournir une injection de dépendances pour ASP.NET applications MVC. Pour mettre à jour les fabriques de contrôleurs personnalisées afin de prendre en charge ASP.NET MVC 2, modifiez la ou les signatures de la méthode pour qu’elles correspondent aux nouvelles signatures et utilisez le paramètre de contexte de requête au lieu de la propriété .

« Area » est désormais une clé de valeur d’itinéraire réservée

La chaîne « zone » dans Valeurs de route a désormais une signification spéciale dans ASP.NET MVC, de la même façon que « controller » et « action ». L’une des implications est que si les helpers HTML sont fournis avec un dictionnaire route-valeur contenant « area », les helpers n’ajoutent plus « area » dans la chaîne de requête.

Si vous utilisez la fonctionnalité Zones, veillez à ne pas utiliser {area} dans le cadre de l’URL de votre itinéraire.

Clause d'exclusion de responsabilité

Ce document est une version préliminaire et peut être modifié substantiellement avant le lancement de la mise en production commerciale finale du logiciel qu’il décrit.

Les informations contenues dans le présent document reflètent l'opinion de Microsoft Corporation sur les sujets abordés à la date de publication. Microsoft se doit de s'adapter aux conditions fluctuantes du marché, et cette opinion ne peut être considérée comme un engagement de sa part. Microsoft ne peut garantir la véracité de toute information présentée après la date de publication.

Ce livre blanc est fourni à titre d'information uniquement. MICROSOFT NE FOURNIT AUCUNE GARANTIE, EXPRESSE, IMPLICITE OU LÉGALE, QUANT AUX INFORMATIONS CONTENUES DANS CE DOCUMENT.

L’utilisateur est tenu d’observer la réglementation relative aux droits d’auteur applicable dans son pays. Aucune partie de ce document ne peut être reproduite, stockée ou introduite dans un système de restitution, ou transmise à quelque fin ou par quelque moyen que ce soit (électronique, mécanique, photocopie, enregistrement ou autre) sans la permission expresse et écrite de Microsoft Corporation.

Les produits mentionnés dans ce document peuvent faire l'objet de brevets, de dépôts de brevets en cours, de marques, de droits d'auteur ou d'autres droits de propriété intellectuelle et industrielle de Microsoft. Sauf stipulation expresse contraire d'un contrat de licence écrit de Microsoft, la fourniture de ce document n'a pas pour effet de vous concéder une licence sur ces brevets, marques, droits d'auteur ou autres droits de propriété intellectuelle.

Sauf indication contraire, les exemples de sociétés, d’organisations, de produits, de noms de domaine, d’adresses e-mail, de logos, de personnes, de lieux et d’événements décrits ici sont fictifs, et aucune association avec une entreprise réelle, organization, produit, nom de domaine, adresse e-mail, logo, personne, lieu ou événement n’est prévue ou ne doit être déduite.

© Microsoft Corporation 2010. Tous droits réservés.

Microsoft et Windows sont soit des marques déposées de Microsoft Corporation, soit des marques de Microsoft Corporation aux États-Unis d'Amérique et/ou dans d'autres pays.

Les noms des sociétés et des produits mentionnés dans le présent document peuvent être des marques de leurs propriétaires respectifs.