我正在寻找使我们的应用程序更具可扩展性和更易于操作的方法,而无需更改 web.config (或者,在我们的例子中,是包含 appsettings 节点的 application.config 文件)。
我考虑过的一种方法是将应用程序设置保留在具有 sqlcachedependency 的数据库表中。这意味着:
我认为的缺点是,这可能会导致严重的逻辑问题,因为如果您有一些东西可以在流程开始时检查应用程序设置,然后它在中途发生变化,您最终可能会无意中改变流程,如无需重新启动完整的应用程序。
有办法解决这个问题吗?
是否有更好的方法来管理应用程序设置,以便您可以一次性远程远程更改一台、几台或所有服务器的应用程序设置?
我有这个列表说产品类型:
Type1
Type2
Type3
Run Code Online (Sandbox Code Playgroud)
等等 现在这个列表将不断增加,并将通过 appsettings 进行设置。
现在密钥不会真的像 Type1 或 Type2 这些将是不同的。喜欢说
<add key="FoodItems" value="something"/>
<add key="Cosmetics" value="xyz"/>
Run Code Online (Sandbox Code Playgroud)
等等..所以当我编写代码时,我需要从应用程序配置中获取键和值,我知道如何获取所有键,但我想将它们放在某个类别下,这样我就不必解析整个配置文件中,我将仅解析此部分并获取其下的所有类型。
就像是
<ItemList>
<add key="FoodItems" value="something"/>
<add key="Cosmetics" value="xyz"/>
</ItemList>
Run Code Online (Sandbox Code Playgroud)
是否可以在 appsettings 中做类似的事情?或者其他一些方式,但在 appconfig 中是的。
为了安全起见,当我在 Web.config 中更改 appSettings 的值时,我总是重新启动网站,以便可以刷新所有更改。但我真的需要重新启动它吗?IIS 如何处理 appSetting 值,它是一次性读取这些值(一旦您启动应用程序)还是每次客户端访问网站时 IIS 都读取它?
我怎样才能做到这一点:
private const string myConstant = ConfigurationManager.AppSettings["key"];
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:分配给“XXX”的表达式必须是常量。
我知道这个 AppSettings 可能永远不会改变,但我不想在我的控制器中硬编码值,如下所示:
private const string myConstant = "XXX";
Run Code Online (Sandbox Code Playgroud)
我想创建一个单身人士,但我不知道这是否真的是个好主意..有什么建议吗?
谢谢 :)
我相信它appsettings.json及其环境对应物(开发、暂存、生产)取代了 Web.config 转换。
这在开发环境中工作正常,其中这些环境的变量存在于 launchSettings.json
但是,如果我使用发布功能,将发布配置为使用我创建的暂存构建配置,则不会出现转换。
我在其他地方读过你需要创建环境变量。真的!事情就是这样吗?我们现在有一个系统环境变量的舰队,这些应用程序可能会或可能不会(随着时间的推移)在该机器上的 IIS(或其他)Web 服务器上运行。
目前,我正在appsettings.json发布后手动复制和粘贴“暂存” 。我已经必须将预先准备好的 Web.config 文件复制并粘贴到该文件夹中,因为它不再可用于在 IDE 中进行配置(但奇怪的是,仍然会在发布操作期间生成)。
是否有另一种方法可以为部署进行可维护的转换,类似于旧配置文件的转换?
我的 .NetCore 应用程序中有 4 个 appsettings.json:
所有的 appsettings 都有不复制属性,但我注意到在发布应用程序时,所有的 appsettings 文件都被复制到发布文件夹。例如,即使我使用测试环境发布,appsettings.Production.json也会复制到发布文件夹。
它没有伤害,但我想知道在使用测试环境发布时是否可以只复制appsettings.json和appsettings.Test.json?
长话短说appsettings.json,Configuration当我使用类似 C# 的类时,我可以提取到类型:
type Connection() =
member val Host = Unchecked.defaultof<string> with get,set
member val Port = Unchecked.defaultof<int> with get,set
member val UserName = Unchecked.defaultof<string> with get,set
member val Password = Unchecked.defaultof<string> with get,set
type Configuration() =
member val RabbitMQ = Unchecked.defaultof<Connection> with get,set
member val PostgreSQL = Unchecked.defaultof<Connection> with get,set
let fetchConfiguration =
let builder = (new ConfigurationBuilder())
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.AddEnvironmentVariables();
let configurationRoot = builder.Build();
let configuration = new Configuration()
configurationRoot.Bind(configuration)
configuration
Run Code Online (Sandbox Code Playgroud)
但是当使用 …
我有一个 .Net 核心工作服务,它作为 Windows 服务运行。该服务使用 appsettings.json 文件作为配置信息。使用SC CREATE命令安装服务后,服务失败。
在事件查看器中,我发现了错误,它找不到文件C:\Windows\System32\appsettings.json。我的服务文件放置在不同的文件夹中c:\Services\,而不是查看该位置,该服务正在查找 System32 文件夹中的文件。
配置注册如下。
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
var configuration = configBuilder.Build();
services.AddSingleton(configuration);
Run Code Online (Sandbox Code Playgroud)
如何让服务查看本地文件夹?
windows-services worker-process appsettings .net-core asp.net-core
我生成了一个新的网络项目。似乎在 .net core 3.1 中生成了 appSettings.jsons 并且工作正常。问题是它们是由运行时加载和控制的,而不是我。所以我不能调用AddEnvironmentVariables
AddEnvironmentVariables在这种情况下打电话的正确地点在哪里?
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
}
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Run Code Online (Sandbox Code Playgroud) 也许我的问题已经有了答案,但经过长时间的搜索,我还是找不到。
我的用例如下:我有一个 ASP.Net Core 3.1 Web 应用程序。它使用 MSSQL 数据库来存储一些信息(仅供参考,我不存储任何用户的秘密,但这些信息对我来说仍然很有价值)。它还使用电子邮件客户端发送电子邮件。我需要存储数据库的连接字符串以及电子邮件客户端的凭据。到目前为止,我将它们存储在 appsettings.json 文件中,直到我意识到它们是以纯文本形式存储的,如果有人访问它们,他/她将可以访问我的数据库和我的电子邮件客户端。
现在我正在寻找一种更安全地存储它们的方法。在阅读了 SO 中的问题后,我了解到存储此类信息的建议方法是使用 Azure Key Vault。我可以使用它并开始更新我的应用程序以使用它(我读到我可以在 Azure 之外访问它)。但我开始意识到我需要将 Vault URL、ClientID 和 ClientSecret 值存储在某处。
我该如何存储它们。在其中一个教程中,他们将它们放在 appsettings.json 文件中,但他们说这对于生产来说不是一个好方法,这是可以理解的。建议的选项是将它们存储在环境变量中。但是我的问题来了 - 我在共享服务器上托管,我无法添加任何环境变量。所以环境变量的使用对我来说不是一个选择。
就我而言,当我无法添加任何环境变量时,存储任何生产机密(如数据库连接字符串)的最佳方法是什么?Azure Key Vault 仍然是一个有效且不错的选择吗?我应该考虑将它们保留在 appsetting.json 中并加密该文件吗?或者也许有另一种更好的方法?
只有我在开发应用程序,而且我不会将它存储在任何公共 GitHub 存储库或任何东西中。
PS:这是我正在查看的教程的链接:Using Azure Key Vault From A Non-Azure App
谢谢。
编辑:这是一个教程,我发现它对如何在Azure 之外使用带有证书的 Azure Key Vault很有用
appsettings ×10
c# ×6
asp.net-core ×4
.net ×2
.net-core ×2
web-config ×2
app-config ×1
asp.net ×1
azure ×1
constants ×1
database ×1
f# ×1
iis ×1