我的自定义 Windows 服务无法与 Windows Message Queue 一起使用

My custom Windows Service not working with Windows Message Queue

我编码的 windows 服务不工作:

(我知道它没有在其他地方写文件,因为当我 运行 来自 VS 的程序时,消息仍在队列中,所以它们没有被服务取出)

运行将其作为服务与运行将其作为服务visual studio的区别在于:

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();

            //}

        }
    }
}

这就是日志如此有用的地方,将几个 eventLog1.WriteEntry() 放在您的 OnTimer 方法中,您将看到它在哪里失败。 我会检查

  1. 我收到了多少条消息。
  2. 我将在循环中放置一个 eventLog1.WriteEntry() 以查看每条消息发生了什么...

原来该服务没有足够的权限,通过将 visual studio 上服务的 serviceProcessInstaller 设置为用户来修复它,这样当我安装它时它会要求提供凭据。当它要求输入我的用户名时,只需输入“./[用户名]”即可。

另一种修复方法是进入任务管理器 > 服务 > 右键单击​​服务 > 属性 > 安全。并在那里更改权限。