Как передать параметр службе Windows с клиентской машины

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

Я создал статическую строковую переменную в своем библиотечном классе. Всякий раз, когда возникает ошибка, я вызываю функцию, например

ATELib.AteBAC.getErrorMessage = "error message from client";
ServiceController Controller = new ServiceController("ATELogsService");
if (Controller.Status == ServiceControllerStatus.Running)
{
    Controller.ExecuteCommand(128);
}

и код в моем сервисе

protected override void OnCustomCommand(int command)
{
    if (command == 128)
    {
        using (System.IO.StreamWriter file = new System.IO.StreamWriter(Application.StartupPath + @"\ATELogCheck.txt", true))
        {
            file.WriteLine(ATELib.AteBAC.getErrorMessage);
            ATELib.AteBAC.getErrorMessage = null;
        }
    }
}

он создает файл журнала ошибок (ATELogCheck.txt), но сообщение об ошибке (строковое значение) отсутствует в файле, создавая пустой текстовый файл. Это статическая переменная, хотя она и пишется пустой. Я использую протокол tcp и вызываю объект службы как

baCls = (ATELib.AteBAC)Activator.GetObject(typeof(ATELib.AteBAC), "tcp://localhost:9090/ATE");

Как я могу передать строковое значение сервису?


person Learner    schedule 05.12.2013    source источник
comment
Создание статической переменной в библиотеке не делает автоматически эту переменную (и ее значение) доступной для различных процессов, которые ссылаются на эту библиотеку. Переменная ATELib.AteBAC.getErrorMessage между вашим сервисом и клиентом не совпадает. Вам нужна какая-то форма IPC для отправки этой строки.   -  person Tung    schedule 05.12.2013
comment
Я немного усложню вам задачу. Мы использовали прослушиватель ETW в службе Windows, после чего клиент может генерировать настраиваемые события ETW и отправлять их в службу Windows. msdn.microsoft.com/en-us/library /ms751538(v=vs.110).aspx   -  person divyanshm    schedule 05.12.2013


Ответы (1)


Потому что ваша служба работает в другом домене из вашего приложения. Таким образом, ATELib.AteBAC.getErrorMessage в вашем приложении отличается от ATELib.AteBAC.getErrorMessage в вашем сервисе.

Я искренне думаю, что если вам нужно сделать что-то подобное, у вас проблемы с дизайном вашего приложения. Сервис действительно существует для того, чтобы постоянно что-то делать. Или он может «заснуть» и слушать порт TCP. После получения сигнала он может найти работу и выполнить ее. Определенно, сначала изучите дизайн, прежде чем углубляться в ненужные сложности.

person T.S.    schedule 05.12.2013
comment
Это здорово, почему он ломается, но не как передать значение, которое запрашивает ОП. - person crthompson; 05.12.2013
comment
Есть ли способ передать сообщение службе Windows ?? - person Learner; 05.12.2013
comment
WCF с использованием привязки именованных каналов. Удаленное взаимодействие. Вам нужно общаться между двумя разными живыми процессами. И .Net имеет для этого средства. Но, честно говоря, я не понимаю, зачем вам это нужно для ведения журнала. Приложение должно иметь возможность регистрировать вещи самостоятельно. И в лучшем случае у вас может быть очередь, созданная приложением и прочитанная службой. - person T.S.; 05.12.2013
comment
служба будет продолжать прослушивать порт и поддерживать объект в одноэлементном шаблоне. Я хочу передать сообщение об ошибке. и я не знаю о WCF - person Learner; 05.12.2013
comment
Служба будет прослушивать порт, если вы используете сокеты для его прослушивания. Сервис по определению является длительным процессом. Независимо от того, какой объект вы используете, синглтон или нет. Обычно люди ставят таймеры и заставляют сервис искать работу, как только происходит тик. Но я говорю, что, например, в вашем случае вы можете использовать этот OnCustomCommand(int command) для получения команды сделать что-то. Ваша служба должна знать, как найти работу и выполнить единицу работы в отдельном потоке. В противном случае он может собрать слишком много работы. Ваш вопрос был не о том, что такое WCF. Вы получили ответ, почему ваши вещи не работают :о) - person T.S.; 05.12.2013