项目

本文档有多个版本。请选择最适合您的选项。

UI
Database
Tiered

IIS 部署

本文档假设您更喜欢使用 Angular 作为 UI 框架,并使用 Entity Framework Core 作为数据库提供程序。如需其他选项,请更改本文档顶部的偏好设置。

先决条件

  • 一台已准备好用于部署的 IIS 服务器。
  • 安装 hosting bundle
  • Entity Framework Core 数据库必须已准备就绪,可供您的项目使用。
  • 如果您想在本地环境中发布,本指南将使用 mkcert 创建自签名证书。请按照 安装指南 安装 mkcert。

生成身份验证证书

如果您正在使用 OpenIddict,则需要生成一个身份验证证书。您可以在 HttpApi.Host 文件夹中执行此命令。

dotnet dev-certs https -v -ep authserver.pfx -p 00000000-0000-0000-0000-000000000000

00000000-0000-0000-0000-000000000000 是证书的密码,您可以将其更改为您想要的任何密码。

创建发布文件

您可以在项目根文件夹中执行此命令。

dotnet publish ./src/Volo.Sample.DbMigrator/Volo.Sample.DbMigrator.csproj -c Release -o ./publish/dbmigrator # 替换为您的项目名称
cd angular && yarn build:prod --output-path ../publish/angular && cd ..
dotnet publish ./aspnet-core/src/Volo.Sample.HttpApi.Host/Volo.Sample.HttpApi.Host.csproj -c Release -o ./publish/apihost # 替换为您的项目名称

使用您的自定义设置运行 DbMigrator

使用您的域名更新连接字符串和 OpenIddict 部分。运行 DbMigrator 应用程序。

例如,在一个分层式 MVC 项目中。

{
  "ConnectionStrings": {
    "Default": "Server=volo.sample;Database=Sample;User Id=sa;Password=1q2w3E**;TrustServerCertificate=true"
  },
  "Redis": {
    "Configuration": "volo.sample"
  },
  "OpenIddict": {
    "Applications": {
      "Sample_Web": {
        "ClientId": "Sample_Web",
        "ClientSecret": "1q2w3e*",
        "RootUrl": "https://web.sample"
      },
      "Sample_Swagger": {
        "ClientId": "Sample_Swagger",
        "RootUrl": "https://api.sample"
      }
    }
  }
}

准备本地部署

如果您打算在具有真实域名的服务器上部署,可以跳过此部分。

使用 mkcert 创建自签名证书

您可以在命令提示符中执行此命令。

cd Desktop # 或其他路径
mkcert -pkcs12 auth.sample api.sample web.sample # 替换为您的域名  

将创建的文件扩展名重命名为 ".pfx"

将证书导入 IIS

导入证书

将域名添加到 hosts 文件

将域名添加到 hosts 文件(在 Windows 中:C:\Windows\System32\drivers\etc\hosts,在 Linux 和 macOS 中:/etc/hosts)。

例如,在一个分层式 MVC 项目中。

127.0.0.1 auth.sample
127.0.0.1 api.sample
127.0.0.1 web.sample

在 IIS 上发布应用程序

更新 appsettings

根据您的项目类型和域名更新 appsettings。

例如,在一个分层式 MVC 项目中。

//AuthServer
{
  "App": {
    "SelfUrl": "https://auth.sample",
    "CorsOrigins": "https://api.sample,https://web.sample",
    "RedirectAllowedUrls": "https://api.sample,https://web.sample",
    "DisablePII": "false"
  },
  "ConnectionStrings": {
    "Default": "Server=volo.sample;Database=Sample;User Id=sa;Password=1q2w3E**;TrustServerCertificate=true"
  },
  "AuthServer": {
    "Authority": "https://auth.sample",
    "RequireHttpsMetadata": "true"    
  },
  "StringEncryption": {
    "DefaultPassPhrase": "f9uRkTLdtAZLmlh3"
  },
  "Redis": {
    "Configuration": "volo.sample"
  }
}
//HttpApi.Host
{
  "App": {
    "SelfUrl": "https://api.sample",
    "CorsOrigins": "https://web.sample",
    "DisablePII": "false",
    "HealthCheckUrl": "/health-status"
  },
  "ConnectionStrings": {
    "Default": "Server=volo.sample;Database=Sample;User Id=sa;Password=1q2w3E**;TrustServerCertificate=true"
  },
  "Redis": {
    "Configuration": "volo.sample"
  },
  "AuthServer": {
    "Authority": "https://auth.sample",
    "RequireHttpsMetadata": "true",
    "SwaggerClientId": "Sample_Swagger"
  },
  "StringEncryption": {
    "DefaultPassPhrase": "f9uRkTLdtAZLmlh3"
  }
}
//Web
{
  "App": {
    "SelfUrl": "https://web.sample",
    "DisablePII": "false"
  },
  "RemoteServices": {
    "Default": {
      "BaseUrl": "https://api.sample/"
    },
    "AbpAccountPublic": {
      "BaseUrl": "https://auth.sample/"
    }
  },
  "Redis": {
    "Configuration": "volo.sample"
  },
  "AuthServer": {
    "Authority": "https://auth.sample",
    "RequireHttpsMetadata": "true",
    "ClientId": "Sample_Web",
    "ClientSecret": "1q2w3e*"
  },
  "StringEncryption": {
    "DefaultPassPhrase": "f9uRkTLdtAZLmlh3"
  }
}

