Re: Параметры Windows сервиса
От: nikov США http://www.linkedin.com/in/nikov
Дата: 04.07.07 12:12
Оценка: +1
Здравствуйте, SMV77, Вы писали:

SMV>
SMV>                try
SMV>                {
SMV>                    _period = double.Parse(args[0]);
SMV>                    _path2listener = args[1];
SMV>                }
SMV>                catch (Exception Err)
SMV>                {
SMV>                    throw new Exception("Параметр 'Период запроса' задан некорректным значением");
SMV>                }
SMV>


Этот участок кода вызывает много замечаний:
1) Если есть метод, не бросающий исключения (например, TryParse), то нужно использовать его.
2) Не нужно перехватывать исключение общего типа, если Вам известно какие именно исключения производных типов могут появиться.
3) Не нужно выбрасывать исключения общего типа (наподобие Exception или AppicationException), вместо этого следует выбросить подходящее исключение специального (производного) типа, а если его нет, то написать его.
4) При перехвате исключения, если Вы решаете бросить другое исключение, исходное нужно передать ему в конструктор, чтобы оно было доступно через свойство InnerException.
5) Локальные переменные рекомендуется писать в camel-стиле (то есть, с маленькой буквы).
6) Не нужно заводить неиспользуемые локальные переменные (Err).
7) Нужно проводить более тщательную валидацию входных параметров (в частности, период нужно проверить на положительность).
Параметры Windows сервиса
От: SMV77 Россия  
Дата: 04.07.07 11:38
Оценка:
Условие
Для нормального запуска сервиса необходимы параметры...

Если параметры отсутствуют или они некорректны сервис не должен запускаться вообще...

Сейчас разбор входящих параметров делаю в методе OnStart().
Но это решение мне не нравиться...

protected override void OnStart(string[] args)
{
            double _period = 0;
            string _path2listener = "";

            EventLog _event_log = new EventLog();

            try
            {
                #region разбираем параметры запуска сервиса
                if (args.Length == 0)
                {
                    throw new Exception("Не заданы параметры для запуска сервиса");
                }

                if (args.Length != 2)
                {
                    throw new Exception("Неверное число параметров для запуска сервиса");
                }

                try
                {
                    _period = double.Parse(args[0]);
                    _path2listener = args[1];
                }
                catch (Exception Err)
                {
                    throw new Exception("Параметр 'Период запроса' задан некорректным значением");
                }
                #endregion

                
                this._server = new UserWebRequestServer(_period, _path2listener);
                this._server._Start();
            }
            catch (Exception Err)
            {
                _event_log.Log = "Application";
                _event_log.Source = this.ServiceName;
                _event_log.WriteEntry(Err.Message, EventLogEntryType.Error);

                throw new Exception();
            }
            finally
            {
                _event_log.Close();
            }
}


Вопрос
Как ещё можно решить эту проблему?
Re: Параметры Windows сервиса
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 04.07.07 11:50
Оценка:
Здравствуйте, SMV77, Вы писали:

SMV>Сейчас разбор входящих параметров делаю в методе OnStart().

SMV>Но это решение мне не нравиться...

А чем не нравится-то?

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re: Параметры Windows сервиса
От: eddy_cs Россия  
Дата: 04.07.07 11:57
Оценка:
Здравствуйте, SMV77, Вы писали:

SMV>Условие

SMV>Для нормального запуска сервиса необходимы параметры...

SMV>Если параметры отсутствуют или они некорректны сервис не должен запускаться вообще...


SMV>Сейчас разбор входящих параметров делаю в методе OnStart().

SMV>Но это решение мне не нравиться...

SMV>Как ещё можно решить эту проблему?



А если в функции Main, вот так:


static int Main(string[] args)
{
}


Вызывается раньше чем OnStart()
Re: Параметры Windows сервиса
От: eddy_cs Россия  
Дата: 04.07.07 11:59
Оценка:
Здравствуйте, SMV77, Вы писали:

SMV>Условие

SMV>Для нормального запуска сервиса необходимы параметры...

SMV>Если параметры отсутствуют или они некорректны сервис не должен запускаться вообще...


SMV>Сейчас разбор входящих параметров делаю в методе OnStart().

SMV>Но это решение мне не нравиться...


Сорри, дополняю...
        static int Main(string[] args)
        {

                #region разбираем параметры запуска сервиса
                if (args.Length == 0)
                {
                    throw new Exception("Не заданы параметры для запуска сервиса");
                }

                if (args.Length != 2)
                {
                    throw new Exception("Неверное число параметров для запуска сервиса");
                }

                try
                {
                    _period = double.Parse(args[0]);
                    _path2listener = args[1];
                }
                catch (Exception Err)
                {
                    throw new Exception("Параметр 'Период запроса' задан некорректным значением");
                }
                #endregion

}
Re[2]: Параметры Windows сервиса
От: SMV77 Россия  
Дата: 04.07.07 12:02
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>Здравствуйте, SMV77, Вы писали:


SMV>>Сейчас разбор входящих параметров делаю в методе OnStart().

SMV>>Но это решение мне не нравиться...

KV>А чем не нравится-то?


не нравиться тем что генериться исключение которое ни где потом в моём коде не отлавливается...
Re[2]: Параметры Windows сервиса
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 04.07.07 12:14
Оценка:
Здравствуйте, eddy_cs, Вы писали:

