标签: .net-core-configuration

配置服务时如何通过依赖注入在 Azure Function V3 中注入或使用 IConfiguration

通常在 .NET Core 项目中,我会创建一个“boostrap”类来配置我的服务以及 DI 注册命令。这通常是一个扩展方法IServiceCollection,我可以在其中调用类似的方法,.AddCosmosDbService并且在包含该方法的静态类中所需的一切都是“自包含”的。但关键是该方法IConfigurationStartup类中获取。

我过去曾在 Azure Functions 中使用 DI,但尚未遇到此特定要求。

当函数部署在 Azure 中时,我使用IConfiguration来绑定到具有与我的local.settings.json以及开发/生产应用程序设置中的设置匹配的属性的具体类。

CosmosDbClientSettings.cs

/// <summary>
/// Holds configuration settings from local.settings.json or application configuration
/// </summary>    
public class CosmosDbClientSettings
{
    public string CosmosDbDatabaseName { get; set; }
    public string CosmosDbCollectionName { get; set; }
    public string CosmosDbAccount { get; set; }
    public string CosmosDbKey { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

BootstrapCosmosDbClient.cs

public static class BootstrapCosmosDbClient
{
    /// …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection azure-functions .net-core-configuration

25
推荐指数
5
解决办法
2万
查看次数

.NET Core 环境变量返回 null

我有一个 .NET Core 控制台应用程序。我正在尝试使用以下代码检索环境变量。

var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
Run Code Online (Sandbox Code Playgroud)

但是,变量“environment”始终返回 null。我通过设置环境变量“ASPNETCORE_ENVIRONMENT”

控制面板 -> 系统属性 -> 环境变量 -> 系统变量

我也尝试使用命令设置环境变量set ASPNETCORE_ENVIRONMENT=development,但这也不起作用。当我F5在 Visual Studio 中调试代码 ( ) 时,该变量始终返回 null。我已经确保在我设置变量的地方或在我阅读它的代码中没有任何空格。有什么我想念的吗?

c# configuration .net-core .net-core-configuration

9
推荐指数
2
解决办法
8108
查看次数

如何使用 ConfigurationBulder 绑定到配置类

我想用它ConfigurationBuidler来读取我的appsettings.json文件。我看不出我做错了什么。

我的文件是

{
  "comment": "this gets copied to bin\\debug on build. the app updates the copy. However to remember the settings you need to paste them here",
  "col1Width": "344"
}
Run Code Online (Sandbox Code Playgroud)

我的测试失败

[TestMethod]
public void TestMethod1()
{
    var configuration = Helper.LoadConfiguration("appsettings.json");
    Assert.IsTrue(configuration.Properties.Keys.Contains("col1Width")); // fails here
}
Run Code Online (Sandbox Code Playgroud)

我的助手类是:

public static class Helper
{
    public static ConfigurationBuilder LoadConfiguration(string filename)
    {
        var configuration = new ConfigurationBuilder();
        var currentDirectory = System.IO.Directory.GetCurrentDirectory();
        configuration.SetBasePath(currentDirectory);
        configuration.AddJsonFile(path: filename, optional: false, reloadOnChange: true);
        configuration.Build();
        return configuration; …
Run Code Online (Sandbox Code Playgroud)

c# .net-core .net-core-configuration .net-core-3.1

6
推荐指数
1
解决办法
2万
查看次数

来自 appsettings 的 C# 强类型 ConfigurationBuilder List&lt;object&gt;

真的很挣扎这个 - 它应该这么难吗?

我的应用程序设置中有一个简单的对象数组:

"AppSettings": {
    "Names": [
      {
        "Id": "1",
        "Name": "Mike"
      },
      {
        "Id": "2",
        "Name": "John"
      }    
    ]
}
Run Code Online (Sandbox Code Playgroud)

然后我有课

public class AppSettings
{
    public List<Names> Names { get; set; } = new List<Names>();
}

public class Names
{
    public string Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序设置中读到:

var configuration = new ConfigurationBuilder()
                            .SetBasePath(Directory.GetCurrentDirectory())
                            .AddJsonFile("appSettings.json").Build();

var config = new AppSettings();
Run Code Online (Sandbox Code Playgroud)

这就是出问题的地方:

config.Names = configuration.GetSection("AppSettings:Names") //<<<< what do I do here? …
Run Code Online (Sandbox Code Playgroud)

c# console-application .net-core .net-core-configuration

6
推荐指数
1
解决办法
3129
查看次数

如何在ASP.NET Core中启用跟踪日志记录?

我无法LogTrace(...)在我的应用程序中获得basice 输出.这是一个复制品:

  1. 使用Visual Studio 2017创建新的ASP.NET Core应用程序.
  2. (可选)注释掉,.UseApplicationInsights()以便repro更清晰
  3. 用以下代码替换代码ValuesController.cs:

    using System.Collections.Generic;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    
    namespace WebApplication1.Controllers
    {
        [Route("api/[controller]")]
        public class ValuesController : Controller
        {
            private readonly ILogger<ValuesController> logger;
    
            public ValuesController(ILogger<ValuesController> logger)
            {
                this.logger = logger;
            }
    
            [HttpGet]
            public IEnumerable<string> Get()
            {
                logger.LogError("ERROR!");
                logger.LogWarning("WARN!");
                logger.LogInformation("INFO!");
                logger.LogTrace("TRACE!");
                return new string[] { "value1", "value2" };
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 改变appsettings.Development.json这样的:

    {
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Trace",
          "System": "Information",
          "Microsoft": "Information"
        }
      }
    } …
    Run Code Online (Sandbox Code Playgroud)

c# .net-core asp.net-core .net-core-logging .net-core-configuration

5
推荐指数
3
解决办法
2万
查看次数

选项模式 - 接口/抽象属性

我想将以下对象与ServiceCollection中的appsettings.json数据绑定,但是我无法更改类或接口的设计:

public class TransferOptions :ITransferOptions 
{
   public IConnectionInfo Source {get;set;}
   public IConnectionInfo Destination {get;set;}
}

public class ConnectionInfo : IConnectionInfo
{
   public string UserName{get;set;}
   public string Password{get;set;}
}

public interface ITransferOptions
{
   IConnectionInfo Source {get;set;}
   IConnectionInfo Destination {get;set;}
}

public interface IConnectionInfo
{
   string UserName{get;set;}
   string Password{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

这是我在appsettings.json中的数据

{
"TransferOptions":{
    "Source ":{
                 "UserName":"USERNAME",
                 "Password":"PASSWORD"
              },
    "Destination":{
                 "UserName":"USERNAME",
                 "Password":"PASSWORD"
              }
   }
}
Run Code Online (Sandbox Code Playgroud)

这是我在服务提供商上的配置:

var provider=new ServiceCollection()
.Configure<TransferOptions>(options => _configuration.GetSection("TransferOptions").Bind(options))
.BuildServiceProvider();
Run Code Online (Sandbox Code Playgroud)

这是我收到错误的部分

无法创建“IConnectionInfo”类型的实例,因为它是抽象的或接口

var transferOptions =_serviceProvider.GetService<IOptions<TransferOptions>>()
Run Code Online (Sandbox Code Playgroud)

c# .net-core .net-core-configuration servicecollection

4
推荐指数
1
解决办法
1912
查看次数

.net 核心控制台应用程序使用 TopShelf

我使用 TopShelf 创建了一个 .net 核心控制台应用程序。但是在使用 docker (alpine-linux) 运行应用程序时出现错误。

Configuration Result:
    [Success] Name MyApp
    [Success] DisplayName MyApp
    [Success] Description My Application
    [Success] ServiceName MyApp
    Topshelf v4.1.0.177, .NET Framework v4.0.30319.42000
    Topshelf.Runtime.Windows.WindowsHostEnvironment Error: 0 : Unable to get parent process (ignored), System.DllNotFoundException: Unable to load shared library 'kernel32.dll' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: Error loading shared library libkernel32.dll: No such file or directory
       at Topshelf.Runtime.Windows.Kernel32.CreateToolhelp32Snapshot(UInt32 dwFlags, UInt32 th32ProcessID)
       at Topshelf.Runtime.Windows.WindowsHostEnvironment.GetParent(Process …
Run Code Online (Sandbox Code Playgroud)

containers topshelf docker .net-core .net-core-configuration

3
推荐指数
2
解决办法
2387
查看次数

netcore2 控制台应用程序在 appsettings 配置日志级别

我尝试向我的控制台应用程序添加一个记录器。所有配置都正确应用,除了Logging

程序.cs:

   private static void Main(string[] args)
    {
        var services = new ServiceCollection();
        ConfigureServices(services);

        var serviceProvider = services.BuildServiceProvider();

        serviceProvider.GetService<App>().Run();
        Console.ReadKey();
    }

    private static void ConfigureServices(ServiceCollection services)
    {

        var envName = Environment.GetEnvironmentVariable("MY_ENV") ?? DevelopmentEnvName;

        var configuration = new ConfigurationBuilder()
                            .SetBasePath(Directory.GetCurrentDirectory())
                            .AddJsonFile("appsettings.json", false)
                            .AddJsonFile($"appsettings.{envName}.json", true, true)
                            .AddEnvironmentVariables()
                            .Build();

        services.AddSingleton(configuration);
        services.AddLogging(builder =>
                            {
                                builder.AddConfiguration(configuration)
                                       .AddConsole()
                                       .AddDebug();
                            });

        ConfigureOptions(services, configuration);

        ConfigureDependencies(services);
    }
Run Code Online (Sandbox Code Playgroud)

App.Run()我尝试记录调试和信息消息

 public void Run()
 {
    _logger.LogDebug("Debug");
    _logger.LogDebug(_appOptions.Env);   //print nothing

    _logger.LogInformation("Info");
    _logger.LogInformation(_appOptions.Env);  //print Info and debug env lines
 }
Run Code Online (Sandbox Code Playgroud)

appsettings.json: …

.net-core .net-core-logging .net-core-configuration .net-core-2.0

2
推荐指数
1
解决办法
1348
查看次数

如何在 .NET Core 3 中通过命令行参数设置日志级别

我有一个 .NET Core 3.0 控制台应用程序。我有一个 Microsoft.Extensions.Logging 记录器,并且正在使用命令行参数构建 Microsoft.Extensions.Configuration。

我的问题是“如何通过命令行参数设置日志级别?”

.net-core-logging .net-core-configuration

2
推荐指数
1
解决办法
3056
查看次数

带有简单注入器的 Legacy .NET 应用程序中的选项模式、配置

这篇文章https://medium.com/@dmitryzaets/legacy-net-applications-configuration-management-net-framework-4-5-1-68220335d9d8描述了如何将选项模式与 Autofac 一起使用。我试图将其翻译为与 Simple Injector 一起使用。但我没有运气。这是我的国际奥委会代码

public class IocBootstrap2
{
    private Container Container { get; }
    public IocBootstrap2()
    {
        Container = new Container();
        var configurationBuilder = new ConfigurationBuilder()
            .SetBasePath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Configuration"))
            .AddJsonFile("settings.json", optional: false, reloadOnChange: true);
        var configuration = configurationBuilder.Build();
        //Register Options
        Container.Register(typeof(IOptions<>), typeof(OptionsManager<>));
        Container.Register(typeof(IOptionsMonitor<>), typeof(OptionsMonitor<>));
        Container.Register(typeof(IOptionsFactory<>), typeof(OptionsFactory<>));
        Container.Register(typeof(IOptionsMonitorCache<>), typeof(OptionsCache<>));
        // Register ConfigurationOptions
        Container.RegisterConfigurationOptions2<MailingOptions>(configuration.GetSection("mailing"));

    #if DEBUG
        Container.Verify();
    #endif   
 }
}

public static class ConfigurationSetupExtensions2
{
    public static void RegisterConfigurationOptions2<TOptions>(this Container container, IConfiguration config)
        where TOptions : class
    {
        container.Register(typeof(IOptionsChangeTokenSource<TOptions>), …
Run Code Online (Sandbox Code Playgroud)

configuration configurationmanager legacy-code simple-injector .net-core-configuration

1
推荐指数
1
解决办法
1268
查看次数