2009-11-30 20 views
1

Je voudrais fournir un grand nombre d'applications .net internes avec un moyen léger d'annoncer qu'ils sont utilisés. Mon objectif est de garder une trace des utilisateurs qui pourraient bénéficier des check-ins de soutien et/ou des rappels pour mettre à niveau.Un bon mécanisme de diffusion pour les applications .net internes pour annoncer leur emplacement et leur version?

Ceci est sur un réseau interne. Il y a certainement une connectivité IP entre toutes les machines, et probablement UDP. (Mais probablement pas multicast)

Ecrire à un partage interne connu ou charger une URL connue serait une possibilité, mais je voudrais minimiser l'impact sur l'application elle-même aussi complètement que possible, même au détriment de la fiabilité. Je préférerais ne pas risquer un timeout (par exemple si j'accède à une ressource centralisée et qu'elle a disparu), et idéalement je préfère ne pas lancer de thread de travail non plus.

Il serait également bien d'autoriser plusieurs écouteurs, ce qui est une autre raison pour laquelle je pense à la diffusion plutôt qu'à l'invocation d'un service.

Existe-t-il un mécanisme de diffusion ignifuge que je pourrais utiliser efficacement et en toute sécurité pour cela?

Répondre

1

Il existe certainement de nombreuses options pour cela, mais celle qui est très facile à mettre en œuvre et répond à vos critères est un appel Asynchronous Web Service. Cela ne nécessite pas de démarrer un thread de travail (le framework le fera en coulisse). Plutôt que d'utiliser l'une des options décrites dans ce lien pour extraire le résultat, il suffit d'ignorer le résultat, car cela n'a aucune signification pour l'application appelante.

+0

Merci ...c'est parfait, sauf qu'il nécessite un emplacement bien connu pour l'auditeur. Pour l'instant, je vais utiliser des mailslots, mais si ça ne marche pas, j'adopterai votre approche à la place. – Eric

0

je fait quelque chose similaire, mais pas exactement un « braodcast »

J'ai un dans l'outil maison plusieurs non-technophiles dans l'utilisation de l'entreprise. Je l'ai vérifier un partage réseau pour un EXE spécifique (le même EXE que vous téléchargez si vous voulez l'utiliser) et compare le numéro de version de ce fichier avec l'assembly d'exécution. Si celui sur le réseau est plus récent, alertez l'utilisateur pour télécharger le nouveau.

Beaucoup plus simple que d'essayer de configurer un programme de mise à jour automatique pour quelque chose qui ne sera utilisé que dans le même bâtiment que moi.

0

Si la mise à niveau est pas un problème (autrement dit, il n'y a pas de cas où l'utilisation de l'ancienne version est meilleure), vous pouvez faire ce que je faisais avec quelque chose de semblable:

L'application que les gens lancent effectivement est un programme de mise à jour, il vérifie la version du fichier et l'horodatage sur un partage réseau et, si une version plus récente existe, le copie dans le répertoire du programme. Il exécute ensuite le programme (s'il a été mis à jour ou non).

var current = new FileInfo(local); 
var latest = new FileInfo(remote); 

if (!current.Exists) 
    latest.CopyTo(local); 

var currentVersion = FileVersionInfo.GetVersionInfo(local); 
var latestVersion = FileVersionInfo.GetVersionInfo(remote); 

if (latest.CreationTime > current.CreationTime || latestVersion.FileVersion != currentVersion.FileVersion) 
    latest.CopyTo(local, true); 

Process.Start(local) 

J'ai aussi le programme vérifie automatiquement si la mise à jour a besoin de mise à jour (comme la mise à jour ne peut pas se mettre à jour en raison de verrous de fichier)

+0

Du point de vue de la facilité d'utilisation, cela n'est-il pas frustrant pour l'utilisateur lorsqu'il veut exécuter son application * maintenant *, mais il doit plutôt attendre que la dernière version soit copiée? Proposez-vous une option qui leur permet de reporter la mise à jour plus tard? – BenAlabaster

+0

Je n'ai pas (et un utilisateur ne s'est jamais plaint une fois); avec la mise en garde que cela se passe sur notre intranet local et tous les fichiers totaux sont inférieurs à 5 Mo (seuls les fichiers mis à jour sont effectivement transférés). De plus, mon programme s'exécute au démarrage, donc le temps est encore plus caché par tous les autres programmes que les gens ont au démarrage. – BarrettJ

+0

Cela ne vous donnerait-il pas un résultat similaire au déploiement Click Once? – Glenn

0

Après quelques essais, je suis d'obtenir de bons résultats à l'aide Win32 mailslots.

Il n'existe pas d'encapsuleur géré officiel, mais les fonctions sont simples à utiliser via PInvoke, comme illustré dans des exemples tels que this one. L'utilisation d'un "mailslot" de domaine fournit un véritable mécanisme de diffusion, permettant plusieurs écouteurs et aucune exigence pour un serveur connu.