存储.NET Windows服务设置的最佳实践:服务属性设置,序列化,

时间:2010-08-05 13:21:46

标签: c# vb.net visual-studio windows-services configuration-files

我正在开发.NET Windows服务,我正在尝试存储将在服务启动时和运行时使用的设置。我搜索了SO上的帖子,发现在项目属性中使用Settings非常适合与console和winforms应用程序一起使用。但是,Google和SO在使用Windows服务存储这些设置时是静默的。

是否有人知道在.NET服务中使用这些设置是否合适?如果没有,序列化是我的下一个最佳选择吗?有没有人对服务中的设置有实际用途,并发现最好使用特定的方法?

4 个答案:

答案 0 :(得分:12)

我在使用Settings.settings方面遇到了问题。例如,如果您需要在运行时进行更改,则设置会被最初存储在settings.settings文件中的设置覆盖,而不是显示存储的设置存在问题根据app / web.config。因此,我在属性中将所有Web服务代理设置设置为“静态”,并通过帮助程序方法从app / web.config手动提取它们并以编程方式设置它们。这可以避免任何问题。

我们遇到的问题的一个例子:我将开发机器指向测试服务器上的Web服务,以测试使用Web服务的代码。当代码移动到我们的测试服务器时,没有出现任何问题 - 因为测试服务器仍指向同一测试服务器上的同一Web服务。但是,当我们将应用程序移动到生产服务器并将web.config重新配置为指向生产服务器时,我们开始收到棘手的结果。虽然我们已经重新配置了应用程序以指向生产服务器的Web服务实现,但仍需要花费相当多的精力才能确定它仍然连接到测试服务器上的Web服务。直到我们更改了我的开发机器上的settings.settings并重新编译了它运行的应用程序。除此之外,我们还注意到,如果连接到生产Web服务时出现DNS问题,而不是失败,则它会回退到我们在应用程序中创建Web服务代理时在settings.settings中指定的原始设置。 - 代理生成器实际上是硬代码。因此,当网络中断,而不是轻易诊断出连接失败时,它只是回到测试服务器,我们开始得到难以理解的数据问题。我不确定这是一个已知的问题,还是已修复,但肯定是你应该知道的。

因此,从那时起,我总是将服务属性设置为static,并使用辅助方法直接从web.config中读取正确的设置,并以编程方式编写它们,因为这似乎可以解决问题。

看起来我遇到的问题与你的问题无关,因为我使用的是与Windows服务无关的Web服务,但是,你需要能够在运行时更改设置的任何环境无需重新编译可能会受到此问题的影响,因此您应该知道,如果您在Dev / Test / Production环境中运行,或者确实需要在运行时重新配置应用程序的任何环境(即无需重新编译) )使用settings.settings时,您可能会得到不可预知的结果。当心。

答案 1 :(得分:7)

我通常使用注册表来存储我在服务中需要的信息,即端口等。

string lsbkey = @"Software\mycompany\adas";

RegistryKey adaskey = Registry.LocalMachine.OpenSubKey(lsbkey, false);

try
{
    object regip = adaskey.GetValue("IP");
    object regport = adaskey.GetValue("PORT");
    localip = regip.ToString();
    localport = int.Parse(regport.ToString());
}
catch (NullReferenceException ne)
{
    localip = null;
    localport = 0;
    writelog(@"Aborting Service, IP or PORT doesn't exist in \local machine\software\mycompany\adas : "+ne.Message);
    status = 0;

}

答案 2 :(得分:4)

我使用Settings.settings内容来存储我的服务的配置,我没有遇到任何问题。通常情况下,更改的用户设置将存储在通常不起眼的位置,如果您想手动编辑它们,则需要进行搜索。

答案 3 :(得分:0)

我没有看到任何理由不像在winForms应用中那样在项目属性中使用“设置”。我们这样做,并且工作正常。