C#服务不会写入XML

时间:2012-01-26 09:14:32

标签: c# service

我刚刚在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文件写入起始元素,但它确实创建了空文件,因此怀疑它有权这样做。也许阅读输入文件是问题吗?我几乎不知道本地服务帐户是如何运作的!

5 个答案:

答案 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文件。因此,您的服务具有对正确目录的写权限。

但可能是它没有对输入文件的读取权限,或者在执行期间可能发生异常。

我给你的建议:

  • 将您的代码作为控制台应用而非服务进行测试,并在Visual Studio
  • 中对其进行测试
  • 尝试/捕获并记录任何异常
  • 检查事件查看器以查看Windows是否已记录有关服务问题的任何详细信息

答案 4 :(得分:0)

可能是未经处理的例外......

使用Try / Catch,将异常写入system.diagnostics.trace.writeline并使用DebugView(http://technet.microsoft.com/en-us/sysinternals/bb896647)读取输出。