ASP.NET Core 部署到 IIS 错误:不应在已部署的应用程序中启用开发环境

Posted

技术标签:

【中文标题】ASP.NET Core 部署到 IIS 错误:不应在已部署的应用程序中启用开发环境【英文标题】:ASP.NET Core deployment to IIS error: Development environment should not be enabled in deployed applications 【发布时间】:2016-09-28 03:33:28 【问题描述】:

我按照this article 将我的 ASP.NET MVC Core 1.0 应用程序部署到使用 IIS 10 的 Windows 10 上的本地 IIS。应用程序部署成功,它可以正常打开主页。我正在使用个人用户帐户身份验证。在主页上,当我输入登录名/密码并单击 Login 按钮时,我收到以下错误。我正在使用最新版本的 ASP.NET Core 和 VS2015。我使用 VS2015 发布向导发布应用程序。一切都在同一台机器上完成:

处理您的请求时出错。

开发模式

切换到开发环境将显示有关所发生错误的更详细信息。不应在已部署的应用程序中启用开发环境,因为它可能导致向最终用户显示异常的敏感信息。对于本地调试,可以通过将 ASPNETCORE_ENVIRONMENT 环境变量设置为 Development 并重新启动应用程序来启用开发环境。

【问题讨论】:

当你默认发布一个 ASPNETCORE_ENVIRONMENT 变量时,如果没有设置 ASPNETCORE_ENVIRONMENT 变量,它将作为生产,你可以尝试在环境变量或网络中设置 ASPNETCORE_ENVIRONMENT配置到 Development 临时调试正在发生的事情,如果您在生产中使用 appsettings.development.json,如果 enviremoent 变量未设置为“Development”,则不会读取它 顺便说一句,此消息:“不应在已部署的应用程序中启用开发环境,因为它可能导致向最终用户显示来自异常的敏感信息。对于本地调试,可以通过设置启用开发环境ASPNETCORE_ENVIRONMENT 环境变量用于开发,并重新启动应用程序。”不是错误只是警告/建议,但即使已部署,您也可以将其设置为开发 通过发布配置文件解决了环境问题,请参阅***.com/a/64368721/1662459 您可以使用 从 EnvironmentVariables xml 块中的 web.config 文件控制环境变量 【参考方案1】:

首先,检查ASPNETCORE_ENVIRONMENT 变量的值。您必须将此环境变量设置为“生产”(或开发以外的其他环境)

否则,你可以像这样更新web.config-

<configuration>
  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\Application.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

更多详情请参考post。

【讨论】:

感谢您的帮助。在您的建议的&lt;aspNetCore processPath=".\Application.exe" arguments="" 部分,1. Application 是项目名称还是原样? 2. arguments 值是否需要为空? 1.是的,应用程序是项目 2 的名称。参数只是命令行参数。如果你期待任何,那么你可以通过这里,否则将其留空。 我使用了您在上面发布的 web.config 文件(在将 Application 替换为我的项目名称之后),但我仍然收到上面帖子中显示的相同错误\信息消息。有什么想法\建议吗? 尝试 IIS 重置。也可以尝试使用 ASPNETCORE_ENVIRONMENT = Development 看看会发生什么。 @Sunket IISReset 没有帮助。然后我更改为ASPNETCORE_ENVIRONMENT = Development ,在没有启动主页的情况下给了我以下错误。另一方面,如果我在变量值中使用Production,它确实会启动主页,但会在我输入登录名\密码信息并在登录页面上按回车后给我上面帖子中的原始错误\信息消息。 错误500 Internal Server Error System.InvalidOperationException Unable to locate a project.json at 'C:\DotNet2015\PublishToIIS\DeploymentTest\'.【参考方案2】:

我想在开发环境中运行它,所以我在 web.config 文件中添加了以下内容,它对我有用:

<environmentVariables>
     <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>

【讨论】:

【参考方案3】:

如果您使用 ASP.NET CORE 进行开发。您可以在属性中找到此设置,然后在 launchSetting.json 文件中找到。

"profiles": 
    "IIS Express": 
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": 
        "ASPNETCORE_ENVIRONMENT": "Production"
      ,
      "nativeDebugging": false
    ,
    "Ecommerce": 
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": 
        "ASPNETCORE_ENVIRONMENT": "Production"
      ,
      "applicationUrl": "https://localhost:5001;http://localhost:5000"
    
  

"ASPNETCORE_ENVIRONMENT": "Development" 更改为"ASPNETCORE_ENVIRONMENT": "Production"

展开属性可以找到launchSetting.json文件

【讨论】:

启动setting.json文件在哪里? 我已经通过添加显示文件的图像来编辑答案 @IlludiumPu36 您是否在所有项目或某些功能上都遇到此错误? 始终...查看此站点,顶部菜单出现错误parakeetbay.com/Students @IlludiumPu36 有时在部署项目后引用本地资源时会发生这种错误。例如数据库连接字符串、图像和其他类型的资产。部署的应用程序不应有任何类型的本地(本地目录)引用。【参考方案4】:

我遇到了同样的问题(ASP.NET CORE 3.1),但更改“ASPNETCORE_ENVIRONMENT”没有帮助。

在网上搜索我发现在 Startup.cs, Configure 方法中,这段代码隐藏了真正的问题。

 if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

