如何在 .NET Core API 中使用 Windows 环境变量?

Dan*_*ulp 5 c# environment-variables asp.net-core

我们正在创建一个 .NET Core 2.1 应用程序,其中包含连接到 SQL Server 数据库的 Web API 项目。

当将连接字符串存储在尽可能最安全的位置时,我试图了解环境变量的正确使用。

当我听说我可以使用环境变量来存储连接字符串之类的东西时,听起来真的很棒。它是安全的,我们可以在不同的开发人员以及登台和生产环境上使用不同的变量。这很有用,因为它们的 SQL Server 实例并不都具有相同的名称。

但是,当我现在将连接字符串添加到 Windows 环境变量时,如下所示:

在此输入图像描述

或通过 PowerShell,如下所示:

setx CUSTOMCONNSTR_MyContextDb "Server=.\\MYSQLSERVER;Database=MyDb_local;Trusted_Connection=True;ConnectRetryCount=0"
Run Code Online (Sandbox Code Playgroud)

我尝试像这样得到它:

var connectionString = Configuration.GetConnectionString("MyContextDb");
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。该字符串为空。

只有当我转到项目的属性并在“调试”选项卡上输入环境变量时,将 CUSTOMCONNSTR_MyContextDb 变量和值添加到环境变量中,我才能使这行代码正常工作。基本上只是在 launchSettings.json 文件中设置它们。这似乎不是比 appsettings.json 更好的位置(或者是吗?)。

我是否误解了 .NET Core 中环境变量的使用?我可以不使用windows定义的环境变量吗?或者我只能在 IIS 服务器上使用真实的 Windows 环境变量吗?

看起来我可以,因为当我调试和查看 Configuration 对象时,我看到了超过 80 个环境变量的列表。

作为参考,这篇带有简短 YouTube 剪辑的文章帮助我更好地理解了这方面的概念,但我并没有完全掌握所有内容,我希望你能提供帮助。

Ada*_*ent 4

Configuration.*从应用程序配置文件中读取。您正在寻找

Environment.GetEnvironmentVariable("CUSTOMCONNSTR_MyContextDb")

对于“连接字符串应该存储在哪里”的问题,并不是那么容易回答。这有点像意见问题,而且像往常一样,这取决于

如果唯一需要更改的配置数据,为了方便起见,我会考虑坚持仅使用 appsettings.json。如果需要更多配置选项,例如在本地和 Azure 上运行,我可能会考虑采用这样的替代方法另一个考虑因素是从事同一项目的团队成员的数量。每个可能都有自己的具有不同设置的本地数据库实例。在这种情况下,SecretManager可能是一个不错的选择。

正如您到目前为止可能已经看到的那样,有很多工具和方法可以实现疯狂。不幸的是,我没有一个可以推荐的包罗万象的解决方案。我会坚持你现在正在尝试的方法,直到它不起作用为止。

我不认为您总体上误解了这个概念,除了“Windows 定义的环境变量”和另一个短语“我的 IIS 服务器上的真实环境变量”之外。Windows和IIS仍然只是别人编写的软件。它们的值并不比环境变量多或少。

我从未在您提到的选项卡中设置过环境变量,所以我不知道它存储在 launchSettings.json 中。稍后我将不得不对此进行更多挖掘。