Accéder aux données locales et distantes dans les applications ClickOnce

La plupart des applications consomment ou produisent des données. ClickOnce vous propose diverses options pour lire et écrire des données, à la fois localement et à distance.

Données locales

Avec ClickOnce, vous pouvez charger et stocker des données localement en utilisant l’une des méthodes suivantes :

  • Répertoire de données ClickOnce

  • Stockage isolé

  • Autres fichiers locaux

Répertoire de données ClickOnce

Chaque application ClickOnce installée sur un ordinateur local a un répertoire de données stocké dans le dossier Documents et paramètres de l’utilisateur. Tous les fichiers compris dans une application ClickOnce et marqués comme des fichiers de « données » sont copiés dans ce répertoire quand une application est installée. Les fichiers de données peuvent être associés à tout type de fichier, les plus fréquemment utilisés étant les fichiers texte, XML et les fichiers de base de données tels que les fichiers .mdb de Microsoft Access.

Le répertoire de données est destiné aux données gérées par l'application, c'est-à-dire les données que l'application stocke et gère explicitement. Tous les fichiers statiques qui ne sont pas des dépendances et ne sont pas marqués en tant que « données » dans le manifeste d'application résident plutôt dans le répertoire de l'application. Ce répertoire contient les fichiers exécutables (.exe) et les assemblys de l’application.

Notes

Quand une application ClickOnce est désinstallée, son répertoire de données est également supprimé. N’utilisez jamais le répertoire de données pour stocker les données gérées par l’utilisateur final, comme des documents.

Marquer des fichiers de données dans une distribution ClickOnce

Pour placer un fichier existant dans le répertoire de données, vous devez marquer le fichier existant comme fichier de données dans le fichier manifeste de votre application ClickOnce. Pour plus d'informations, consultez Guide pratique pour inclure un fichier de données dans une application ClickOnce.

Lire et écrire dans le répertoire de données

La lecture dans le répertoire de données implique que votre application ClickOnce demande une autorisation de lecture. De la même façon, l’écriture dans le répertoire nécessite une autorisation d’écriture. Votre application reçoit automatiquement cette autorisation si elle est configurée pour s'exécuter avec un niveau de confiance totale. Pour plus d’informations sur l’élévation des autorisations pour votre application en utilisant l’élévation d’autorisations ou le déploiement d’applications approuvées, consultez Sécuriser les applications ClickOnce.

Notes

Si votre organisation n'utilise pas le déploiement d'applications approuvées et a désactivé l'élévation d'autorisations, la déclaration des autorisations échoue.

Une fois que votre application dispose de ces autorisations, elle peut accéder au répertoire de données en appelant des méthodes sur les classes dans le System.IO. Vous pouvez obtenir le chemin du répertoire de données dans une application ClickOnce Windows Forms en utilisant la propriété DataDirectory définie sur la propriété CurrentDeployment de ApplicationDeployment. Il s'agit de la façon la plus pratique et recommandée pour accéder à vos données. L’exemple de code suivant montre comment procéder pour un fichier texte nommé CSV.txt que vous avez inclus dans votre déploiement en tant que fichier de données.

Notes

La classe ApplicationDeployment et les API de l’espace de noms System.Deployment.Application ne sont pas prises en charge dans .NET Core, .NET 5 et les versions ultérieures. Dans .NET 7, une nouvelle méthode d’accès aux propriétés de déploiement d’application est prise en charge. Pour plus d’informations, consultez Accéder aux propriétés de déploiement ClickOnce dans .NET. .NET 7 ne prend pas en charge l’équivalent des méthodes ApplicationDeployment.

