我的自定义Windows服务不能与Windows消息队列一起工作

本文关键字:Windows 队列 一起 消息 工作 不能 自定义 服务 我的 | 更新日期: 2023-09-27 18:15:55

我编码的windows服务不工作:

  • 预期功能:该服务应该从Windows消息队列(MSMQ)接收消息,并将消息写入。txt文件。

  • 当我运行它不是作为一个服务(直接从visual studio)

  • 当我安装它作为一个服务,我可以启动它,但它不做任何事情,不创建/写入。txt文件的任何地方

(我知道它没有在其他地方写文件,因为当我从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();
            //}
        }
    }
}

我的自定义Windows服务不能与Windows消息队列一起工作

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

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

原来服务没有足够的权限,通过将visual studio上服务的serviceProcessInstaller设置为User来修复它,这样当我安装它时它就会要求凭据。只要打字就行了。"/[username]"当它需要我的用户名时

另一种修复方法是进入任务管理器>服务>右键单击服务>属性>安全。然后修改权限