2011-04-08 157 views
3

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

[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”];我假设你已经检查过配置文件安装在服务目录中了吗? – 2011-04-08 11:08:10

+0

由于问题出在配置文件中,所以代码完美地工作。 'appSettings'部分出错了。见ChrisDickson的回答。 – Learner 2011-04-08 12:32:11

回答

3

该例外表明您的配置文件有问题。仔细检查。在异常或其内部异常中应该有更多的信息,这将会给你一个更准确的指示。

+0

我有一些自定义'configSections'。当我的'appSettings'部分在配置文件的末尾时,一切正常!但是当它开始时,在'configSections'之前,它会抛出错误。我仍在调查。但是,你知道是否应该遵循任何特定顺序吗? – Learner 2011-04-08 11:50:50

+1

@CSharpLearner:'configSections'必须先到达。配置文件架构记录在MSDN的某处,尽管不是所有这些都很简单。 – 2011-04-08 11:54:49

+0

接受您的答复作为答案。你正确地发现问题将出现在配置文件本身中。一旦配置文件修复,代码就可以正常工作。 – Learner 2011-04-08 12:30:37

-1

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

  • 尝试把一个svchost.exe.config,看看.NET加载配置
  • 使用ConfigurationManager.OpenExeConfiguration打开特定的配置文件和读取值
+1

-1引用'svchost.exe'不正确。当你使用'ServiceBase'时,你通常在自己的进程中托管你的服务,因为OP已经明确完成了(MyService.exe)。 – 2011-04-08 11:14:35

2

你可以尝试使用Settings代替,并获得通过Properties.Settings

查看this link了解更多信息。