【问题标题】:Environment.GetEnvironmentVariable("Path") returns a different value in ASP.NETEnvironment.GetEnvironmentVariable("Path") 在 ASP.NET 中返回不同的值
【发布时间】:2016-03-22 13:04:22
【问题描述】:

我在使用 ASP.NET Web 应用程序中运行的 Oracle 客户端时遇到了一些问题。经过一番检查,我发现问题可能是Environment.GetEnvironmentVariable("Path") 返回了错误的值。

如果我在控制台应用程序中调用该方法,它会返回正确的值。如果我在 ASP.NET Web 应用程序中调用它,它会返回另一个(错误)值,我无法在系统属性或 Windows 注册表中找到该值。

我的 ASP.NET 应用程序在本地 IIS 下运行,并且 AppPool 身份设置为我的用户(与运行控制台应用程序相同)。

为了确认我在两个应用程序上检查了以下属性并且值相同:

  • System.Security.Principal.WindowsIdentity.GetCurrent().Name
  • Environment.UserName

我尝试查看GetEnvironmentVariable 的源代码,但它基本上包含了对Win32 方法GetEnvironmentVariable 的调用(该源代码“显然”不可用)。

我错过了什么?

经过一些检查,我注意到即使我在控制台应用程序中获得的值也与我在那里找到的不同:

那么 GetEnvironmentVariable 的“来源”是什么?

Microsoft says说进程环境变量是从父进程加载的,所以我检查了w3wp.exe进程层次结构。如下:

wininit.exe -> services.exe -> svchost.exe -> w3wp.exe

wininit、services 和 svchost 作为 SYSTEM 运行。

wininit 和服务路径环境变量包含我可以在系统属性(“系统环境变量”)中找到的值。 svchost 具有不同的值,因此(可能)我在控制台应用程序中获得的值与我在 ASP.NET Web 应用程序中获得的值之间存在差异的原因是svchost 编辑了这个值。

【问题讨论】:

  • 我恳请您澄清您所说的“错误值”是什么意思。环境就是环境;也许它正在为您预测的用户/进程上下文返回环境。您能否详细说明为什么您认为这是“错误的”?
  • @DavidW 使用“错误”是指配置的值不同(来自系统属性),但是在最新更新之后,似乎即使我在控制台应用程序中获得的值也不同这些值

标签: c# asp.net .net


【解决方案1】:

我相信您更改了"Path" 并没有重新启动您的 IIS。 Environment.GetEnvironmentVariable 将返回当前进程的值。如果当前进程尚未重新启动,则它不会看到修改后的值。

所以,重新启动 IIS,然后您将获得该值。

您可以在 GUI 中重新启动进程或转到命令提示符并执行 iisreset

【讨论】:

  • 对不起,我忘了说我没有运行SetEnvironmentVariable 方法。我也试过AppPool回收,杀死w3wp.exe进程和iisreset,但GetEnvironmentVariable仍然返回错误的值。我也试过重启电脑......
  • @codroipo,奇怪,转到命令提示符并输入Path,看看你得到了什么,可能是值设置不正确。确保操作系统中的实际路径值是您要查找的值
  • 在命令提示符下运行 Path 返回正确的值(我通过控制台应用程序获得的值)
  • 比较每一个案例后,我注意到命令提示符中返回的Path 与我在控制台应用程序中得到的字符相差一个字符(但基本上它们是不同的)。这意味着什么?
  • @codroipo,那个字符可能会以分号结尾,这将被忽略,不用担心。确保您的 ASP.Net 应用程序中没有对 SetEnvironmentVariable 的任何呼叫。进行代码搜索。这看起来很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 2013-12-29
相关资源
最近更新 更多