我有一个控制台应用程序(在dotnetcore1.1中),它在cron调度器中每1分钟调度一次。在应用程序中有对配置文件的调用。我附上下面的代码。

public static T GetAppConfig<T>(string key, T defaultValue = default(T))
{

    T value = default(T);
    logger.Debug($"Reading App Config {key}");
    try
    {
        var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        var builder = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.json", true, true)
            .AddJsonFile($"appsettings.{environmentName}.json", true, true)
            .AddEnvironmentVariables();
        var configuration = builder.Build();
        T setting = (T)Convert.ChangeType(configuration[key], typeof(T));
        value = setting;
        if (setting == null)
            value = defaultValue;
    }
    catch (Exception ex)
    {
        logger.Warn(ex, $"An exception occured reading app key {key} default value {defaultValue} applied.");
        value = defaultValue;
    }
    return value;
}

运行应用程序一段时间后,此错误出现在我的日志文件“已达到inotify实例数的配置用户限制(128)”。请找到完整的堆栈跟踪。
读取应用的应用程序密钥设备ID默认值时发生异常。
System.IO.IOException:已达到Inotify实例数的配置用户限制(128)。
在system.io.filesystemwatcher.startraisingEvents()上
在system.io.filesystemwatcher.startraisingventsifnotdisposed()上
在Microsoft.Extensions.FileProviders.Physical.PhysicalFileWatcher.CreateFileChangeToken(字符串筛选器)
在Microsoft.extensions.primitives.changetoken.onchange(func`1 changetokenproducer,action changetokenconsumer)
在Microsoft.extensions.configuration.json.jsonconfigurationsource.build上(iconfigurationbuilder生成器)
在Microsoft.extensions.configuration.configurationBuilder.build()上
在/var/app/source/app/app.shared/utilities.cs中的app.shared.utilities.getappconfig[t](字符串键,t默认值)第33行
在system.io.filesystemwatcher.startraisingEvents()上
在system.io.filesystemwatcher.startraisingventsifnotdisposed()上
在Microsoft.Extensions.FileProviders.Physical.PhysicalFileWatcher.CreateFileChangeToken(字符串筛选器)
在Microsoft.extensions.primitives.changetoken.onchange(func`1 changetokenproducer,action changetokenconsumer)
在Microsoft.extensions.configuration.json.jsonconfigurationsource.build上(iconfigurationbuilder生成器)
在Microsoft.extensions.configuration.configurationBuilder.build()上
在/var/app/source/app/app.shared/utilities.cs中的app.shared.utilities.getappconfig[t](字符串键,t默认值)第33行
请告诉我这个密码有什么问题。

最佳答案

var builder = new ConfigurationBuilder()
        .AddJsonFile($"appsettings.json", true, true);

每次访问设置时,都会创建文件监视程序。第三个参数是reloadOnChange
你必须确保,
var configuration = builder.Build()

只在应用程序中调用一次,并将其存储在可以访问它的位置(最好避免使用静态字段)。
或者禁用文件监视程序。
  var builder = new ConfigurationBuilder()
        .AddJsonFile($"appsettings.json", true, false);

或清洁剂:
var builder = new ConfigurationBuilder()
        .AddJsonFile($"appsettings.json", optional: true, reloadOnChange: false);

最好的方法是在接口后面抽象它并使用依赖注入。
public interface IConfigurationManager
{
    T GetAppConfig<T>(string key, T defaultValue = default(T));
}

public class ConfigurationManager : IConfigurationManager
{
    private readonly IConfigurationRoot config;

    public ConfigurationManager(IConfigurationRoot config)
        => this.config ?? throw new ArgumentNullException(nameof(config));

    public T GetAppConfig<T>(string key, T defaultValue = default(T))
    {
        T setting = (T)Convert.ChangeType(configuration[key], typeof(T));
        value = setting;
        if (setting == null)
            value = defaultValue;
    }
}

然后实例化并注册它
services.AddSingleton<IConfigurationManager>(new ConfigurationManager(this.Configuration));

并通过构造函数将其注入到您的服务中

关于c# - 在dotnet核心中读取json文件时出错,“已达到对inotify实例数量的配置用户限制(128)”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45875981/

10-17 00:10