我需要COMPLUS_FORCEENC=1
在 ASP.NET 应用程序中设置环境变量。此变量必须在工作进程开始生效时设置。
因此我这样做了:
- 使用计算机管理控制台创建新用户。
- 设置密码。
- 确保它是
Users
和的成员IIS_IUSRS
。 - 配置 IIS 应用程序池以使用该用户并加载用户配置文件。这是使用自定义池,而不是默认池。
- 以该用户身份登录来设置变量。
- 重新登录以确保变量已设置。
- 重新启动操作系统。
- 确保应用程序加载并正常工作。
不幸的是,ASP.NET 应用程序看不到该变量。我从应用程序内部打印了整个环境。
当我在工作进程上使用 Process Explorer 时,我发现它在正确的用户下运行,但未设置变量。此外,变量TEMP
指向C:\Windows\Temp
而不是(如预期的那样)指向用户配置文件的临时目录(该目录存在)。我理解这是用户配置文件未加载的标志。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist
显示已加载该用户的配置单元。Environment
该用户的密钥似乎已正确填充:
我做错了什么?如何让变量出现?
这是一台 Windows 7 机器。
答案1
Windows 7 SP1 为 IIS 引入了一个新的默认设置,可防止加载 IIS 应用程序池的配置文件特定的环境变量。
因此,对于 Windows 7 SP1,您还需要编辑以下文件:
%windir%\system32\inetsrv\config\applicationHost.config
并在 部分中添加一个processModel
元素并将setProfileEnvironment
其设置true
为您的站点应用程序池applicationPools
。
它看起来应该是这样的:
<add name="ASP.NET v4.0" managedRuntimeVersion="v4.0">
<processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" />
</add>
看Windows 7 SP1 导致 IIS 上的 IntelliTrace 收集失败更多细节。
注意:您应该applicationHost.config
以管理员权限编辑该文件,并且在更改后重新启动计算机。
答案2
只需在 asp.net 页面中设置/创建环境变量
喜欢:
System.Environment.SetEnvironmentvariable("myvar", "my value", System.EnvironmentvariableTarget.user)
这应该可以在 AppPool 回收甚至服务器重启后继续存在。
我有一个完整的工作示例这个答案