Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#服务赢得';无法写入XML_C#_Service - Fatal编程技术网

C#服务赢得';无法写入XML

C#服务赢得';无法写入XML,c#,service,C#,Service,我刚刚用C#2010编写了一个测试服务。在OnStart方法中,我在C:drive的根目录下打开一个XML文档,对其进行解析,并将其写入另一个同样在C:drive根目录下的XML文档 当我安装并启动这项服务时,我告诉我它又自动停止了。输出XML文件已创建,但为空。我正在以本地系统帐户运行该服务 有人能告诉我为什么没有写内容吗 谢谢 编辑(包括OnStart的代码) protected override void OnStart(字符串[]args) { 字符串win32ClassName=“”;

我刚刚用C#2010编写了一个测试服务。在OnStart方法中,我在C:drive的根目录下打开一个XML文档,对其进行解析,并将其写入另一个同样在C:drive根目录下的XML文档

当我安装并启动这项服务时,我告诉我它又自动停止了。输出XML文件已创建,但为空。我正在以本地系统帐户运行该服务

有人能告诉我为什么没有写内容吗

谢谢

编辑(包括OnStart的代码)

protected override void OnStart(字符串[]args)
{
字符串win32ClassName=“”;
字符串nodeSubkeyName=“”;
List propertyList=新列表();
List propertyListQuery=新列表();
XmlTextReader=新的XmlTextReader(“C:\\hwin.xml”);
XmlTextWriter=新的XmlTextWriter(“C:\\hwout.xml”,null);
writer.WriteStartDocument();
WriteComment(“+System.Environment.MachineName”的资产硬件清单);
WriteStarteElement(“硬件”);

上面的代码甚至没有为输出XML文件编写起始元素,但它确实创建了空文件,因此怀疑它有权这样做。也许是读取输入文件的问题?我几乎不知道本地服务帐户是如何工作的!

在事件查看器中查看错误日志,很可能您没有权限这样做从c中读取文件:\

您可以使用具有读\写c权限的帐户运行服务:\


您应该在xml编写代码块周围使用try-and-catch,然后记录错误以进行进一步调试。

如果没有代码段,很难说没有代码段,但如果服务没有启动,则在启动时抛出异常,将线程放入OnStart方法中。在OnStart方法中睡眠,使用visual studio连接到进程,并且

您是否尝试过作为一个线程执行代码控制台应用程序而不是服务

服务的运行时问题通常是由权限引起的。对于编写部分,这里的情况并非如此,因为您的代码必须创建输出XML文件。因此,您的服务具有对正确目录的写入权限

但可能是因为它对输入文件没有读取权限,或者只是在执行过程中发生了异常

我给你的建议是:

  • 将代码作为控制台应用程序而不是服务进行测试,并从VisualStudio中进行测试
  • 尝试/捕获并记录任何异常
  • 检查事件查看器以查看windows是否记录了有关服务问题的任何详细信息

    • 可能是未处理的异常


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

      我怀疑它没有刷新正在写入的流。流输出(包括文件输出)通常是缓冲的,因为它提供了更好的性能,将一堆字节批量写入文件,而不是逐个写入。(好处是增加了使用的较大缓冲区,直到4或8k,此时所用内存的成本超过了收益。4和8都比这两者更好,因为它们也很好地影响内存页大小,在任何情况下,大多数框架提供的流的默认缓冲区是4k)

      无论如何,如果这是一个问题,那么您需要刷新流。这总是在您关闭写入程序时完成,而关闭写入程序总是在您
      Dispose()
      它时完成。作为一种良好的做法,您应该始终尽可能快地处理实现
      IDisposable
      的任何内容(始终假设如果不这样做,至少会发生一些不好的事情,即使在您知道给定的
      Dispose()
      当前被实现为no-op的情况下也是如此)。大多数情况下,使用using块最容易做到这一点:

      using(XmlTextWriter writer = new XmlTextWriter("C:\\hwout.xml", null))
      {
        //code that uses writer here
      }
      

      即使我的怀疑是错误的,也值得养成这样做的习惯。

      所以它实际上会将文件写入磁盘?但它是空的..非常奇怪!我认为这是创建的文件上的一个问题。发布一小部分代码,也许我们可以帮你猜你已经用WriteEndElement关闭了WriteStarteElement,也关闭了WriteStarteElement一旦你完成了,编写器就会出现。是的,代码作为控制台应用程序运行良好。我将在我的原始帖子中发布代码。我认为本地服务帐户将有权访问C:(或磁盘的任何部分)?不是这样吗?很可能不是,我不记得了-最简单的方法是打开服务面板,更改服务器正在运行的用户,并将其更改为您可以在c:\上读写文件的帐户。如果进行此更改有效,则您肯定知道这是权限问题。长期修复方法您应该尝试捕获并记录例外情况我通常发现编写服务的最佳方法是将所有逻辑放入类库中…然后在开发过程中,我将类库与控制台应用程序一起使用…还将相同的代码用于wndows服务。示例MyClassLibrary.RunInstance()…这就是我需要放在控制台应用程序和windows服务中的所有代码。剩下的代码是类库。调试起来容易得多,速度也快得多,而不是不断编译、安装和卸载服务。我试着给它我自己的详细信息,它也做了同样的事情。下个星期开始上C#课程,所以我想在那之后我会研究处理异常。我只是在胡闹,看看我自己能弄明白多少!结果在我读XML时发现了一个未处理的异常。
      using(XmlTextWriter writer = new XmlTextWriter("C:\\hwout.xml", null))
      {
        //code that uses writer here
      }