Environment.GetEnvironmentVariable 找不到变量值

Posted

技术标签:

【中文标题】Environment.GetEnvironmentVariable 找不到变量值【英文标题】:Environment.GetEnvironmentVariable won't find variable value 【发布时间】:2012-10-05 22:33:12 【问题描述】:

如果调用是从托管在 IIS 上的 webMethod 中进行的,为什么 Environment.GetEnvironmentVariable("variableName") 不会获取变量的值,而如果我从同一台机器上的控制台应用程序调用它,它会起作用?

在哪里设置这些变量对 IIS Web 服务可见?我应该使用Environment.GetEnvironmentVariable(name, target) 中的第二个参数来获取它吗?

其实很简单:

[WebMethod(Description = "Gets the environment variable value.")]
public string GetEnvironmentVariable()

    return Environment.GetEnvironmentVariable("VARIABLE_NAME_HERE");

顺便说一句,VARIABLE_NAME_HERE 是在系统和用户级别设置的。

【问题讨论】:

VS 2019 - 无需重启即可找到用户变量。但是系统变量需要系统重启。 【参考方案1】:

重新启动 Visual Studio 为我修复了它(猜测 IIS Express 也会缓存这些值)。

【讨论】:

VS 在运行时显然没有检测到环境变量的变化。知道这一点将为我节省大量毫无意义的故障排除。这个答案应该在列表中更高。 这是多么容易解决的问题。我只是忽略了这个但是男孩,这解决了我的问题。感谢您提供简单而有用的建议! 不知道为什么,但这也对我有用。奇怪的是,在我的 DBContext 类中我没有这个问题,但在 Startup.cs(使用 EnvironmentVariableTarget.Process)中,除非我使用 EnvironmentVariableTarget.User/Machine,否则我无法找到环境变量。重新启动 Visual Studio 后,我能够使用 3 个枚举中的任何一个找到值。 Windows cmd.exe(又名 cmd 或命令提示符),在其上构建 PowerShell,在加载时缓存所有环境变量。 Rider 2021.2.1 也有这个问题。【参考方案2】:

我遇到了同样的问题,感谢sergserg's answer,我想出了这个并且成功了:

var value = Environment.GetEnvironmentVariable(key, EnvironmentVariableTarget.User)

重要的是使用EnvironmentVariableTarget.User

【讨论】:

这实际上也适用于系统变量。只需将 .User 更改为 .Machine。我正在附加到 PATH var,它没有从代码行中获取设置值,仅使用 Environment.GetEnvironmentVariable("PATH") 更改为 Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine) 检索了新值。 这对我也有用。没有它,我不得不重新启动我的系统,即使我已经添加了一个用户变量。【参考方案3】:

阅读此处了解更多信息:

Using System Wide Environment Variables in .NET Application


具体来说:

什么是系统环境变量?

环境变量是保存有关环境信息的字符串 系统中的整个环境。这些字符串值是动态的,并且 它们会影响您的系统的行为方式。环境 变量可以分为两种主要类型:

系统变量:无论当前是什么,它们都会影响整个系统 用户是。它们由 Windows 定义并保存在注册表中。你 需要成为管理员才能修改它们。你通常 需要重新启动计算机才能使这些更改生效。

用户变量:它们影响当前的当前环境 系统用户。它们可以被任何系统删除、修改和添加 用户。它们由 Windows 安装程序、某些程序和用户使用。 对这些变量的更改保存到注册表并生效 马上。


如果您尝试访问计算机上不存在的环境变量,您将遇到问题。您一定是在尝试查找本地计算机上存在的变量,而不是您的 Web 服务主机上的变量。

【讨论】:

这就是问题所在,变量在主机的系统和用户级别都存在 =/ 。我创建了一个控制台应用程序只是为了检查变量并且它可以工作(显示我期望的值)但是当我在同一台机器上调用托管在 iis 上的 ws 时,相同的方法返回空值。 哦,c***,我需要的只是重新启动服务器......我的应用程序正在用户级别设置值。现在有道理了。谢谢! 很高兴听到您的想法。如果需要,请编辑我的答案并添加有关重新启动服务器的警告以及为什么需要重新启动它。这个答案可能对其他人有所帮助。 我遇到了类似的问题,我添加了一些自定义环境变量,但 Environment.GetEnvironmentVariable("custom_variable") 没有读取它。我重新启动了系统,同样的代码工作了。 调用环境变量是什么意思?如何调用环境变量?【参考方案4】:

您需要使用iisreset 命令重新启动 IIS。

【讨论】:

【参考方案5】:

有一个 DLL 或一些代码被 cmd、PowerShell 和 Visual Studio(也可能由 VS Code)共享,它们在加载时缓存环境变量(分别为每个应用程序)。

因此,如果您正在测试要更改环境变量的东西,而不是重新启动 IDE(这很慢),您可以启动单独的 cmd 或 PowerShell 来测试、更改环境变量,然后只需重新启动 cmd 或 PowerShell。我推荐使用 PowerShell,因为您可以使用向上箭头来重用之前会话中键入的命令。

【讨论】:

【参考方案6】:

我项目的 csproj 文件没有(或预期的)local.settings.json。通过添加它的更新节点,Environment.GetEnvironmentVariable("variablename") 开始工作并从变量中获取信息。

<ItemGroup>
    <None Update="host.json">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
</ItemGroup>

【讨论】:

以上是关于Environment.GetEnvironmentVariable 找不到变量值的主要内容,如果未能解决你的问题,请参考以下文章