我刚刚在C#2010中编写了一个测试服务。在OnStart方法中,我在C:驱动器的根目录中打开一个XML文档,解析它并写出另一个XML文档也在C的根目录中:驱动。
当我安装服务并启动它时,我告诉它再次自动停止。输出XML文件已创建但为空。我正在以本地系统帐户运行该服务。
有谁能告诉我为什么没有写内容?
谢谢,
编辑(包含OnStart代码)......
protected override void OnStart(string[] args)
{
String win32ClassName = "";
String nodeSubkeyName = "";
List<String> propertyList = new List<String>();
List<String> propertyListQuery = new List<String>();
XmlTextReader reader = new XmlTextReader("C:\\hwin.xml");
XmlTextWriter writer = new XmlTextWriter("C:\\hwout.xml", null);
writer.WriteStartDocument();
writer.WriteComment("Asset hardware Inventory for " + System.Environment.MachineName);
writer.WriteStartElement("hardware");
上面的代码甚至没有为输出XML文件写入起始元素,但它确实创建了空文件,因此怀疑它有权这样做。也许阅读输入文件是问题吗?我几乎不知道本地服务帐户是如何运作的!
答案 0 :(得分:1)
我怀疑它并没有冲刷它写入的流。流输出(包括文件输出)通常是缓冲的,因为它提供了更好的性能来批量写入一堆字节来写入文件,而不是一个接一个地执行。 (这个好处会增加你使用的较大缓冲区,直到4或8k,此时所用内存的成本超过了增益.4和8往往比两者之间更好,因为它们也能很好地达到内存页面大小,无论如何,大多数框架提供的流的默认缓冲区都是4k)。
无论如何,如果这是问题,那么你需要刷新流。关闭编写器时总会执行此操作,并且在Dispose()
时始终关闭编写器。作为一种良好的实践,你应该尽快处理任何实现IDisposable
的事情(如果你不这样做,总是假设一些不好的事情,即使在你知道给定的{{1目前实现为无操作)。大多数情况下,使用block块最容易做到这一点:
Dispose()
即使我的怀疑是错误的,但养成这样做的习惯也是值得的。
答案 1 :(得分:0)
检查事件查看器中的错误日志,您很可能无权从c:\
中读取文件您可以在有权读取\写入c:\
的帐户下运行服务您应该使用try并捕获xml写代码块,然后记录错误以进一步调试。
答案 2 :(得分:0)
很难说没有代码片段,但如果服务无法启动OnStart抛出异常,请将Thread.Sleep放在OnStart方法中,使用visual studio附加到进程并debug
答案 3 :(得分:0)
您是否尝试将代码作为控制台应用程序而非服务执行?
服务的运行时问题通常是由于特权造成的。对于写入部分,这不是这种情况,因为您的代码必须创建输出XML文件。因此,您的服务具有对正确目录的写权限。
但可能是它没有对输入文件的读取权限,或者在执行期间可能发生异常。
我给你的建议:
答案 4 :(得分:0)
可能是未经处理的例外......
使用Try / Catch,将异常写入system.diagnostics.trace.writeline并使用DebugView(http://technet.microsoft.com/en-us/sysinternals/bb896647)读取输出。