сделал Win Service которые периодически обращается к веб сервису, ставлю на XP под акаутном Network service все работает ОК,
ставлю так же под Win7 — без ошибок и предупреждений о чем то, но веб сервис не показывает что было обращение
Здравствуйте, Alex Dav, Вы писали:
AD>сделал Win Service которые периодически обращается к веб сервису, ставлю на XP под акаутном Network service все работает ОК, AD>ставлю так же под Win7 — без ошибок и предупреждений о чем то, но веб сервис не показывает что было обращение
AD>Подскажит что можно покапать.
А в сервисе никакой диагностики не предусмотрено? В случае ошибки как ведёт себя сервис — проглатывает и работает дальше или хотя бы логирует? Что тогда в логах?
Help will always be given at Hogwarts to those who ask for it.
_FR>А в сервисе никакой диагностики не предусмотрено? В случае ошибки как ведёт себя сервис — проглатывает и работает дальше или хотя бы логирует? Что тогда в логах?
вот код:
public partial class Service1 : ServiceBase
{
private Timer t = null;
public Service1()
{
t = new Timer(10000);
t.Elapsed += new ElapsedEventHandler(LetIP);
}
void LetIP(object sender, ElapsedEventArgs e)
{
LetThemIP.com.wincutter.www.GetIPService ser = new LetThemIP.com.wincutter.www.GetIPService();
string res = "FALSE";
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
string IP = "XXXX";
foreach (IPAddress add in localIPs)
{
IP = add.ToString();
res = ser.PutIP((object)IP);
}
if(res == "OK")
OnStop();
}
protected override void OnStart(string[] args)
{
t.Start();
}
protected override void OnStop()
{
t.Stop();
}
}
Здравствуйте, Alex Dav, Вы писали:
AD>ставлю так же под Win7 — без ошибок и предупреждений о чем то, но веб сервис не показывает что было обращение
А как ты узнал, что без ошибок, если у тебя нет логирования? Твой сервис запустился. При запуске создал поток. В этом потоке попытался обратиться к веб-сервису и рухнул. Сервис остановился.
Нужно добавить try-catch и логировние ошибки.
Здравствуйте, Alex Dav, Вы писали:
_FR>>А в сервисе никакой диагностики не предусмотрено? В случае ошибки как ведёт себя сервис — проглатывает и работает дальше или хотя бы логирует? Что тогда в логах? AD>вот код: AD>что тут логирывать я незнаю
и узнаём, что System.Timers.Timer реальные пацаны не используют. Выкидываем и прикручиваем System.Threading.Timer.
AD> void LetIP(object sender, ElapsedEventArgs e)
AD> {
// Заворачиваем в try\catch (*)
AD> LetThemIP.com.wincutter.www.GetIPService ser = new LetThemIP.com.wincutter.www.GetIPService();
AD> string res = "FALSE";
AD> IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
// Трэйсим результат
AD> string IP = "XXXX";
AD> foreach (IPAddress add in localIPs)
AD> {
AD> IP = add.ToString();
AD> res = ser.PutIP((object)IP);
// Трэйсим аргумент и результат
AD> }
AD> if(res == "OK")
AD> OnStop();
// !Останавливтаь сервис следует другим,
// открытым, методом ServiceBase::Stop().
AD> }
AD> protected override void OnStart(string[] args)
AD> {
AD> t.Start();
// Трэйсим результат, если есть
AD> }
AD> protected override void OnStop()
AD> {
AD> t.Stop();
// Трэйсим результат, если есть
AD> }
AD> }
(*) Оборачивать нужно всё, ибо следует внимательно читать документацию к используемым классам и их членам:
The Timer component catches and suppresses all exceptions thrown by event handlers for the Elapsed event. This behavior is subject to change in future releases of the .NET Framework.
А то получилось, что вы сами написали нечто, про что никак не узнать — отчего же оно не работает и работает ли вообще
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Spiceman, Вы писали:
S>А как ты узнал, что без ошибок, если у тебя нет логирования? Твой сервис запустился. При запуске создал поток. В этом потоке попытался обратиться к веб-сервису и рухнул. Сервис остановился. S>Нужно добавить try-catch и логировние ошибки.
Если бы он остановился — я бы вопросов не задавал — он работает.
Здравствуйте, Alex Dav, Вы писали:
AD>Если бы он остановился — я бы вопросов не задавал — он работает.
Да, тут уже FRED написал, что Timer глотает исключения. Вот и не падает. Я как-то упустил этот момент, так как обычно таймеры для таких целей не использую.