如何在启动Windows服务时读取Windows服务配置?

4

我无法从Windows服务的配置文件 (MyService.exe.config) 中读取 appSettings。请注意,服务已成功安装。

  [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
        public class MyService : ServiceBase
        {

            public MyService()
            {
                InitializeComponent();
                ServiceName = ConfigurationManager.AppSettings.Get("ServiceName");
            }

            private void InitializeComponent()
            {
                try
                {
                                    AutoLog = true;
                    CanStop = true;
                }
                catch (Exception e)
                {
                                  // Log error
                }
            }

            static void Main()
            {

                        MyService myService = new MyService ();
                        Run(myService);               
            }

                    protected override void OnStart(string[] args)
            {
                // Code to do necessary things on start
            }
    }

在事件查看器中的异常是System.Configuration.ConfigurationErrorsException。
正确的位置来读取Windows服务的配置是什么? ConfigurationManager.AppSettings总是返回null。

1
我有一个现有的服务,应该可以工作:ServiceName = ConfigurationManager.AppSettings["ServiceName"]; 我假设你已经检查过配置文件是否安装在服务目录中了? - TBohnen.jnr
代码本身运行得很完美,因为问题出在配置文件中。appSettings 部分放错了位置。请参考 ChrisDickson 的答案。 - Learner
3个回答

4

这个异常提示表明你的配置文件出了问题,请仔细检查。异常或者它的内部异常中应该有更多的信息,能够更精确地指出问题所在。


我有一些自定义的configSections。当我的appSettings部分在配置文件的末尾时,一切都正常!但是当它在configSections之前的开头时,就会抛出错误。我仍在调查中。但是你知道是否应该按照特定的顺序进行吗? - Learner
1
@CSharpLearner:configSections 必须放在第一位。配置文件模式的文档在 MSDN 上有记录,但不是很容易找到。 - Chris Dickson
接受您的回复作为答案。您正确地指出问题在于配置文件本身。一旦修复了配置文件,代码就可以正常工作。 - Learner
@CSharpLearner:你让我一直悬着,等着我的小绿勾呢 :-) ... 很高兴能帮助你解决问题。 - Chris Dickson

2
你可以尝试使用Settings,并通过Properties.Settings进行访问。查看此链接获取更多相关信息。

0

Windows服务将托管在svchost.exe中。因此,exe名称将不同,因此它将无法加载由.NET创建的配置。您可以

  • 尝试放置一个svchost.exe.config文件,并查看.NET是否加载了该配置
  • 使用ConfigurationManager.OpenExeConfiguration打开特定的配置文件并读取值

1
-1 对 svchost.exe 的引用不正确。当您使用 ServiceBase 时,通常会在自己的进程中托管服务,正如 OP 明确所做的那样(MyService.exe)。 - Chris Dickson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接