有人知道是否可以在.NET服务中使用这些设置吗?如果不行,那序列化是我的下一个最佳选择吗?有人在服务中使用设置时有实际用途并发现最好使用特定方法吗?
我曾经在使用Settings.settings时遇到过问题。例如,如果您需要在运行时进行更改,则可能会出现问题,因为设置被最初存储在settings.settings文件中的设置覆盖了,而不是像应该存储在应用程序/ web.config中的设置。因此,我将所有Web服务代理设置为“静态”属性,并通过辅助方法手动从app / web.config中提取它们,然后以编程方式设置它们。这样可以避免任何问题。
我们遇到的一个问题的例子是:我将我的开发机器指向测试服务器上的Web服务,以测试消耗Web服务的代码。当将该代码移动到测试服务器时,没有出现问题-因为测试服务器仍然指向同一测试服务器上的同一Web服务。但是,当我们将应用程序移动到生产服务器并重新配置web.config以指向生产服务器时,我们开始出现错误结果。经过相当多的努力,才确定即使我们已将应用程序重新配置为指向生产服务器上的Web服务实现,它仍在连接到测试服务器上的Web服务。直到我们更改了我的开发计算机上的settings.settings并重新编译应用程序,它才起作用。此外,我们还注意到,如果在连接到生产Web服务时存在DNS问题,它不会失败,而是退回到在应用程序中创建Web服务代理时指定的原始设置-代理生成器实际上将其硬编码。因此,在存在网络故障时,它不会轻易被诊断为连接失败,而是简单地回到测试服务器,并且我们开始出现难以理解的数据问题。我不确定这是否是已知问题或是否已修复,但这确实是您应该注意的事项。
因此,从那以后,我总是将服务属性设置为静态,并使用辅助方法直接从web.config中读取正确的设置,然后以编程方式写入它们,因为这似乎可以避免问题。
我遇到的问题似乎与你的问题无关,因为我使用的是Web Services,而这与Windows Services没有任何关系。然而,在任何需要能够在运行时更改设置而不必重新编译的环境中,都可能受到此问题的影响,因此,你应该意识到,如果你在Dev/Test/Production环境或任何需要在运行时重新配置应用程序的环境中运行,那么在使用settings.settings时可能会得到不可预测的结果。请注意。
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;
}
Settings.settings
存储我的服务配置,没有遇到过问题。只有用户更改的设置会存储在它通常难以找到的位置中,如果您想手动编辑它们,就必须四处搜寻。我认为在项目属性中使用设置与WinForms应用程序一样,没有任何不可行的理由。我们经常这样做,而且效果很好。
My.Settings
来访问它们,它会从.config文件中读取设置,但是如果你在C#中使用类似的方式(Settings.Default
),那么你将读取编译在默认设置中的设置。为了避免这种情况发生在C#中,您需要创建一个设置对象的实例。当需要时重新加载和保存设置也很重要(我通常在OnStart和OnStop中进行)。 - Hans Olsson