Как я могу удаленно выполнить программу на нескольких клиентах из веб-приложения?

#c# #.net #asp.net #client-server #distributed

#c# #.net #asp.net #клиент-сервер #распределенный

Вопрос:

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

У меня есть asp.net веб-приложение, размещенное на IIS в штаб-квартире. Когда происходит определенное событие, мне нужно затем показать сообщение на динамически выбранном подмножестве КОМПЬЮТЕРОВ по всей компании. Сообщение должно быть показано из-за временных ограничений этого процесса (время реакции 4 часа), и мы по закону не можем позволить себе не показывать сообщение.

Итак, мне нужно сделать следующее:

  • Покажите сообщение пользователям. У меня есть приложение winforms, которое выводит диалоговое окно, от которого единственный способ избавиться — нажать большую кнопку «Подтвердить».
  • Чтобы убедиться, что сообщение было показано. Какой-то ответный отчет о том, что да, это было показано и впоследствии подтверждено.
  • Способ реагировать, если форма не отображается.

Я рассмотрел следующее:

  • PsExec — Асинхронный перебор каждого узла в моем веб-приложении для запуска удаленного исполняемого файла, находящегося на каждом компьютере.
  • .NET Remoting — я вообще не знаком с этим, и это привело меня вместо этого взглянуть на WCF. Сработает ли это для того, что я пытаюсь сделать?
  • Обратные вызовы WCF — похоже, для них требуется постоянное соединение, и я не уверен, что это означает для нашей инфраструктуры. Я представил себе клиентскую службу, которая запускала бы приложение или каким-то образом отображала форму.
  • Наше программное обеспечение для планирования (Tidal Enterprise Scheduler) — удаленное выполнение исполняемого файла. Это привело бы к большему количеству точек отказа.

По мнению SO, какой был бы лучший способ решить эту проблему? Заранее спасибо за вашу помощь.

Комментарии:

1. Вы говорите «когда происходит определенное событие» — это событие, инициированное пользователем, или событие системы / таймера? Последнее будет очень трудно сделать надежно, используя веб-систему.

Ответ №1:

Один из способов сделать это:

  1. Имейте клиентское приложение, установленное на каждом из рабочих столов
  2. Попросите это приложение либо (по временному событию) вызвать веб-службу для получения любого сообщения, которое ему необходимо отобразить, либо напрямую связаться с сервером базы данных, чтобы получить сообщение, которое ему необходимо отобразить.
  3. После отображения сообщения попросите приложение сообщить веб-службе или sql server, что оно было просмотрено. Запишите дату, время и вошедшего в систему пользователя.

Ваше веб-приложение должно просто сохранять сообщение в базе данных; и, если вы хотите немного надежности, предоставьте веб-службу, которую вызывает настольное приложение для извлечения сообщений и пометки их как просмотренные. Это избавило бы настольные приложения от необходимости напрямую взаимодействовать с sql server и означало бы, что настольное приложение можно установить в любой точке мира.

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

Я бы не стал использовать ни один из методов, которые вы определили, поскольку они сложны и вносят слишком много хрупкости.

ОБНОВИТЕ несколько способов блокировки приложения, которые сразу приходят мне в голову:

  1. Есть служба сторожевого пса, которая запускается от имени администратора и отслеживает настольное приложение. Если она когда-либо будет отключена, принудительно перезапустите ее. Вы можете выполнять мониторинг через WMI. Некоторые AV-программы делают это. Обязательно лишите пользователей прав на остановку служб.
  2. Лишите пользователей возможности использовать диспетчер задач или получать к нему доступ. Это делают многие варианты вирусов, и это легко сделать из настроек групповой политики.
  3. Если они находятся в домене, убедитесь, что настройки групповой политики принудительно устанавливают ваше настольное приложение И заставляют его автоматически запускаться при запуске Windows.

Если вы действительно хотите, чтобы это было эффективно, сделайте следующее: убедитесь, что ваше приложение раз в час уведомляет домашний сервер о том, что оно запущено. Попросите генерального директора отправить сообщение о том, что, если приложение когда-либо будет отключено, соответствующий сотрудник будет уволен. Они могли бы сформулировать это немного лучше. Регулярно запускайте отчеты аудита и увольняйте пару человек, чтобы до смерти напугать всех остальных. Я гарантирую, что после этого никто не будет с ней возиться.

Убедитесь, что отчеты аудита подтверждены менеджерами… В конце концов, сотрудника может не быть в тот день. 😉

Комментарии:

1. Обсуждение с коллегами здесь шло в том же духе. Не могли бы вы подробнее рассказать о множестве способов блокировки приложения? Я имею в виду службу Windows, но ваш вывод говорит мне, что есть способы получше ..?

2. @IronicMuffin: Смотрите обновления. Одна компания, с которой я работал, использовала последний вариант. На первой неделе несколько человек выяснили, как ее отключить, и несколько человек были публично уволены. Впоследствии никто с этим не возился. Если это так юридически важно, как вы предполагаете, то вы должны иметь возможность отключить эту опцию на уровне exec.

3. @IronicMuffin: Кстати, я считаю, что Vista и выше не позволяют службам иметь компонент пользовательского интерфейса; отсюда необходимость в обычном настольном приложении.

Ответ №2:

Вы могли бы попросить приложение HQ установить некоторые записи в таблице, которая знает, каким клиентам нужно показывать сообщение

 Message [ComputerName, IsAcknowledged]
  

Затем каждый клиент будет просматривать эту таблицу при необходимости, чтобы увидеть, существует ли его ComputerName и подтверждено ли оно == false. Если это произойдет, покажите запрос на подтверждение, обновите их запись

Комментарии:

1. Я полагаю, что это тот маршрут, по которому я пойду, но ответ Криса выше более подробный и применим ко всей системе. Спасибо!

Ответ №3:

Изучите шаблоны проектирования публикации и подписки. Это может быть правильным решением для вас. По сути, это запуск службы, для которой все ваши приложения Windows будут регистрировать обратный вызов, и из вашего веб-приложения вы можете вызвать событие в службе, которое опубликует его для всех зарегистрированных приложений. У издателя будет логика для идентификации подмножества вашего компьютера на основе события и источника.

Комментарии:

1. Мне понравилось, к чему это привело, но недостатки показали отсутствие гарантированной доставки и трудности при условии наличия подписчика. Я не думаю, что это сработает с моими текущими потребностями.

2. Шаблоны проектирования — это универсальные решения, вы всегда можете преодолеть эти недостатки с помощью множества надежных опций в .NET. Служба Windows на вашем веб-сервере является жизнеспособным вариантом для обеспечения постоянной работы службы, пока доступно ваше веб-приложение, которое запускает событие…