.NET 运行时

.NET 运行时是负责安装应用代码和依赖项,然后在柔性环境中运行该应用的软件栈。

.NET 版本 6 及更高版本使用 buildpack 构建,要求您在 app.yaml 文件中选择操作系统。例如,如需使用 .NET 8,您必须将 Ubuntu 22 指定为操作系统。

如需查看受支持的 .NET 版本及其对应 Ubuntu 版本的完整列表,请参阅运行时支持时间表

选择 .NET 版本

新运行时版本

对于 .NET 版本 6 版及更高版本,您必须在 app.yaml 文件中添加 runtime_configoperating_system 设置以指定操作系统。

如需使用新版本,您必须执行以下操作:

  • 更新项目文件。

    <Project Sdk="Microsoft.NET.Sdk.Web">
    
      <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
      </PropertyGroup>
    
      <ItemGroup>
        <None Update="app.yaml">
          <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        </None>
      </ItemGroup>
    
    </Project>
    

    如需了解详情,请参阅从 ASP.NET Core 3.1 迁移到 6.0

  • 安装 gcloud CLI 420.0.0 版或更高版本。您可以通过运行 gcloud components update 命令来更新 CLI 工具。如需查看已安装的版本,您可以运行 gcloud version 命令。

  • app.yaml 文件中指定 operating_system 设置:

      runtime: aspnetcore
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
    

(可选)您可以通过在 app.yaml 文件中添加 runtime_version 设置来指定运行时版本。默认情况下,如果未指定 runtime_version 设置,App Engine 会使用最新可用的 LTS .NET 版本。例如,在 Ubuntu 22 上指定 .NET8 时,app.yaml 文件如下所示:

    runtime: aspnetcore
    env: flex

    runtime_config:
        runtime_version: "8"
        operating_system: "ubuntu22"

过往运行时版本

如需定位特定的 .NET SDK 版本,请更新项目文件。如需了解详情,请参阅从 ASP.NET Core 3.1 迁移到 6.0

如果您要使用 GKE 或其他 Docker 主机,则需要创建一个 Dockerfile,以复制应用代码并安装依赖项。如需了解详情,请参阅自定义运行时

部署 App Engine 应用

如需部署 .NET 应用,请执行以下操作:

从您的应用所在的根目录运行以下命令:

v6 及更高版本

    gcloud app deploy

v3.1 及更低版本

    dotnet restore
    dotnet publish -c Release
    gcloud app deploy

HTTPS 和转发代理

App Engine 会在负载平衡器上终止 HTTPS 连接,并将请求转发给应用。应用可以检查 X-Forwarded-Proto 来获悉原始协议是 HTTP 还是 HTTPS。

某些应用还需要确定用户的 IP 地址。该地址可在标准 X-Forwarded-For 标头中获取。

扩展运行时

柔性环境 .NET 运行时可用于创建自定义运行时。 自定义运行时是通过 Dockerfile 配置的。

您可以根据需要自定义 Dockerfile.dockerignore。最后,您将需要在 app.yaml 文件中指定 runtime: custom,而不是 runtime: aspnetcore。如需了解详情,请参阅自定义 .NET 运行时

环境变量

以下环境变量由运行时环境设置:

环境变量 说明
GAE_INSTANCE 当前实例的名称。
GAE_MEMORY_MB 可供应用进程使用的内存量。
GAE_SERVICE 在应用的 app.yaml 文件中指定的服务名称,如果未指定服务名称,则设置为 default
GAE_VERSION 当前应用的版本标签。
GOOGLE_CLOUD_PROJECT 与您的应用关联的项目 ID,可在 Google Cloud 控制台中查看
PORT 将接收 HTTP 请求的端口。

您可以使用 appsettings.json 设置其他配置变量。

元数据服务器

应用的每个实例都可以使用 Compute Engine 元数据服务器来查询有关实例的信息,包括实例的主机名、外部 IP 地址、实例 ID、自定义元数据和服务账号信息。App Engine 不允许为每个实例设置自定义元数据,但您可以设置项目级的自定义元数据,并从 App Engine 和 Compute Engine 实例中读取这些元数据。

此示例函数使用元数据服务器来获取实例的外部 IP 地址:

var client = new HttpClient();
client.DefaultRequestHeaders.Add("Metadata-Flavor", new[] { "Google" });
response = await client.GetStringAsync(
    "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip");