Хороший механизм широковещательной передачи для внутренних приложений .net для объявления их местоположения и версии?
-
10-07-2019 - |
Вопрос
Я хотел бы предоставить большому количеству внутренних .net-приложений простой способ объявить, что они используются.Моя цель - отслеживать, какие пользователи могли бы воспользоваться проверками в службе поддержки и / или напоминаниями об обновлении.
Это в собственной сети.Определенно, между всеми машинами есть подключение по IP и, вероятно, UDP.(Но, вероятно, не многоадресная рассылка.)
Запись на известный внутренний ресурс или загрузка известного URL-адреса были бы возможны, но я хотел бы максимально свести к минимуму влияние на само приложение, даже в ущерб надежности.Поэтому я бы предпочел не рисковать таймаутом (например, если я обращаюсь к какому-то централизованному ресурсу, а он исчез), и в идеале я бы также предпочел не запускать рабочий поток.
Также было бы неплохо разрешить нескольким слушателям, что является еще одной причиной, по которой я подумываю о трансляции, а не о вызове службы.
Есть ли какой-нибудь механизм трансляции "включи и забудь", который я мог бы безопасно и эффективно использовать для этого?
Решение
Для этого, безусловно, есть много вариантов, но один из которых очень прост в реализации и соответствует вашим критериям: вызов асинхронной веб-службы .
Для этого не требуется запускать рабочий поток (Framework сделает это за кулисами). Вместо того, чтобы использовать один из параметров, описанных в этой ссылке, для получения результата, просто проигнорируйте результат, поскольку он не имеет смысла для вызывающего приложения.
Другие советы
Я сделал что-то похожее, но не совсем "braodcast"
У меня есть собственный инструмент, который используют несколько не технарей в компании. Я проверил сетевой ресурс на наличие определенного EXE-файла (того же EXE-файла, который вы бы скачали, если бы захотел его использовать) и сравнил номер версии этого файла с исполняемой сборкой. Если в сети новее, предупредите пользователя о загрузке нового.
Намного проще, чем пытаться настроить автообновление для чего-то, что будет использоваться только в том же здании, что и я.
Если обновление не является проблемой (т.е.нет случаев, когда использование старой версии было бы лучше), вы можете сделать то, что я сделал с чем-то подобным:
Приложение, которое люди фактически запускают, является программой обновления, оно проверяет версию файла и временную метку в общей сетевой папке и, если существует более новая версия, копирует ее в каталог программы.Затем он запускает программу (независимо от того, была она обновлена или нет).
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)
Я также попросил саму программу проверить, нуждается ли программа обновления в обновлении (поскольку программа обновления не может обновиться сама из-за блокировки файлов)
После некоторых экспериментов я получил хорошие результаты, используя Win32 этот .
Использование почтового ящика "домен" обеспечивает истинный механизм широковещания, позволяющий использовать несколько прослушивателей и не требует наличия хорошо известного сервера.