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

时间:2016-11-01 22:20:09

标签: c# wcf windows-services

我编码的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();

            //}

        }
    }
}

2 个答案:

答案 0 :(得分:0)

这就是Logs如此有用的地方,在您的OnTimer方法中添加了几个eventLog1.WriteEntry(),您将看到它失败的地方。 我会检查

  1. 我收到了多少邮件。
  2. 我会在循环中放入一个eventLog1.WriteEntry()来查看每条消息等发生的事情......

答案 1 :(得分:0)

原来该服务没有足够的权限,通过将visual studio上的服务的serviceProcessInstaller设置为User来修复它,这样当我安装它时它就会要求提供凭据。只需键入&#34; ./ [用户名]&#34;当它要求我的用户名让它工作时。

修复它的另一种方法是进入任务管理器&gt;服务&gt;右键点击服务&gt;属性&gt;安全。并在那里更改权限。