Windows服务,app.config中的appSettings有异常行为
本文关键字:异常 appSettings 中的 服务 app config Windows | 更新日期: 2023-09-27 17:57:25
我正在处理一个项目,该项目有一个共享的核心组件,该组件利用了相应配置文件中的<appSettings />
部分。
这对于使用web.config的asp.net web部件来说很好。
然而,有一个Windows服务使用相同的共享核心组件,该组件(由于各种原因)直接从内部访问配置数据(即对ConfigurationManager.AppSettings["key"]
的嵌入式调用),我无法轻松重构。
这不会是个问题,但我发现web服务似乎无法获取我添加到其app.config中的appSettings值。当我将其部署到开发服务器时,它当然会变成ServiceName.exe.config,并且配置文件在其他方面运行正常(它还包含一些<applicationSettings />
类型安全设置,这些设置正在按预期工作。
由于我无法轻松更改共享组件,我不得不在Service的app.config文件中使用<appSettings />
。
我检查过的东西:结构似乎很好:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="xxxxx.UploadManagerService.UploadManager" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<xxxxx.UploadManagerService.UploadManager>
<setting name="NumberOfUploaderThreads" serializeAs="String">
<value>2</value>
</setting>
:
</xxxxx.UploadManagerService.UploadManager>
</applicationSettings>
<appSettings>
<add key="keyname" value="value" />
:
</appSettings>
</configuration>
(其中:表示"更多相同":-)
除了核心组件中的方法尝试访问任何<appSettings />
值之外,服务运行正常。
有什么方法可以让它在Windows服务中正常工作吗?我看不出为什么它不应该工作,但它不工作(当它试图访问任何值时抛出异常)。
这里有一个碎片,它会掉下来:
return SendEmailViaAmazonSES(
new List<string> { clientEmailAddress },
ConfigurationManager.AppSettings["SalesEmail"],
"Order Confirmation.",
content);
幸运的是,它被困在了try:catch中,因此没有什么问题,但这些ConfigurationManager.AppSettings["key"]
调用一直在使用,我无法在对已经使用该核心组件的其他系统没有重大影响的情况下更改它们。
有什么想法吗?
我检查过的其他东西:服务配置文件和服务exe在同一个文件夹中,dev-config确实包含正确的值。
编辑25/5
因为该服务只调用少数需要访问<appSettings />
值的方法,所以我只是通过将这些方法复制到服务本身并使用<applicationSettings />
中的值来作弊。这并不理想,我仍然很想知道为什么这对Windows服务不起作用,但我等不起了,所以我做出了务实的决定,在此期间"敷衍了事"。我总是可以在以后的某个时候回到这里,或者(碰巧)忘记这一切;-)
文件权限
查看运行Windows服务的用户是否具有对其.config文件的读取访问权限。
Sysinternals过程监视器
使用Sysinternals Process Monitor并根据您的服务名称进行筛选,以查看进程是否真的试图通过您期望的路径访问您的文件。