如何在 .NET Core 中进行转换为 Azure 应用程序设置的应用程序设置?

How to make app settings in .NET Core that translate to Azure app settings?

我不记得是在哪里看到的,但是在为我的 .NET Core MVC 应用程序设置应用程序配置时,我遵循了博客上的建议。我创建了一个这样的模型来保存我的应用程序需要的一些设置:

public class BasePathSettings
{
    public string BaseImageFolder { get; set; }
    public string BaseApiUrl { get; set; }
}

我的 StartUp 有这个...

    public void ConfigureServices(IServiceCollection services)
    {
        ... 
        // this adds the base paths to container
        services.Configure<BasePathSettings>(Configuration.GetSection("BasePathSettings"));

        ....
    }

appsettings.json 里面有这个:

"BasePathSettings": {
  "BaseImageFolder": "D:\Images\",
  "BaseApiUrl": "http://localhost:50321/"
},

我像这样注入需要此信息的控制器....

    private readonly BasePathSettings _settings;

    public ClientsController(IOptions<BasePathSettings> settings)
    {
        _settings = settings.Value;

        _client = new HttpClient();
        _client.BaseAddress = new Uri(_settings.BaseApiUrl);
    }

运行 在我的本地主机上一切正常。

但是,当我将此应用程序部署到 Azure 时,我假设我需要在应用程序服务的常规设置中创建应用程序设置。所以我做了一个名为 BasePathSettings 的应用程序设置,并将设置的 json 复制到值中:

 { "BaseImageFolder": "imagePath", "BaseApiUrl": "apiUrl" } 

似乎 Azure barfs 在 ConfigureServices 代码中声称 web.config 在 NTFS 中没有正确的权限。我猜真正的罪魁祸首是如何从 Azure 应用程序设置中读取 json 值。

我可以在那里使用 json 吗?如果是这样,是否需要采用不同的格式?

Can I even use json there? If so, does it need formatted differently?

要将层次结构设置添加到 Azure Web 应用程序,我们可以在部分名称和键名称之间放置一个冒号。例如,

use BasePathSettings:BaseImageFolder to set your folder
use BasePathSettings:BaseApiUrl to set your url

I made an app setting called BasePathSettings and copied the json for the setting into the value

格式应为 -

basepathsettings:baseimagefolder (just single slash)
basepathsettings:baseapiurl

如果您尝试在采用 json 值的单个 WebApp 设置中定义 "BasePathSettings",则 GetSection 将 return 为空。

作为变通方法,我使用此扩展方法代替 GetSection() :

public static T GetWebAppSection<T>(this IConfiguration config, string key)
        where T:class
    {
        T configValue = config.GetSection(key).Get<T>();

        if(configValue == default(T))
        {
            configValue = JsonConvert.DeserializeObject<T>(config[key]);
        }

        return configValue;
    }