Environment.GetEnvironmentVariable将找不到变量值

Lem*_*ich 26 .net c# iis web-services environment-variables

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

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

它实际上非常简单:

[WebMethod(Description = "Gets the environment variable value.")]
public string GetEnvironmentVariable()
{
    return Environment.GetEnvironmentVariable("VARIABLE_NAME_HERE");
}
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*ber 30

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

  • VS显然在运行时没有检测到环境变量的变化.知道这将为我节省大量无意义的故障排除.这个答案应该在列表中更高. (5认同)
  • Rider 2021.2.1 也存在此问题。 (3认同)
  • 如果您使用 Rider,也是一样的。重新启动 Rider,它将获取用户变量。 (2认同)

Pat*_*ina 29

我遇到了同样的问题,感谢@sergserg我提出了这个问题并且它有效:

var value = Environment.GetEnvironmentVariable(key, EnvironmentVariableTarget.User)
Run Code Online (Sandbox Code Playgroud)

重要的是使用 EnvironmentVariableTarget.User

  • 这实际上也适用于系统变量。只需将 .User 更改为 .Machine 即可。我附加到 PATH var,并且仅使用 Environment.GetEnvironmentVariable("PATH") 更改为 Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine) 并没有从代码行获取设置值,而是检索了新值。 (2认同)

ser*_*erg 14

阅读此处了解更多信息:

在.NET应用程序中使用系统范围的环境变量


特别:

什么是系统环境变量?

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

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

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


如果您尝试调用计算机上不存在的环境变量,则会出现问题.您必须尝试查找本地计算机上存在的变量,但不能在Web服务的主机上查找.

  • 哦c***,我需要的只是重新启动服务器...我的应用程序正在用户级别设置值.现在有道理.谢谢! (5认同)

小智 11

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