然后我删除了 If 块并添加了数据库错误页面(您可能需要从 NuGet 安装 Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore)

app.UseDatabserrorPages();

所以你的 Startup.cs 看起来像这样

app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
            
app.UseHttpsRedirection();

//Others will be Okay

然后您将在网页上看到真正的错误。对我来说是

Login failed for user IIS APPPOOL\DefaultAppPool

所以我不得不运行一个 GRANT SCRIPT。我只需要在我的 SQL Server 上运行这个脚本

IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
    CREATE LOGIN [IIS APPPOOL\DefaultAppPool] 
      FROM WINDOWS WITH DEFAULT_DATABASE=[master], 
      DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [WebDatabaseUser] 
  FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_owner', 'WebDatabaseUser'
GO

你可以看到这个链接:https://docs.microsoft.com/en-us/aspnet/web-forms/overview/deployment/visual-studio-web-deployment/deploying-to-iis

我的问题就解决了。希望这对某人有所帮助。

【讨论】:

这完全帮助我解决了我遇到的 Azure 问题...最终需要在主数据库上添加防火墙规则。 这篇文章值得关注,这也是我用来解决开发者页面问题的方法【参考方案5】:

代码中存在运行时异常。在生产模式下无法显示。以便它显示“不应在已部署的应用程序中启用开发环境,因为它可能导致向最终用户显示来自异常的敏感信息

在 web.config 文件中你会发现

<aspNetCore processPath="dotnet" arguments=".\PortfolioApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />

替换为

<aspNetCore processPath=".\Application.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
</aspNetCore>

现在您在浏览器中运行应用程序。它将显示实际的错误消息。现在是时候修复运行时异常了。

【讨论】:

【参考方案6】:

首先,当您发布在运行时引发错误的网站时,会发生此错误。因此,在出现此错误的页面中再次检查您的代码。 然后,将ASPNETCORE_ENVIRONMENT 变量的值设置为Production(而不是Development),您还应该检查布局页面并将&lt;environment"development"&gt; 更改为&lt;environment"Production"&gt;。 最后,发布您的网站。 这是在 VS2017 中测试的

【讨论】:

【参考方案7】:

这可能不是每个人的情况,但是我试图将“发布”配置部署到具有“uat”环境变量的服务器。我设置了一个 uat 配置以用于我的部署,并且在导航到我的站点 url 时不再出现该消息。长话短说,只要确保您的预期构建配置与其他人在上面提到的目标服务器匹配!

【讨论】:

【参考方案8】:

我可以摆脱开发模式消息的唯一方法是更改​​ appsettings.json 上下文 综合安全=真 指定 User Id=username;Password=password 并确保用户是 db_owner。

【讨论】:

你是对的,它说“用户 'IIS APPPOOL\XXXXX' 登录失败”,我需要为其添加一个新的登录名【参考方案9】:

我刚刚替换了这个:

    if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
            app.UseMigrationsEndPoint();
        
    else
        
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        

用这个:

     app.UseDeveloperExceptionPage();
     app.UseMigrationsEndPoint();

【讨论】:

【参考方案10】:

当您的连接字符串不正确时,您会收到此错误。当我更正我的连接字符串时,它工作正常。

例如:正确的 azure db 连接字符串

Server=Server Name;Initial Catalog=Database Name;Persist Security Info=False;User ID=DB User Name;Password=your_password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;

【讨论】:

【参考方案11】:

默认情况下,在生产中,您将看到此错误页面,除非您创建/自定义自己的页面。根据项目类型,它可以位于不同的位置,例如 Pages/Error.razor 或作为控制器操作。

【讨论】:

【参考方案12】:

对我来说,只需将 EnvironmentName 属性添加到 pubxml。

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-5.0

【讨论】:

【参考方案13】:

这是带有一般错误消息的默认错误页面。

在共享主机上部署 ASP.NET Core 3.1 MC 发布的应用程序后出现此错误。默认主页和隐私页面按预期工作,但是当我尝试打开从数据库中获取数据的页面时,显示上述错误。

错误原因: 在 appsettings.json 中,我将连接字符串 Data Source=MyPC\MSSQLSERVER14 更新为 Data Source=.\MSSQLSERVER2。我从共享主机连接字符串中复制了这个数据源“.\MSSQLSERVER2”并将其粘贴到 appsettings.json 中

解决方法:将数据源“.\MSSQLSERVER2”更改为“.\\MSSQLSERVER2”。

"ConnectionStrings": "AppCon": "Data Source=.\\MSSQLSERVER2xxx;Initial Catalog=sqldb;Persist Security Info=True;User ID=sqluser;Password=********"

【讨论】:

以上是关于ASP.NET Core 部署到 IIS 错误:不应在已部署的应用程序中启用开发环境的主要内容,如果未能解决你的问题,请参考以下文章

将 asp.net core web api 部署到 IIS 7.5 时出现 500 错误

将 ASP NET Core 部署到 IIS

ASP .NET Core IIS 部署 IIS AspNetCore 模块错误:CLR 工作线程过早退出

解决 ASP.NET Core 部署到 IIS,更新项目时"文件夹正在使用"错误

ASP.NET Core部署系列一:发布到IIS上

部署在 IIS 上的 ASP.NET Core 对长时间运行的请求返回 502 错误