我们在Windows Server 2012 R2虚拟机上运行了一个3节点本地SF群集。其中,每个节点上都部署了一个无状态的ASP.NET WebApi服务实例。服务的启动代码使用以下代码从“自定义配置”部分读取数据库连接字符串:
public static string GetLogDatabaseConnectionString(ServiceContext context)
{
var configPackage = context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
const string RuntimeParametersSectionName = "Cop_RuntimeParameters";
var configSection = configPackage.Settings.Sections.FirstOrDefault(s => s.Name == RuntimeParametersSectionName);
if (configSection == null)
{
throw new InvalidOperationException($"Missing Settings.xml section {RuntimeParametersSectionName}.");
}
const string LogDatabaseConnectionStringParameterName = "Cop_LogDatabaseConnectionString";
var logDatabaseConnectionStringConfigParameter = configSection.Parameters.FirstOrDefault(p => p.Name == LogDatabaseConnectionStringParameterName);
if ((logDatabaseConnectionStringConfigParameter == null) || string.IsNullOrWhiteSpace(logDatabaseConnectionStringConfigParameter.Value))
{
throw new InvalidOperationException(
$"Missing parameter {LogDatabaseConnectionStringParameterName} in Settings.xml section {RuntimeParametersSectionName}.");
}
return logDatabaseConnectionStringConfigParameter.Value;
}
连接字符串的设置完全与此SO帖子-Where do you set and access run-time configuration parameters per environment for service fabric?中所述。
一切正常几天。昨天我们不得不重新启动一个SF节点(VM2)。重新启动后,服务启动代码开始引发有关配置中缺少InvalidOperationException
参数的第二个Cop_LogDatabaseConnectionString
异常。由于代码是从服务的构造函数中调用的,没有进行异常处理,因此SF无法启动服务。回收节点无济于事–唯一的补救方法是删除并重新部署服务类型和关联的应用程序类型。
我的问题是:SF配置系统停止返回在部署服务期间配置的值的可能原因是什么?