我的自定义 Windows 服务无法与 Windows Message Queue 一起使用
My custom Windows Service not working with Windows Message Queue
我编码的 windows 服务不工作:
预期功能:该服务应该从 Windows 消息队列 (MSMQ) 接收消息并将消息写入 .txt 文件。
当我 运行 它不是作为服务(直接来自 visual studio)时它起作用
当我将它安装为服务时,我可以启动它,但它什么也没做,任何地方都没有 creating/writing .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();
//}
}
}
}
这就是日志如此有用的地方,将几个 eventLog1.WriteEntry() 放在您的 OnTimer 方法中,您将看到它在哪里失败。
我会检查
- 我收到了多少条消息。
- 我将在循环中放置一个 eventLog1.WriteEntry() 以查看每条消息发生了什么...
原来该服务没有足够的权限,通过将 visual studio 上服务的 serviceProcessInstaller 设置为用户来修复它,这样当我安装它时它会要求提供凭据。当它要求输入我的用户名时,只需输入“./[用户名]”即可。
另一种修复方法是进入任务管理器 > 服务 > 右键单击服务 > 属性 > 安全。并在那里更改权限。
我编码的 windows 服务不工作:
预期功能:该服务应该从 Windows 消息队列 (MSMQ) 接收消息并将消息写入 .txt 文件。
当我 运行 它不是作为服务(直接来自 visual studio)时它起作用
当我将它安装为服务时,我可以启动它,但它什么也没做,任何地方都没有 creating/writing .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();
//}
}
}
}
这就是日志如此有用的地方,将几个 eventLog1.WriteEntry() 放在您的 OnTimer 方法中,您将看到它在哪里失败。 我会检查
- 我收到了多少条消息。
- 我将在循环中放置一个 eventLog1.WriteEntry() 以查看每条消息发生了什么...
原来该服务没有足够的权限,通过将 visual studio 上服务的 serviceProcessInstaller 设置为用户来修复它,这样当我安装它时它会要求提供凭据。当它要求输入我的用户名时,只需输入“./[用户名]”即可。
另一种修复方法是进入任务管理器 > 服务 > 右键单击服务 > 属性 > 安全。并在那里更改权限。