阅读这两个问题/答案,我能够在IIS 8.5服务器上运行Asp.net 5应用程序 .
Asp.net vNext early beta publish to IIS in windows server
How to configure an MVC6 app to work on IIS?
问题是,即使在IIS上运行,Web应用程序仍然使用 env.EnvironmentName
,其值为 Development
.
另外,我想在同一台服务器上运行同一个Web(Staging,Production)的两个版本,所以我需要一个方法来分别为每个Web设置变量 .
这该怎么做?
13 回答
这个答案最初是为ASP.NET Core RC1编写的 . 在RC2中,ASP.NET Core从通用的httpPlafrom处理程序转移到aspnetCore特定的处理程序 . 请注意,步骤3取决于您使用的ASP.NET Core版本 .
结果可以设置ASP.NET核心项目的环境变量,而无需为用户设置环境变量或必须创建多个命令条目 .
转到IIS中的应用程序并选择
Configuration Editor
.选择
Configuration Editor
在
Section
组合框中选择system.webServer/aspNetCore
(RC2和RTM)或system.webServer/httpPlatform
(RC1)在
From
组合框中选择Applicationhost.config ...
.单击
enviromentVariables
元素并打开编辑窗口 .设置环境变量 .
关闭窗口,然后单击“应用” .
完成
这样您就不必为池创建特殊用户或在
project.json
中创建额外的命令条目 . 此外,为每个环境添加特殊命令会中断"build once, deploy many times",因为您必须为每个环境单独调用dnu publish
,而不是发布一次并多次部署生成的工件 .更新了RC2和RTM,感谢Mark G和Tredder .
在 <aspNetCore> 下使用 <environmentVariables> 部分更新 web.config
或者为了避免在覆盖web.config时丢失此设置,请对 applicationHost.config 进行类似的更改,指定@NickAb建议的站点位置 .
Edit: as of RC2 and RTM releases, this advice is out of date. The best way I have found to accomplish this in release is to edit the following web.config sections in IIS for each environment:
system.webServer/aspNetCore
:编辑environmentVariable条目并添加环境变量设置:
ASPNETCORE_ENVIRONMENT
:< Your environment name >
作为drpdrp方法的替代方法,您可以执行以下操作:
"commands": { "Development": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Development", "Staging": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Staging", "Production": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Production" }
--iis-command
选项指定环境:dnu publish --configuration Debug --iis-command Staging --out "outputdir" --runtime dnx-clr-win-x86-1.0.0-rc1-update1
我发现这种方法比创建额外的IIS用户更少侵入 .
经过广泛的谷歌搜索后,我找到了一个有效的解决方案,包括两个步骤 .
第一步是将系统范围的环境变量ASPNET_ENV设置为Production和 Restart the Windows Server . 在此之后,所有Web应用程序都将获得值'Production'作为EnvironmentName .
第二步(为staging web启用值'Staging')更难以正常工作,但这里是:
在服务器上创建新的Windows用户,例如 StagingPool .
对于此用户,使用值'Staging'创建新的用户变量ASPNETCORE_ENVIRONMENT(您可以通过以此用户或regedit身份登录来执行此操作)
在IIS管理器中以管理员身份返回,找到运行Staging Web的应用程序池,并在“高级设置”中将Identity设置为user StagingPool .
同时将 Load User Profile 设置为 true ,以便加载环境变量 . < - 非常重要!
确保 StagingPool 具有对Web文件夹和“停止并启动应用程序池”的访问权限 .
现在,Staging Web应将EnvironmentName设置为“Staging” .
更新:在Windows 7 there is a command中,也可以为CMD提示为指定用户设置环境变量 . 这输出帮助加样品:
我在IIS Web服务器上托管了我的Web应用程序(PRODUCTION,STAGING,TEST) . 因此不可能依赖ASPNETCORE_ENVIRONMENT操作系统环境变量,因为将其设置为特定值(例如STAGING)会对其他应用程序产生影响 .
作为解决方法,我在visualstudio解决方案中定义了一个自定义文件(envsettings.json):
以下内容:
然后,根据我的应用程序类型( 生产环境 ,登台或测试),我按照以下方式设置此文件:假设我正在部署TEST应用程序,我将:
之后,在Program.cs文件中只检索此值,然后设置webHostBuilder的环境:
请记住在publishOptions(project.json)中包含envsettings.json:
这个解决方案让我可以自由地在同一个IIS上托管ASP.NET CORE应用程序,独立于环境变量值 .
至扩展@tredder的答案你可以使用
appcmd
改变环境变量分期
%windir%\system32\inetsrv\appcmd set config "staging.example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Staging'] /commit:APPHOST
生产环境
%windir%\system32\inetsrv\appcmd set config "example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production'] /commit:APPHOST
如果您在IIS上的虚拟目录中有多个不同的应用程序,则编辑_2385119的@tredder解决方案是有效的 .
我的情况是:
我有 API 项目和 APP 项目,在同一个域下,放在不同的虚拟目录中
根页面 XXX 似乎没有将ASPNETCORE_ENVIRONMENT变量传播到虚拟目录中的子节点...
...我无法将虚拟目录中的变量设置为@NickAb描述(在配置编辑器中保存更改时出现错误 The request is not supported. (Exception from HRESULT: 0x80070032) ):
进入 applicationHost.config 并手动创建如下节点:
<location path="XXX/app"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location> <location path="XXX/api"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location>
并重新启动IIS完成了这项工作 .
你需要在一个地方知道什么:
对于要覆盖任何配置设置的环境变量,它们必须以
ASPNETCORE_
作为前缀 .如果要匹配JSON配置中的子节点,请使用
:
作为分隔符 . 如果平台不允许在环境变量键中使用冒号,请改用__
.您希望您的设置以
ApplicationHost.config
结尾 . 使用IIS配置编辑器将导致您的输入写入应用程序的Web.config
- 并将在下一次部署时被覆盖!要修改
ApplicationHost.config
,您需要使用appcmd.exe
以确保修改一致 . 示例:%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /+"environmentVariables.[name='ASPNETCORE_AWS:Region',value='eu-central-1']" /commit:site
非URL安全的字符可以转义为Unicode,如
%u007b
左括号 .列出当前设置(与Web.config中的值结合使用):
%systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
如果您运行命令为同一个键多次设置配置键,它将被多次添加!要删除现有值,请使用类似
%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /-"environmentVariables.[name='ASPNETCORE_MyKey',value='value-to-be-removed']" /commit:site
的内容 .您也可以使用以下命令将所需的
ASPNETCORE_ENVIRONMENT
作为参数传递给dotnet publish命令:例如 . :
这将生成web.config,并为您的项目指定正确的环境:
与其他答案类似,我希望确保我的ASP.NET Core 2.1环境设置在部署期间保持不变,但也仅适用于特定站点 .
根据Microsoft的文档,可以使用IIS 10中的以下PowerShell命令在应用程序池上设置环境变量:
遗憾的是,我仍然不得不使用IIS 8.5,并认为我运气不好 . 但是,仍然可以运行一个简单的PowerShell脚本来为ASPNETCORE_ENVIRONMENT设置特定于站点的环境变量值:
要获得有关错误的详细信息,我必须 add ASPNETCORE_ENVIRONMENT environment variable for the corresponding Application Pool system.applicationHost/applicationPools .
注意:我的案例中的Web应用程序是在
IIS 10
上托管的ASP.NET Core 2
Web应用程序 . 它可以通过IIS Manager
中的Configuration Editor
来完成(参见Editing Collections with Configuration Editor以找出在IIS Manager
中找到该编辑器的位置) .我已经创建了一个存储库,用于在Web.config中使用环境配置发布IIS .
https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment
设置
将.csproj和.user.csproj文件中的部分放入项目文件中 .
获取MyAspNetEnvironment.props,web.development.config和web.production.config文件 .
配置
相关地更改user.csproj中ASPNETCORE_ENVIRONMENT属性的值 .
除了上面提到的选项之外,还有一些其他解决方案适用于自动部署或需要更少的配置更改 .
1. Modifying the project file (.CsProj) file
MSBuild支持
EnvironmentName
属性,它可以帮助您根据要部署的环境设置正确的环境变量 . 在发布阶段,将在web.config中添加环境名称 .只需打开项目文件(* .csProj)并添加以下XML .
上面的代码会为调试配置添加环境名称
Development
,或者如果没有指定配置 . 对于任何其他配置,生成的web.config文件中的环境名称将为Production
. 更多细节here2. Adding the EnvironmentName Property in the publish profiles.
我们也可以在发布配置文件中添加
<EnvironmentName>
属性 . 打开发布配置文件,该文件位于Properties/PublishProfiles/{profilename.pubxml}
. 这将在项目发布时在web.config中设置环境名称 . 更多详情here3. Command line options using dotnet publish
另外,我们可以通过该 properties
EnvironmentName
作为dotnet publish
命令的命令行选项 . 以下命令将在web.config文件中包含环境变量Development
.dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development