在 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_ENVIRONMENTProduction 中的值 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 的认证?

如何在新创建的 .NET Core 2.0 Web 应用程序中定位 .NET Standard 2.0?

我可以在生产应用程序中使用 EF Core 2.0 吗?

如何在 .Net Core 2.0 中创建应用程序变量?