2010-02-05 4 views
1

Je suis en train de concevoir une application en utilisant .NET 2.0 Remoting. Il a un seul serveur et plusieurs clients qui sont des postes de travail ou des ordinateurs portables qui peuvent être en ligne ou hors ligne à tout moment.Conception d'une application client/serveur pour mettre à jour le logiciel client automatiquement

Une partie de la conception est que le serveur contient une copie du fichier MSI du programme d'installation du client. Le plan est que pour la première installation, les clients seront déployés à l'aide de la stratégie de groupe, mais qu'une fois installé, le logiciel client sera automatiquement mis à jour à partir du serveur chaque fois que la copie du serveur est mise à jour. Pour faire le transfert est techniquement facile à distance, le serveur charge le fichier de mise à jour en utilisant File.ReadAllBytes dans un tableau byte [], l'attache à un objet distant, puis le client l'enregistre en utilisant File.WriteAllBytes et utilise Process .Démarrer pour lancer l'installation de msi en utilisant/passive.

La question de conception est de savoir si la mise à jour doit être poussée à partir du serveur ou retirée des clients. Pousser du serveur est plus rapide, mais laisse l'inconvénient que les clients peuvent être déconnectés et peuvent avoir besoin d'être mis à jour à un moment aléatoire à l'avenir quand ils se connectent. Tirer du client est préférable car cela permet aux clients de se mettre à jour automatiquement au fur et à mesure qu'ils se connectent.

Il y a de nombreuses façons d'atteindre cet objectif, toutes donnent lieu à des problèmes de versionnement avec les objets utilisés dans l'appel à distance et nécessitent des versions ultérieures pour conserver la compatibilité pour les interfaces de mise à niveau. Le principal inconvénient du client tirant le fichier est que de nombreux clients peuvent surcharger le serveur (le fichier msi à transférer est 5mb et il peut y avoir 200 clients) et bien que je puisse programmer les clients à réessayer jusqu'à réussir, sur le serveur côté il semble y avoir aucun moyen simple de planifier le nombre de threads à distance reçus car une fois que j'ai chargé le paquet et renvoyé le contrôle à l'interface distante côté serveur, il n'y a pas de moyen facile de déterminer le temps de transfert réel. les données prennent. J'ai envisagé un grand nombre de solutions de contournement, y compris la limitation des connexions réelles par numéro sur une période de temps, mais cela ne reflète jamais la capacité de travail réelle du réseau local et ne semble toujours pas être une idée. Je pourrais probablement utiliser un récepteur de canal personnalisé pour contrôler le nombre de threads (j'ai déjà installé un ensemble complet de récepteurs personnalisés) mais je souhaite éviter cela si cela est possible car cela devrait être un dernier recours. Je préférerais garder la logique hors des canaux pour plus de simplicité.

Existe-t-il des applications .NET bien connues qui offrent ce type de mises à jour automatiques des données aux clients qui peuvent être connectés ou déconnectés à tout moment?

Répondre

3

Pour une solution pré-compilée dans .NET pour maintenir à jour les versions client des logiciels, ClickOnce, inclus avec Visual Studio, fait un travail assez fiable. Au démarrage de l'application, l'application vérifie si une version mise à jour a été téléchargée sur un serveur. Si une nouvelle version est présente, elle téléchargera automatiquement la dernière version et l'installera.

Pour un projet relativement simple, ClickOnce fonctionne généralement très bien et est extrêmement simple à démarrer. Vous économiserez l'effort d'écrire le code de vérification de mise à jour et le code de transfert, et puisqu'il fonctionnera sur IIS, vos soucis concernant le téléchargement de plusieurs utilisateurs sont quelque peu soulagés (il est toujours possible d'épuiser votre bande passante un grand nombre de clients).

+0

Merci Ryan. J'ai besoin de contrôler la distribution à partir de mon propre serveur .NET personnalisé fonctionnant sur le LAN du client et je ne veux pas m'impliquer avec IIS. J'ai tout le code de transfert et de vérification déjà écrit (c'est relativement simple de faire le travail réel dans .NET). J'ai jeté un coup d'œil à ClickOnce mais ça n'a pas vraiment fait ce dont j'avais besoin. Il existe de nombreuses applications comme les antivirus de réseau qui poussent les mises à jour vers les clients, mais elles semblent être principalement héritées (c.-à-d.C++ natif). Symantec Antivirus. J'ai l'option pour pousser ou tirer les mises à jour de toute façon – BrianJK

+0

Puis-je demander pourquoi IIS/ClickOnce est inapproprié? Des choses comme les fichiers de service ont tendance à être faciles à résoudre mais présentent des problèmes lorsqu'ils sont exposés à n'importe quelle échelle (par exemple, vous ne voudrez probablement pas transférer des fichiers avec ReadAllBytes et WriteAllBytes) –

+0

Qu'est-ce qui ne va pas avec ReadAllBytes? Est-ce buggy? J'utilise seulement cela pour charger et enregistrer les fichiers localement. IIS Je ne veux pas forcer l'utilisateur à installer. ClickOnce ne me donne pas le contrôle de la distribution dont j'ai besoin et nécessite IIS – BrianJK

Questions connexes