_>
_>static int Main(string[] args)
_>{
_>}
_>


_>Вызывается раньше чем OnStart()


Из MSDN:

Process initialization arguments for the service in the OnStart method, not in the Main method

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re: Параметры Windows сервиса
От: maloi_alex СССР  
Дата: 04.07.07 12:14
Оценка:
Здравствуйте, SMV77, Вы писали:

Можно так:

partial class MQService : ServiceBase
{

    static void Main(string[] args)
    {
        if (!ParseArgs())
            return;

        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new MQService() };
        ServiceBase.Run(ServicesToRun);
    }

    protected override void OnStart(string[] args) { }
    protected override void OnStop() { }

}
Re[3]: Параметры Windows сервиса
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 04.07.07 12:20
Оценка:
Здравствуйте, SMV77, Вы писали:

SMV>Здравствуйте, kochetkov.vladimir, Вы писали:


KV>>Здравствуйте, SMV77, Вы писали:


SMV>>>Сейчас разбор входящих параметров делаю в методе OnStart().

SMV>>>Но это решение мне не нравиться...

KV>>А чем не нравится-то?


SMV>не нравиться тем что генериться исключение которое ни где потом в моём коде не отлавливается...


Я может туплю к концу дня — но зачем дальше отлавливать это исключение?

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re: Параметры Windows сервиса
От: _Morpheus_  
Дата: 04.07.07 12:50
Оценка:
Здравствуйте, SMV77, Вы писали:

SMV>Условие

SMV>Для нормального запуска сервиса необходимы параметры...

SMV>Если параметры отсутствуют или они некорректны сервис не должен запускаться вообще...


SMV>Сейчас разбор входящих параметров делаю в методе OnStart().

SMV>Но это решение мне не нравиться...



SMV>
SMV>protected override void OnStart(string[] args)
SMV>{
SMV>


SMV>Вопрос

SMV>Как ещё можно решить эту проблему?


ты не те параметры анализируешь, в onstart передаются параметры которые были указаны вручную из окошка свойств сервиса, там есть поле воода "Start parameters:", вот то что там будет введено и передается в OnStart при ручном запуске сервиса.

Чтобы анализировать параметры переданные в командной строке нужно анализировать аргументы метода Main

При этом прийдется написать свой инсталлер для сервиса, т.к. стандартный инсталлер не поддерживает параметры для запуска сервиса. Все что нужно — добавить к строке с исполняемым файлом строчку с параметрами...
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[2]: Параметры Windows сервиса
От: eddy_cs Россия  
Дата: 04.07.07 13:01
Оценка:
Здравствуйте, _Morpheus_, Вы писали:


_M_>ты не те параметры анализируешь, в onstart передаются параметры которые были указаны вручную из окошка свойств сервиса, там есть поле воода "Start parameters:", вот то что там будет введено и передается в OnStart при ручном запуске сервиса.


_M_>Чтобы анализировать параметры переданные в командной строке нужно анализировать аргументы метода Main


_M_>При этом прийдется написать свой инсталлер для сервиса, т.к. стандартный инсталлер не поддерживает параметры для запуска сервиса. Все что нужно — добавить к строке с исполняемым файлом строчку с параметрами...


Еще неизвестно какие параметры нужны автору темы...
Re[2]: Параметры Windows сервиса
От: SMV77 Россия  
Дата: 04.07.07 13:51
Оценка:
Здравствуйте, nikov, Вы писали:

N>Этот участок кода вызывает много замечаний:

N>1) Если есть метод, не бросающий исключения (например, TryParse), то нужно использовать его.
N>2) Не нужно перехватывать исключение общего типа, если Вам известно какие именно исключения производных типов могут появиться.
N>3) Не нужно выбрасывать исключения общего типа (наподобие Exception или AppicationException), вместо этого следует выбросить подходящее исключение специального (производного) типа, а если его нет, то написать его.
N>4) При перехвате исключения, если Вы решаете бросить другое исключение, исходное нужно передать ему в конструктор, чтобы оно было доступно через свойство InnerException.
N>5) Локальные переменные рекомендуется писать в camel-стиле (то есть, с маленькой буквы).
N>6) Не нужно заводить неиспользуемые локальные переменные (Err).
N>7) Нужно проводить более тщательную валидацию входных параметров (в частности, период нужно проверить на положительность).

Спасибо за замечания по коду...
Re[3]: Параметры Windows сервиса
От: Jericho113 Украина  
Дата: 05.07.07 06:34
Оценка:
Здравствуйте, SMV77, Вы писали:


KV>>А чем не нравится-то?


SMV>не нравиться тем что генериться исключение которое ни где потом в моём коде не отлавливается...


1) Сделай наследника от Exception который бы определял вид исключения при отсутстствии параметров
типа
class MissingStartupParametersException:Exception
{
  private _MissedParam;
  public MissingStartupParametersException(string Message):base(Message)
  public MissingStartupParametersException(string MissdeParam, string Message):base(Message)
  public MissingStartupParametersException(string MissdeParam, string Message,Exception InnerException):base(Message,InnerException)
  public string MissedParam
  {
   get{return _MissedParam;}
  }
}

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

ps: у себя в проекте использую log4net.
NetDigitally yours ....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.