C# запущенное приложение Windows Form от сервиса (и в Vista)

Для этого вы должны отслеживать клиентов A и B, а затем отправлять данные только определенному клиенту. Ниже приведен пример кода.

var clientA;
var clientB;
io.on('connection', function(client) {
    console.log('Client connected...');

    client.on('join', function(data) {
        if (something){
          clientA = client;
        }
        else {
          clientB = client;
        }
        console.log(data);
    });
    client.on('send',function(data){
        var datafinal = [];

        setInterval(function () {
        var usertype = data.type;
        var types = usertype.split(',');
            for (var i = 0; i < types.length; i++){
                datafinal.push(apifinaldata.filter((inbound) => inbound.usertype == types[i] && inbound.active == 1 ));
                }
                var final = datafinal.reduce(function(a, b) {
                    return a.concat(b);
                }, []);

                datafinal = [];

            if(someCondition){
              clientA.emit('finaldata', final);
              clientA.emit('callwaiting', callsdatafinal);
            }
            else {
              clientB.emit('finaldata', final);
              clientB.emit('callwaiting', callsdatafinal);
            }
        }, 1000);
    })
});

Здесь clientA и clientB - это два подключенных клиента. Вы можете отправлять данные любому клиенту на основе условий или логики программы.

7
задан Kara 7 February 2017 в 17:11
поделиться

8 ответов

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

Вы не должны действительно полагаться на контроль приложения форм, что, если никто не зарегистрирован? Что, если несколько человек зарегистрированы? Это просто получает грязные вещи выполнения этот путь.

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

12
ответ дан 6 December 2019 в 09:23
поделиться

Посмотрите вопрос: Как служба Windows может выполнить приложение GUI?. Это рассматривает тот же вопрос от C/C++ (короткий ответ: CreateProcessAsUser), но ответ, все еще действительный (с некоторым P/Invoke) для C#.

3
ответ дан 6 December 2019 в 09:23
поделиться

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

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

Вы могли бы хотеть пересмотреть этот подход.

2
ответ дан 6 December 2019 в 09:23
поделиться

Во-первых, быстрый ответ: опция 'Allow service to interact with desktop' (сервис-> Свойства-> LogOn) или определение учетной записи позволяет то, что Вы желаете? Если так, оба из них могут быть настроены на Вашем сервисном классе установщика.

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

1
ответ дан 6 December 2019 в 09:23
поделиться

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

0
ответ дан 6 December 2019 в 09:23
поделиться

Это - жесткая ситуация. Как упомянуто в паре мест, если у Вас должен быть UI затем технически, Вы не должны использовать сервис. Afterall, службы, выполненные без пользователя даже, вошли в систему. Если никто не зарегистрирован, у Вас не может быть UI.

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

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

1
ответ дан 6 December 2019 в 09:23
поделиться

В Windows 2000 и XP, существует опция (флажок) на вкладке Logon окна свойств службы, чтобы позволить сервису взаимодействовать с рабочим столом. Я полагаю, что это - то, что Вы ищете. Я просто записал быстрый сервис в VB.NET с Процессом. Запустите ("calc.exe") и Windows Calculator, открытый очень хорошо.

Я не на 100% уверен, что это работает тот же путь в Vista все же.

0
ответ дан 6 December 2019 в 09:23
поделиться

Чтобы ваша служба запускала приложение от имени пользователя ( что похоже на то, что вы пытаетесь сделать) вам необходимо сделать следующее:

System.Security.SecureString ss = new System.Security.SecureString();

foreach (char c in password)
  ss.AppendChar(c);

System.Diagnostics.Process proc = Process.Start(path, arguments, username, ss, domain);

Где:

  • путь = полный путь (включая имя файла) исполняемого файла.
  • arguments = строка аргументов (используйте пустую строку - none)
  • username = Имя учетной записи пользователя на вашем сервере / компьютере
  • domain = ваш сетевой домен (если вы используете сетевую учетную запись - пусто, если none)

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

serviceProcessInstaller.Account = ServiceAccount.User;

serviceProcessInstaller.Username = "yourdomain\\yourAccountName"; //Or just "AccountName" for local accounts..            

serviceProcessInstaller.Password = "yourPassword";
1
ответ дан 6 December 2019 в 09:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: