使用 Web Deploy 在 Azure 中部署普通的 ASP.NET Core 2.2 Web 应用程序会引发错误

Posted

技术标签:

【中文标题】使用 Web Deploy 在 Azure 中部署普通的 ASP.NET Core 2.2 Web 应用程序会引发错误【英文标题】:Deploying a plain ASP.NET Core 2.2 Web App in Azure using Web Deploy is throwing an error 【发布时间】:2019-05-12 18:58:30 【问题描述】:

我通过 Visual Studio 2017 中的 Publish 屏幕使用 Azure 发布了一个 ASP.NET Core Web 应用程序。我使用了所有默认值,尽管我的应用程序使用迁移,所以我不得不告诉它在发布配置文件中运行它们。

但是,当我尝试访问该站点时,我得到:

由于发生内部服务器错误,页面无法显示。

我觉得我需要处理连接字符串和ASPNETCORE_ENVIRONMENT 变量。

我仍然拥有您在创建新的 ASP.NET Core Web 应用程序时获得的默认 appsettings.jsonappsettings.Development.jsonappsettings.json 指向我的本地开发数据库,​​appsettings.Development.json 指向发布配置文件中的 Azure 数据库。

或者发布配置文件会自动处理连接字符串,而我不必执行上述任何操作?

【问题讨论】:

【参考方案1】:

默认情况下,ASP.NET Core 2.2 应用配置为使用新的进程内托管模型。直到 2018 年 12 月的某个时候,它才会在所有区域的 Azure 上提供。他们提到它here。

目前的解决方案是在 Web 应用的 .csproj 文件顶部添加以下内容:

  <PropertyGroup>
    <AspNetCoreModuleName>AspNetCoreModule</AspNetCoreModuleName>
    <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
  </PropertyGroup>

【讨论】:

谢谢,这个答案对我有帮助。【参考方案2】:

您可以在服务的Application settings 部分检查和设置您的应用设置和连接字符串:

【讨论】:

我注意到了这一点。我想知道这可能是我错误的原因。但是在这个docs.microsoft.com/en-us/aspnet/core/tutorials/… 中,他们不对环境变量做任何事情,所以我假设发布配置文件会处理它。知道如何解决错误吗?现在还有日志吗?创建数据库是如此奇怪,架构也是如此,但我在 program.cs 中的种子函数不能运行或出错,因为没有数据。 有一个log stream 可以读取应用程序日志,但应先启用它。您也可以尝试在Application Settings 中启用Remote Debugging 并使用您的VS 进行调试。 启用日志:docs.microsoft.com/en-us/azure/app-service/… 您还可以在文档的下一部分找到位置。 通过日志记录我发现了我的错误:处理程序“aspNetCore”的模块列表中有一个错误的模块“AspNetCoreModuleV2”。我认为它与: InProcess in .net core 2.2 有关【参考方案3】:

一个简单的解决方案是将 azure-db 连接字符串放入 appsettings.json 而不是 appsettings.Development.json

在 VS2017 中运行默认生成的 asp.net 核心应用程序时,您可以在 Properties 文件夹中找到 launchSettings.Json 文件,其中包含将在本地运行的配置文件。 在配置文件部分下,您可以看到 ASPNETCORE_ENVIRONMENT 属性设置为 Development

"WebApp": 
  "commandName": "Project",
  "launchBrowser": true,
  "applicationUrl": "http://localhost:5000",
  "environmentVariables": 
    "ASPNETCORE_ENVIRONMENT": "Development"
  

这意味着如果您在 appsettings.Development.json 中定义本地数据库连接字符串,它将在本地运行时使用其连接字符串。

如果您未定义 ASPNETCORE_ENVIRONMENT 属性,则运行时将仅使用 appsettings.json 值(运行时会将 ASPNETCORE_ENVIRONMENT 设置为 Production 作为默认值,但如果您没有定义了任何appsettings.Production.json,那么只会使用appSettings.json 中的值)。

因此,在运行 Azure Web App 时,如果将 azure-db 连接字符串放在 appsettings.json 中,则根本不需要指定 ASPNETCORE_ENVIRONMENT

【讨论】:

好的,我试试这个。但是,我有点好奇为什么在简单的教程中:docs.microsoft.com/en-us/aspnet/core/tutorials/… 他们根本不使用连接字符串。实际上,我只是一步一步地按照教程使用了一个全新的应用程序,唯一不同的是更改 DefaultConnection 以指向我的本地 sql server 实例,而不是默认的 LocalDb。我发布到 Azure 仍然是同样的错误。 我按照你说的做了,并从发布配置文件中取出了天蓝色的连接字符串,并将其放入 appsettings.json 并重新部署。仍然出现:由于发生内部服务器错误,无法显示页面。 启用日志记录后,我发现我的错误:处理程序“aspNetCore”的模块列表中有一个错误模块“AspNetCoreModuleV2”。我认为这与 .net core 2.2 中的 InProcess 有关 @BlakeRivell 看起来像个bug github.com/aspnet/Templating/issues/837,你有最新的asp.net core sdk 吗?升级VS并尝试重做步骤 @BlakeRivell 如果您检查 .net core 2.2 版本,“Azure 应用服务中的可用性”部分blogs.msdn.microsoft.com/webdev/2018/12/04/…。看起来您可以从 web.config 中删除 AspNetCoreHostingModel 标记。您可以通过编辑荣誉来手动完成。输入 yoursite.scm.azurewebsites.net 进入,然后进入根目录并编辑 web 配置文件【参考方案4】:

我将 AspNet Core 3.0 网站部署到 Azure 并收到 HTTP 500 服务器错误。

这是在 web.config 中:

<system.webServer>
  <handlers>
    <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
  </handlers>
  <aspNetCore processPath="dotnet" arguments=".\BedtimeWeb.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
</system.webServer>

我将 AspNetCoreModuleV2 更改为 AspNetCoreModule,然后错误变为 HTTP 502.3。

然后我删除了 hostingModel="InProcess" 属性,然后网站开始正常运行。

【讨论】:

以上是关于使用 Web Deploy 在 Azure 中部署普通的 ASP.NET Core 2.2 Web 应用程序会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

VSTS Web Deploy参数产生错误

将更改部署到 azure 时,sqitch deploy 命令失败

azurew网站持续部署 - Web Deploy无法修改目标上的文件“XXX”,因为它已被外部进程锁定

ng run project:deploy - 项目目标不存在

在 Azure 应用服务上部署 Spring Boot jar

使用 git deploy 进行 Azure 网站远程调试不起作用