2016-11-01 6 views
1

Службы окна я закодирован не работает:Моего заказа Windows Service не работает с очередью сообщений Windows,

  • Предназначено funcionality: Служба должна получать сообщения из очереди окна сообщений (MSMQ) и писать сообщения на .txt-файлы.

  • Он работает, когда я запускаю его не-как-услуга (непосредственно от визуальной студии)

  • Когда я установил его в качестве службы я могу запустить его, но он ничего не делает, не создание/записей .txt файлов в любом месте

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

Разница между запуском его как сервис и запустить его из визуальной студии является следующая:

namespace ComponentAtrapador 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     static void Main() 
     { 
#if DEBUG 
      Service1 myService = new Service1(); 
      myService.startMethod(); 
      System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); 


#else 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new Service1() 
      }; 
      ServiceBase.Run(ServicesToRun); 
#endif 
     } 
    } 
} 

(так что, если я запустить его как DEBUG он будет работать без меня, чтобы установить его в качестве службы)

Вот код сервиса:

namespace ComponentAtrapador 
{ 
     public partial class Service1 : ServiceBase 
     { 
     private System.Timers.Timer _timer; 
     private System.ComponentModel.IContainer components1; 
     private System.Diagnostics.EventLog eventLog1; 

     public void startMethod() 
     { 
      OnStart(null); 
     } 
     public Service1() 
     { 
      InitializeComponent(); 
      eventLog1 = new System.Diagnostics.EventLog(); 
      if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
      { 
       System.Diagnostics.EventLog.CreateEventSource(
        "MySource", "MyNewLog"); 
      } 
      eventLog1.Source = "MySource"; 
      eventLog1.Log = "MyNewLog"; 
     } 

     protected override void OnStart(string[] args) 
     { 
      eventLog1.WriteEntry("In OnStart"); 
       _timer = new System.Timers.Timer(); 
       _timer.Interval = 5000; // 5 seconds 
       _timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer); 
       _timer.Start(); 
     } 

     protected override void OnStop() 
     { 
      _timer.Stop(); 
     } 

     public void OnTimer(object sender, System.Timers.ElapsedEventArgs args) 
     { 
      string nombreArchivo = "archivoMensaje"; 
        MessageQueue messageQueue = new MessageQueue(@".\Private$\SomeTestName"); 
        System.Messaging.Message[] messages = messageQueue.GetAllMessages(); 

        System.Messaging.Message m = new System.Messaging.Message(); 
        foreach (System.Messaging.Message message in messages) 
        { 
         message.Formatter = new XmlMessageFormatter(new String[] { "System.String,mscorlib" }); 
         string text = message.Body.ToString(); 
         System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + nombreArchivo + Properties.Settings.Default.SettingNumero + ".txt", text); 
         Properties.Settings.Default.SettingNumero++; 
         Properties.Settings.Default.Save(); 
         //Do something with the message. 
        } 
        // after all processing, delete all the messages 
        messageQueue.Purge(); 

      //} 

     } 
    } 
} 
+0

Отличный вопрос. Спасибо. – itsme86

+0

Когда вы запускаете службу окон и работаете с визуальной студией, здесь есть два отличия. 1) Программа будет запускаться как локальная системная учетная запись по умолчанию, а не вошедшей в систему учетной записи пользователя. 2) Рабочий каталог - это папка system32, а не exe. – Vince

+0

Проверьте, настроена ли ваша служба Windows с учетной записью, которая может обращаться к частной очереди @ ". \ Private $ \ SomeTestName – Vince

ответ

0

Оказывается, служба не имеет достаточно полномочий, установил его, установив serviceProcessInstaller из сервис на визуальной студии для пользователя, так что, когда я его установил, он попросил бы учетные данные. Просто нужно было ввести «./[username», когда он попросил мое имя пользователя работать.

Еще один способ его исправления - войти в диспетчер задач> службы> щелкните правой кнопкой мыши сервис> свойства> безопасность. И измените разрешения там.

0

Это то, что Logs настолько полезно, поместите пару eventLog1.WriteEntry() внутри вашего метода OnTimer, и вы увидите, где он не работает. Я бы проверил

  1. сколько сообщений я получаю.
  2. вложу один eventLog1.WriteEntry() внутри цикла, чтобы увидеть, что происходит с каждым сообщением и т.д. ...

 Смежные вопросы

  • Нет связанных вопросов^_^