#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:
Один из способов сделать это:
- Имейте клиентское приложение, установленное на каждом из рабочих столов
- Попросите это приложение либо (по временному событию) вызвать веб-службу для получения любого сообщения, которое ему необходимо отобразить, либо напрямую связаться с сервером базы данных, чтобы получить сообщение, которое ему необходимо отобразить.
- После отображения сообщения попросите приложение сообщить веб-службе или sql server, что оно было просмотрено. Запишите дату, время и вошедшего в систему пользователя.
Ваше веб-приложение должно просто сохранять сообщение в базе данных; и, если вы хотите немного надежности, предоставьте веб-службу, которую вызывает настольное приложение для извлечения сообщений и пометки их как просмотренные. Это избавило бы настольные приложения от необходимости напрямую взаимодействовать с sql server и означало бы, что настольное приложение можно установить в любой точке мира.
Настольное приложение должно быть установлено таким образом, чтобы его нельзя было отключить / выключить / удалить. Существует множество способов сделать это.
Я бы не стал использовать ни один из методов, которые вы определили, поскольку они сложны и вносят слишком много хрупкости.
ОБНОВИТЕ несколько способов блокировки приложения, которые сразу приходят мне в голову:
- Есть служба сторожевого пса, которая запускается от имени администратора и отслеживает настольное приложение. Если она когда-либо будет отключена, принудительно перезапустите ее. Вы можете выполнять мониторинг через WMI. Некоторые AV-программы делают это. Обязательно лишите пользователей прав на остановку служб.
- Лишите пользователей возможности использовать диспетчер задач или получать к нему доступ. Это делают многие варианты вирусов, и это легко сделать из настроек групповой политики.
- Если они находятся в домене, убедитесь, что настройки групповой политики принудительно устанавливают ваше настольное приложение И заставляют его автоматически запускаться при запуске Windows.
Если вы действительно хотите, чтобы это было эффективно, сделайте следующее: убедитесь, что ваше приложение раз в час уведомляет домашний сервер о том, что оно запущено. Попросите генерального директора отправить сообщение о том, что, если приложение когда-либо будет отключено, соответствующий сотрудник будет уволен. Они могли бы сформулировать это немного лучше. Регулярно запускайте отчеты аудита и увольняйте пару человек, чтобы до смерти напугать всех остальных. Я гарантирую, что после этого никто не будет с ней возиться.
Убедитесь, что отчеты аудита подтверждены менеджерами… В конце концов, сотрудника может не быть в тот день. 😉
Комментарии:
1. Обсуждение с коллегами здесь шло в том же духе. Не могли бы вы подробнее рассказать о множестве способов блокировки приложения? Я имею в виду службу Windows, но ваш вывод говорит мне, что есть способы получше ..?
2. @IronicMuffin: Смотрите обновления. Одна компания, с которой я работал, использовала последний вариант. На первой неделе несколько человек выяснили, как ее отключить, и несколько человек были публично уволены. Впоследствии никто с этим не возился. Если это так юридически важно, как вы предполагаете, то вы должны иметь возможность отключить эту опцию на уровне exec.
3. @IronicMuffin: Кстати, я считаю, что Vista и выше не позволяют службам иметь компонент пользовательского интерфейса; отсюда необходимость в обычном настольном приложении.
Ответ №2:
Вы могли бы попросить приложение HQ установить некоторые записи в таблице, которая знает, каким клиентам нужно показывать сообщение
Message [ComputerName, IsAcknowledged]
Затем каждый клиент будет просматривать эту таблицу при необходимости, чтобы увидеть, существует ли его ComputerName и подтверждено ли оно == false. Если это произойдет, покажите запрос на подтверждение, обновите их запись
Комментарии:
1. Я полагаю, что это тот маршрут, по которому я пойду, но ответ Криса выше более подробный и применим ко всей системе. Спасибо!
Ответ №3:
Изучите шаблоны проектирования публикации и подписки. Это может быть правильным решением для вас. По сути, это запуск службы, для которой все ваши приложения Windows будут регистрировать обратный вызов, и из вашего веб-приложения вы можете вызвать событие в службе, которое опубликует его для всех зарегистрированных приложений. У издателя будет логика для идентификации подмножества вашего компьютера на основе события и источника.
Комментарии:
1. Мне понравилось, к чему это привело, но недостатки показали отсутствие гарантированной доставки и трудности при условии наличия подписчика. Я не думаю, что это сработает с моими текущими потребностями.
2. Шаблоны проектирования — это универсальные решения, вы всегда можете преодолеть эти недостатки с помощью множества надежных опций в .NET. Служба Windows на вашем веб-сервере является жизнеспособным вариантом для обеспечения постоянной работы службы, пока доступно ваше веб-приложение, которое запускает событие…