Хороший механизм вещания для внутренних приложений .net, чтобы объявить их местоположение и версию? - PullRequest
1 голос
/ 30 ноября 2009

Я хотел бы предоставить большому количеству внутренних приложений .net легкий способ сообщить, что они используются. Моя цель - отслеживать, какие пользователи могут получить выгоду от регистрации в службу поддержки и / или напоминаний об обновлении.

Это во внутренней сети. Определенно существует IP-соединение между всеми машинами, и, вероятно, UDP. (Но, вероятно, не многоадресная.)

Возможна запись в известную внутреннюю папку или загрузка известного URL, но я бы хотел максимально минимизировать влияние на само приложение, даже за счет надежности. Поэтому я бы предпочел не рисковать тайм-аутом (например, если я получаю доступ к некоторому централизованному ресурсу, и он исчез), и в идеале я бы предпочел не запускать рабочий поток.

Было бы также неплохо разрешить использование нескольких слушателей, что является еще одной причиной, по которой я думаю о вещании, а не о вызове службы.

Есть ли какой-нибудь механизм вещания с огнем и забыванием, который я мог бы использовать для этого безопасно и эффективно?

Ответы [ 4 ]

1 голос
/ 30 ноября 2009

Конечно, есть много вариантов для этого, но очень простой в реализации и отвечающий вашим критериям - Асинхронная веб-служба вызов.

Для этого не требуется запускать рабочий поток (Framework сделает это за кулисами). Вместо того, чтобы использовать один из параметров, описанных в этой ссылке, для получения результата, просто проигнорируйте результат, поскольку он не имеет смысла для вызывающего приложения.

0 голосов
/ 03 декабря 2009

После некоторых экспериментов я получил хорошие результаты, используя Win32 mailslots .

Официальной управляемой оболочки нет, но функции просты в использовании через PInvoke, как показано в примерах типа this .

Использование почтового ящика "домен" обеспечивает истинный механизм широковещания, позволяющий использовать несколько прослушивателей и не требует наличия хорошо известного сервера.

0 голосов
/ 30 ноября 2009

Если обновление не является проблемой (т. Е. Нет случаев, когда использование старой версии лучше), вы можете сделать то же, что и я, с чем-то похожим:

Приложение, которое фактически запускают люди, является программой обновления, оно проверяет версию файла и метку времени на сетевом ресурсе и, если существует более новая версия, копирует его в каталог программы. Затем он запускает программу (была ли она обновлена ​​или нет).

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)

У меня также есть программа, которая проверяет, нужно ли обновлять программу обновления (так как программа обновления не может обновляться из-за блокировок файлов)

0 голосов
/ 30 ноября 2009

Я сделал что-то похожее, хотя не совсем "braodcast"

У меня есть собственный инструмент, который используют несколько не технических специалистов. Я проверил сетевой ресурс на наличие определенного EXE-файла (того же EXE-файла, который вы бы скачали, если бы захотел его использовать) и сравнил номер версии этого файла с исполняемой сборкой. Если в сети новее, предупредите пользователя о загрузке нового.

Намного проще, чем пытаться настроить автообновление для чего-то, что будет использоваться только в том же здании, что и я.

...