if (ApplicationDeployment.IsNetworkDeployed)
{
    try
    {
        using (StreamReader sr = new StreamReader(ApplicationDeployment.CurrentDeployment.DataDirectory + @"\CSV.txt"))
        {
            MessageBox.Show(sr.ReadToEnd());
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Could not read file. Error message: " + ex.Message);
    }
}

Pour plus d’informations sur le marquage des fichiers dans votre déploiement en tant que fichiers de données, consultez How to: Include a Data File in a ClickOnce Application.

Vous pouvez également obtenir le chemin d'accès au répertoire de données en utilisant les variables appropriées sur la classe Application , telles que LocalUserAppDataPath.

La manipulation d'autres types de fichiers peut nécessiter des autorisations supplémentaires. Par exemple, si vous voulez utiliser un fichier de base de données Access (.mdb), votre application doit déclarer une confiance totale pour utiliser les classes <xref:System.Data> appropriées.

Répertoire de données et versions d’application

Chaque version d'une application possède son propre répertoire de données, qui est isolé des autres versions. ClickOnce crée ce répertoire indépendamment que des fichiers de données soient inclus ou non dans le déploiement, afin que l’application ait un emplacement pour créer des fichiers de données au moment de l’exécution. Quand une nouvelle version d’une application est installée, ClickOnce copie tous les fichiers de données existants du répertoire de données de la version précédente dans le répertoire de données de la nouvelle version, qu’ils aient été inclus dans le déploiement d’origine ou créés par l’application.

ClickOnce remplace l’ancienne version du fichier par la version plus récente du serveur si un fichier de données a une valeur de hachage dans l’ancienne version de l’application différente de celle de la nouvelle version. Par ailleurs, si la version antérieure de l’application a créé un fichier avec le même nom qu’un fichier inclus dans le déploiement de la nouvelle version, ClickOnce remplace le fichier de l’ancienne version par le nouveau fichier. Dans les deux cas, les anciens fichiers sont inclus dans un sous-répertoire du répertoire de données appelé .pre, de sorte que l’application peut toujours accéder aux anciennes données à des fins de migration.

Si vous avez besoin d’une migration de données plus précise, vous pouvez utiliser l’API Déploiement ClickOnce pour effectuer une migration personnalisée de l’ancien répertoire de données vers le nouveau. Vous devrez vérifier qu'un téléchargement est disponible à l'aide de IsFirstRun, télécharger la mise à jour à l'aide de Update ou UpdateAsync, et effectuer manuellement toute tâche de migration de données personnalisée une fois la mise à jour terminée.

Stockage isolé

Le stockage isolé fournit une API pour la création et l'accès aux fichiers à l'aide d'une API simple. L'emplacement réel des fichiers stockés est masqué pour le développeur et l'utilisateur.

Le stockage isolé fonctionne dans toutes les versions du .NET Framework. Le stockage isolé fonctionne également dans les applications partiellement approuvées sans nécessité d'autorisations supplémentaires. Vous devez utiliser le stockage isolé si votre application doit s'exécuter en mode de confiance partielle, mais qu'elle doit conserver les données propres à l'application.

Pour plus d'informations, consultez Stockage isolé.

Autres fichiers locaux

Si votre application doit utiliser ou enregistrer des données de l'utilisateur final telles que des rapports, images, musique, etc., votre application a besoin de FileIOPermission pour lire et écrire des données dans le système de fichiers local.

Données distantes

Dans certains cas, votre application devra probablement récupérer des informations à partir d'un site web distant, comme des données client ou des informations sur le marché. Cette section traite des techniques les plus courantes pour récupérer des données distantes.

Accéder aux fichiers avec HTTP

Vous pouvez accéder aux données à partir d'un serveur web à l'aide de la classe WebClient ou HttpWebRequest dans l'espace de noms System.Net . Les données peuvent être des fichiers statiques ou des applications ASP.NET qui renvoient du texte brut ou des données XML. Si vos données sont au format XML, le moyen le plus rapide de les récupérer est d'utiliser la classe XmlDocument , dont la méthode Load accepte une URL comme argument. Pour obtenir un exemple, consultez Lire un document XML dans le DOM.

Vous devez prendre en compte la sécurité quand votre application accède à des données distantes sur HTTP. Par défaut, l’accès de votre application ClickOnce aux ressources réseau peut être restreint, selon la façon dont votre application a été déployée. Ces restrictions sont appliquées pour empêcher les programmes malveillants d'accéder à des données distantes privilégiées ou d'utiliser l'ordinateur d'un utilisateur pour attaquer d'autres ordinateurs sur le réseau.

Le tableau suivant répertorie les stratégies de déploiement que vous pouvez utiliser ainsi que leurs autorisations web par défaut.

Type de déploiement Autorisations réseau par défaut
Installation web Ne peut accéder qu'au serveur web à partir duquel l'application a été installée.
Installation à partir d'un partage de fichiers Ne peut pas accéder à tous les serveurs web
Installation à partir d'un CD-ROM Peut accéder à tous les serveurs web

Si votre application ClickOnce ne peut pas accéder à un serveur web en raison des restrictions de sécurité, l’application doit déclarer WebPermission pour ce site web. Pour plus d'informations sur l’augmentation des autorisations de sécurité pour une application ClickOnce, consultez Sécuriser les applications ClickOnce.

Accéder aux données avec un service web XML

Si vous exposez vos données en tant que service web XML, vous pouvez accéder aux données à l'aide d'un proxy de service web XML. Le proxy est une classe .NET Framework que vous pouvez créer dans Visual Studio. Les opérations du service web XML, par exemple, la récupération de clients, le passage de commandes, etc., sont exposées en tant que méthodes sur le proxy. De cette façon, les services web sont beaucoup plus faciles à utiliser que les fichiers de texte brut ou XML.

Si votre service web XML fonctionne sur HTTP, le service sera lié par les mêmes restrictions de sécurité que les classes WebClient et HttpWebRequest .

Accéder directement à une base de données

Vous pouvez utiliser les classes de l'espace de noms System.Data pour établir des connexions directes à un serveur de base de données tel que SQL Server sur votre réseau, mais vous devez prendre en compte les problèmes de sécurité. Contrairement aux requêtes HTTP, les demandes de connexion de base de données sont toujours interdites par défaut dans un contexte de confiance partielle. Vous avez cette autorisation par défaut uniquement si vous installez votre application ClickOnce à partir d’un CD-ROM. Ce qui lui donne un niveau de confiance totale. Pour permettre l'accès à une base de données SQL Server spécifique, votre application doit lui demander l'autorisation SqlClientPermission , pour permettre l'accès à une base de données autre que SQL Server, elle doit demander l'autorisation OleDbPermission.

La plupart du temps, vous n’avez pas besoin d’accéder directement à la base de données, mais plutôt à travers une application de serveur web écrite en ASP.NET ou un service web XML. L’accès à la base de données de cette manière est généralement la meilleure méthode si votre application ClickOnce est déployée à partir d’un serveur web. Vous pouvez accéder au serveur dans un contexte de confiance partielle sans élever les autorisations de votre application.