我正在从事一个项目,该项目具有一个共享核心组件,该组件使用 <appSettings />
相应配置文件中的部分。
这适用于使用 web.config 的 asp.net Web 部件。
但是,有一个 Windows 服务使用相同的共享核心组件,它(出于各种原因)直接从内部访问配置数据(即对 ConfigurationManager.AppSettings["key"]
的嵌入式调用),我无法轻易重构。
这不是问题,但我发现 Web 服务似乎无法获取我添加到其 app.config 中的 appSettings 值。当我将它部署到开发服务器时,它当然会变成 ServiceName.exe.config 并且配置文件在其他方面正常运行(它还包含一些 <applicationSettings />
类型安全设置,这些设置按预期工作。
由于我无法轻松更改共享组件,因此我不得不以某种方式处理 <appSettings />
问题。在服务的 app.config 文件中。
我检查过的事情:结构看起来不错:
<?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 />
值(value)观。
有什么方法可以让它与 Windows 服务一起正常工作吗?我看不出它为什么不应该正常工作的任何原因,但它却没有(当它试图访问任何值时抛出异常)。
这是它掉落的那种地方的碎片:
return SendEmailViaAmazonSES(
new List<string> { clientEmailAddress },
ConfigurationManager.AppSettings["SalesEmail"],
"Order Confirmation.",
content);
...幸运的是,它被困在一个 try:catch 中,因此除了那些 ConfigurationManager.AppSettings["key"]
之外没有任何东西掉下来。调用自始至终都在使用,我无法在不对已经使用该核心组件的其他系统产生重大影响的情况下更改它们。
有什么想法吗?
我检查过的其他事项:服务配置文件与服务 exe 位于同一文件夹中,开发配置确实包含正确的值。
编辑 25/5
因为服务只调用了几个需要访问 <appSettings />
的方法值,我只是通过将这些方法复制到服务本身并使用 <applicationSettings />
中的值来作弊。反而。这并不理想,我仍然非常想知道为什么这对 Windows 服务不起作用,但我等不及了,所以我在此期间做出了务实的决定来“捏造它”。我总是可以在以后的某个时候回到这里,或者(碰巧)忘记它;-)
最佳答案
文件权限
查看运行 Windows 服务的用户是否具有对其 .config 文件的读取权限。
Sysinternals 进程监视器
使用Sysinternals Process Monitor并按您的服务名称进行过滤,以查看该进程是否真的尝试通过您期望的路径访问您的文件。
关于c# - Windows 服务,app.config 中 appSettings 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6109065/