在 AWS 的 .NET Core 2.0 应用程序中禁用开发环境
Posted
技术标签:
【中文标题】在 AWS 的 .NET Core 2.0 应用程序中禁用开发环境【英文标题】:Disabling development environment in .NET Core 2.0 app in AWS 【发布时间】:2018-09-19 07:20:46 【问题描述】:我有一个部署到 AWS ElasticBeanstalk 的 .NET Core MVC 应用程序。但是当我去应用程序时,我收到一条错误消息:
不应在已部署的应用程序中启用开发环境
-
在
launchsettings.json
文件中我设置了ASPNETCORE_ENVIRONMENT
's
值为Production
。
当我使用 Visual Studio (AWS toolkit) 部署应用程序时,我将 Project
build configuration
的值设置为 Release
。
我还创建了带有名称的环境变量
ASPNETCORE_ENVIRONMENT
和 Production
中的值 EB Software Configuration
。
但我仍然遇到同样的错误,知道有什么解决方法吗?
我的launchSettings.json
文件如下所示:
"iisSettings":
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress":
"applicationUrl": "http://DUMMY.us-west-2.elasticbeanstalk.com/",
"sslPort": 0
,
"profiles":
"IIS Express":
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "http://DUMMY.us-west-2.elasticbeanstalk.com/",
"environmentVariables":
"ASPNETCORE_ENVIRONMENT": "Development"
,
"AlacsWeb":
"commandName": "Project",
"launchBrowser": true,
"environmentVariables":
"ASPNETCORE_ENVIRONMENT": "Development"
,
"applicationUrl": "http://DUMMY.us-west-2.elasticbeanstalk.com/"
还有startup.cs
文件:
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration get;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// Add application services.
services.AddTransient<IEmailSender, EmailSender>();
services.AddMvc();
// Add http context
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
if (env.IsDevelopment())
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
else
app.UseExceptionHandler("/Home/Error");
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
routes.MapRoute(
name: "default",
template: "controller=Home/action=Index/id?");
);
【问题讨论】:
Development environment should not be enabled in deployed applications
不是错误消息。这是关于在生产环境中不启用开发模式的提示。您可能会得到一个“正常”的 HttpStatus 代码 500。请做 启用开发,让它快速显示实际的错误消息。并且不要忘记在测试后禁用它。
@rickvdbosch,好的,但是怎么样?我已经完成了上述所有操作的相反操作,仍然出现这个“提示”错误。
将ASPNETCORE_ENVIRONMENT
变量设置为Development
并重新启动应用程序。如果你有一个相当标准的实现,那么 Development 很可能会给你一个 DeveloperExceptionPage
我也已经完成了,这也没有帮助@rickvdbosch
你应该也可以在网络配置中设置它
【参考方案1】:
一个疯狂的解决方案:
替换:
if (env.IsDevelopment())
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
else
app.UseExceptionHandler("/Home/Error");
到
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
【讨论】:
【参考方案2】:launchsettings.json 是特定于 Visual Studio 构建的。它不会影响部署。
以下问题提供了对该问题的一些见解
AWS Elastic Beanstalk environment variables in ASP.NET Core 1.0
【讨论】:
【参考方案3】:感谢您发布代码。我在这里回答是因为要说的内容超出了评论表单的允许范围。
TLDR
您的环境变量在 EBS 中被忽略,因为您的初创公司没有选择它们。
我不知道launchSettings.json
对 EBS 有什么影响,但考虑到该文件中的环境变量被忽略,我怀疑答案是否定的。
您可以在 EBS 中保存环境变量。
launchSettings.json
我自己不使用这些,所以接下来是研究和琐碎的测试。
This MS article 声称此文件仅用于在 Visual Studio 中运行
使用 Visual Studio 时,可以在 launchSettings.json 文件中设置环境变量。
但是我从一个简单的测试中知道,这些 也 由项目目录中的 dotnet run
拾取。另外,我知道 VS Code 会忽略它而支持.vscode/launch.json
。
我不知道的是 IIS 是否关注它。 (我的意思是 EBS 实例中的 IIS,而不是您的开发盒上的 IIS Express)。
环境变量
我想我明白为什么环境变量被忽略了。
Startup.cs
有一个替代构造函数,可让您从环境变量、配置文件等构建配置对象。它接受IHostingEnvironment
实例。
public class Startup
public Startup(IHostingEnvironment env)
var builder = new ConfigurationBuilder()
.AddEnvironmentVariables(); // <--- This picks up env variables
Configuration = builder.Build();
public IConfigurationRoot Configuration get;
// etc ....
EB 环境变量
正如我在评论中解释的那样,EB + dotnet core 2 在环境变量方面一团糟。我们的解决方案不是根据my earlier answer 解析地狱文件,而是对我们的 dotnet 应用程序进行 Dockerise。
也就是说,您可以在 EB 中保存环境变量。正如您所说,软件配置是输入它们的正确位置。然后,单击您的环境(EB 中显示的绿色/灰色/任何卡片),转到“操作”菜单并保存配置。
【讨论】:
以上是关于在 AWS 的 .NET Core 2.0 应用程序中禁用开发环境的主要内容,如果未能解决你的问题,请参考以下文章
将 .Net Core 2.0 和 Angular4 部署到 AWS 后无法发布到 Sqlite 数据库
.net core 2.0学习笔记:Remoting核心类库RealProxy迁移
如何在 ASP.NET (Core 2) Web 应用程序中访问来自 AWS 的认证?