0

我正在将 ASP.NET Core Web API 发布到 Azure 应用服务。我已从 Visual Studio 2022 和 Azure DevOps 管道发布。我试图了解为什么 Visual Studio 发布过程会导致与 Azure DevOps 管道不同的 web.config 文件。

我的项目确实包含一个 web.config 文件,其中包含一些请求限制。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="52428800" />
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>

当我从 Visual Studio 或 DevOps 发布时,发布过程会添加 aspNetCore 模块和<aspNetCore>元素的处理程序信息。

   <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
   </handlers>
   <aspNetCore processPath=".\DocRecService.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />

当我从 Visual Studio 发布时,元素stdoutLogFile上的位置是.<aspNetCore>"\\?\%home%\LogFiles\stdout"

当我从 DevOps 管道构建和发布时,stdoutLogFile位置是.\logs\stdout.

我相信这dotnet publish是转换 web.config 文件添加 aspNetCore 模块信息的管道中的任务。我将以下参数传递给它以生成一个独立的应用程序 --configuration Release --runtime win-x64 --output $(Build.ArtifactStagingDirectory)

web.config文档指出:

将应用部署到 Azure 应用服务时,stdoutLogFile 路径设置为 \?%home%\LogFiles\stdout。

但我找不到任何解释什么是/应该设置该值。什么是设置值?如何在我的 Azure DevOps 管道中或 Visual Studio 之外模仿这种行为?发布配置文件中是否有 DevOps 管道未使用的内容?我的主要目标只是更好地理解这个过程。

4

1 回答 1

1

但我找不到任何解释什么是/应该设置该值。什么是设置值?

仅建议在 IIS 上托管或使用Visual Studio 对 IIS 的开发时支持时使用标准输出日志来解决应用程序启动问题,而不是在本地调试和使用 IIS Express 运行应用程序时。

如果设置了元素的stdoutLogEnabledstdoutLogFile属性,则ASP.NET Core 模块将 stdout 和 stderr 控制台输出重定向到磁盘。aspNetCore路径中的任何文件夹stdoutLogFile都是在创建日志文件时由模块创建的。应用程序池必须对写入日志的位置具有写入权限(用于IIS AppPool\{APP POOL NAME}提供写入权限,其中占位符{APP POOL NAME}为应用程序池名称)。

不要将标准输出日志用于一般应用程序日志记录目的。对于 ASP.NET Core 应用程序中的例行日志记录,请使用限制日志文件大小和轮换日志的日志记录库。有关详细信息,请参阅第三方日志记录提供程序

为 Azure 应用服务部署发布应用时,Web SDK 将stdoutLogFile值设置为\\?\%home%\LogFiles\stdout. %home环境变量是为 Azure 应用服务托管的应用预定义的。

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

以下示例aspNetCore元素.\log\通过确认 AppPool 用户身份有权写入所提供的路径来在相对路径上配置 stdout 日志记录。

路径中的任何文件夹(logs在前面的示例中)都是由模块在创建日志文件时创建的。应用程序池必须对写入日志的位置具有写入权限(用于IIS AppPool\{APP POOL NAME}提供写入权限,其中占位符{APP POOL NAME}为应用程序池名称)。

当您使用Visual Studio管道发布时,默认添加的 web.config 是不同的。

当您从管道部署时,它还会添加到 Azure 资源的 Configuration -> ApplicationSettings,值为 1。您甚至无法使用 KUDU 手动编辑配置此配置的 web.config。WEBSITE_RUN_FROM_PACKAGE

要更新web.config,请将上述配置设置设置为 0,但它也会自动将 stdoutLogFile 的值从 ".\logs\stdout" 更改为 " \?%home%\LogFiles\stdout"。如果您启用了日志记录,您还会注意到 wwwroot 中的 Logs 文件夹。

于 2021-11-18T03:20:44.803 回答