C# 存储.NET Windows服务设置的最佳做法:服务属性设置、序列化、,

C# 存储.NET Windows服务设置的最佳做法:服务属性设置、序列化、,,c#,vb.net,visual-studio,windows-services,configuration-files,C#,Vb.net,Visual Studio,Windows Services,Configuration Files,我正在使用一个.NET Windows服务,在该服务中,我试图存储在服务启动和运行时使用的设置。我搜索了SO上的帖子,发现使用项目属性中的设置非常适合控制台和winforms应用程序。然而,当涉及到用windows服务存储这些设置时,Google和SO都保持沉默 有人知道在.NET服务中使用这些设置是否合适吗?如果不是,序列化是我的下一个最佳选择吗?是否有人对服务中的设置有实际用途,并发现最好使用特定的方法?我使用设置。设置来存储服务的配置,我没有遇到任何问题。通常情况下,更改的用户设置将存储在

我正在使用一个.NET Windows服务,在该服务中,我试图存储在服务启动和运行时使用的设置。我搜索了SO上的帖子,发现使用项目属性中的设置非常适合控制台和winforms应用程序。然而,当涉及到用windows服务存储这些设置时,Google和SO都保持沉默


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

我使用
设置。设置
来存储服务的配置,我没有遇到任何问题。通常情况下,更改的用户设置将存储在它通常不清晰的位置,如果您想手动编辑这些设置,您必须查找这些位置。

我看不出有任何理由不使用项目属性中的设置,就像使用winForms应用程序一样。我们这样做,效果很好。

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

我们遇到的问题的一个例子是:我将我的开发机器指向测试服务器上的一个web服务,以测试使用该web服务的代码。当代码移动到我们的测试服务器时,没有出现任何问题,因为测试服务器仍然指向同一测试服务器上的同一web服务。然而,当我们将应用程序移动到生产服务器并重新配置web.config以指向生产服务器时,我们开始得到令人不安的结果。我们花了相当多的精力来确定,即使我们重新配置了应用程序,使其指向生产服务器的web服务实现,它仍然连接到测试服务器上的web服务。直到我们更改了开发机器上的settings.settings并重新编译了应用程序,它才开始工作。除此之外,我们还注意到,如果连接到生产web服务时出现DNS问题,而不是出现故障,则会返回到settings.settings中指定的原始设置,从我们在应用程序中创建web服务代理时开始,代理生成器实际上会对其进行硬编码。因此,当出现网络中断时,不是很容易诊断连接故障,而是简单地返回到测试服务器,我们开始遇到无法理解的数据问题。我不确定这是否是一个已知的问题,或者它是否已被修复,但这肯定是您应该注意的事情

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


我遇到的问题似乎与您的问题无关,因为我使用的是与Windows服务无关的Web服务,但是,任何需要在运行时更改设置而无需重新编译的环境都可能会受到此问题的影响,因此,您应该意识到,如果您在开发/测试/生产环境中运行,或者确实在任何需要在运行时重新配置应用程序的环境中运行(即无需重新编译),那么在使用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;

}

谢谢你非常详细的回答。我会投赞成票,但我还没有足够的声望点数。感谢您花时间回答这个问题。我必须承认,我根本没有遇到过这些问题,我们使用了很多windows服务,其中的应用程序设置都是从app.config文件读取的,包括web服务URL。你认为这个问题是windows services v win forms apps特有的,还是只是一个一般的app.config错误/问题?@barrylloyd-老实说,我没有对框架的哪些方面受到影响进行过大量调查,因为它是一个任务关键型应用程序[即修复并继续前进]。从我所做的调查来看,问题似乎与web服务代理与settings.settings的交互有关,而不是正确连接到web.config以查找其设置。它可能只影响框架的这个区域,也可能影响其他区域,我不确定。@barrylloyd@benAlabaster我认为问题在于如何访问设置。我认为是这样的:如果您在VB.Net中使用
My.Settings
访问它们,它将从.config文件中读取设置,但是如果您使用的是在C#中看起来相同的设置(
Settings.Default
),那么您将读取在中编译的默认设置。为了避免在C#中出现这种情况,我认为必须创建settings对象的实例。当然,记住在需要时重新加载和保存设置也很重要(我通常在OnStart和OnStop中这样做)。对于necro帖子,我很抱歉,但我只想指出,为了覆盖默认设置,必须在“主机”程序集中这样做。基本上,无论程序Main()位于何处,或global.asax或Startup.cs。您需要将类库中的复制到主app.config,然后您可以覆盖主app.config部分中的必要部分。希望这有帮助/有意义。问题