复制 .pfx 文件

您需要将 pfx 文件从 ./src/HttpApi.Host 复制到 ./publish/apihost 文件夹。

发布应用程序

您可以从 IIS 添加为网站。

对于 apihost,我们需要将创建网站的应用程序池中的加载用户配置文件设置为 true。

加载用户配置文件

对于本地部署,添加网站时选择 SSL 证书。

SSL 证书选择

最终结果应如下所示(取决于您的项目类型)。

IIS 部署

我们可以从浏览器访问网站。

分层式 IIS 部署

重写 getEnvConfig

请将以下重写规则添加到您的 web.config 文件中,以将 getEnvConfig 的请求重定向到 dynamic-env.json

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
 <rewrite>
  <rules>
    <rule name="Redirect" stopProcessing="true">
      <match url="getEnvConfig" />
      <action type="Redirect" url="dynamic-env.json" />
    </rule>
    <rule name="Angular Routes" stopProcessing="true">
      <match url=".*" />
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
      </conditions>
      <action type="Rewrite" url="./index.html" />
    </rule>
  </rules>
 </rewrite>
</system.webServer>
</configuration>

详情请参阅 Angular RemoteEnvironment

修复 405 Method Not Allowed 错误

Web.config 文件中移除 WebDAV 模块和处理程序。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <modules>
      <remove name="WebDAVModule" />
    </modules>
    <handlers>
      <remove name="WebDAV" />
    </handlers>
  </system.webServer>
</configuration>

如果未使用,请同时从计算机中移除 WebDAV Publishing 功能。为此,请按照以下步骤操作:

  1. 选择“开始”,在“开始搜索”框中键入“打开或关闭 Windows 功能”,然后选择“打开或关闭 Windows 功能”。
  2. 在“Windows 功能”窗口中,展开“Internet Information Services” -> “World Wide Web Services” -> “Common HTTP Features”。
  3. 取消选中“WebDAV Publishing”功能。

参阅:

将应用程序作为 IIS 子应用程序发布

如果您的 MVC 应用程序是一个子应用程序,则需要将 AbpThemingOptionsBaseUrl 属性设置为子应用程序的路径。BaseUrl 用于配置布局页面 head 部分中的 base 元素。

public void ConfigureServices(IServiceCollection services)
{
    Configure<AbpThemingOptions>(options =>
    {
        options.BaseUrl = "/myapp/";
    });
}
<html>
  <head>
    <base href="/myapp/" />
    ...
  </head>
  <body>
    ...
  </body>
</html>

对于 Blazor 应用程序,您可以在 App.razor 文件中设置 base 标签,而不是配置 AbpThemingOptions

如何获取 stdout 日志

如果您的应用程序在 IIS 上运行并遇到 502.5500.3x 等错误,可以启用 stdout 日志来查看错误详情。

要启用并查看 stdout 日志:

  1. 导航到宿主系统上的站点部署文件夹。
  2. 如果 logs 文件夹不存在,请创建该文件夹。有关如何使 MSBuild 在部署中自动创建 logs 文件夹的说明,请参阅 Directory structure 主题
  3. 编辑 web.config 文件。将 stdoutLogEnabled 设置为 true,并将 stdoutLogFile 路径更改为指向 logs 文件夹(例如,.\logs\stdout)。路径中的 stdout 是日志文件名前缀。创建日志时,会自动添加时间戳、进程 ID 和文件扩展名。使用 stdout 作为文件名前缀,典型的日志文件被命名为 stdout_20180205184032_5412.log
  4. 确保您的应用程序池身份对 logs 文件夹具有写入权限。
  5. 保存更新后的 web.config 文件。
  6. 向应用程序发出请求。
  7. 导航到 logs 文件夹。找到并打开最新的 stdout 日志。

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

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

参考:

IIS 日志创建和重定向

在 Azure App Service 和 IIS 上对 ASP.NET Core 进行故障排除

下一步?

在本文档中