我有一个运行于队列触发器之外的azure函数。存储库具有从ConnectionStrings集合中获取连接字符串的方法。
return System.Configuration.ConfigurationManager.ConnectionStrings["MyDataBase"].ToString();
这在大多数情况下效果很好,但我断断续续地看到这会返回空异常错误。
有什么办法可以使它更强大吗?
天蓝色功能有时无法获取设置吗?
我应该将设置存储在其他部分吗?
我还想说这一天要运行数千次,但我看到的弹出窗口大约是100次。
运行时版本:1.0.12299.0
答案 0 :(得分:1)
您是否正在阅读每个函数调用的配置?您应该考虑读取一次(例如,使用Lazy<string>
和static
),并将其重新用于所有函数调用。
当多个线程访问代码时,可能存在并发问题。在代码周围放置lock
也会有所帮助。 ConfigurationManager.ConnectionStrings
应该是安全的,但可能不在V1运行时中。
发布了类似的问题here,但这与应用程序设置有关,与连接字符串无关。我认为使用CloudConfigurationManager应该不是正确的解决方案。
除非您正在使用Entity Framework,否则也可以尝试将连接字符串放入应用程序设置中。
仅当您使用实体框架时,连接字符串才应与功能应用程序一起使用。对于其他情况,请使用“应用程序设置”。 Click to learn more。 (通过Azure门户)
不确定这是否也适用于V1运行时。
答案 1 :(得分:0)
解决方案是为连接字符串添加私有静态字符串。然后,如果配置失败,则仅从配置中读取。然后,我添加了重试,暂停了半秒钟。这基本上消除了这种情况的发生。
private static string connectionString = String.Empty;
private string getConnectionString(int retryCount)
{
if (String.IsNullOrEmpty(connectionString))
{
if (System.Configuration.ConfigurationManager.ConnectionStrings["MyEntity"] != null)
{
connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyEntity"].ToString();
}
else
{
if (retryCount > 2)
{
throw new Exception("Failed to Get Connection String From Application Settings");
}
retryCount++;
getConnectionString(retryCount);
}
}
return connectionString;
}
我不知道这是否完美,但它可以工作。我从每天看到30次这种异常变成了无。