添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
坚强的打火机  ·  qt ...·  5 月前    · 
苦闷的围巾  ·  python - Anaconda : ...·  1 年前    · 
重情义的冲锋衣  ·  WebPreferences.JavaScr ...·  1 年前    · 

Azure Functions 版本 4.x 向后高度兼容版本 3.x。 大多数应用应该能够安全地升级到 4.x,而无需对代码进行重大更改。 有关 Functions 运行时版本的详细信息,请参阅 Azure Functions 运行时版本概述

从 2022 年 12 月 13 日开始,在 Azure Functions 运行时 2.x 和 3.x 版本上运行的函数应用的外延支持已结束 (EOL)。

截止日期过后,可以从 CI/CD DevOps 管道创建和部署函数应用,所有现有应用将继续运行而不会出现中断性变更。 但是,你的应用不符合新功能、安全补丁和性能优化的条件。 你将获得相关的服务支持,前提是将它们升级到 4.x 版本。

之所以不再支持这些运行时版本,是因为不再支持这些更旧的运行时版本所需的 .NET Core 3.1。 此要求影响 Azure Functions 支持的所有语言

强烈建议按照本文的说明将函数应用迁移到 Functions 运行时的 4.x 版。

需要 .NET Framework 的 C# 函数应用仍支持 Functions 版本 1.x。 预览版支持现已在 Functions 4.x 中提供,用于 在 .NET Framework 4.8 上运行 C# 函数

本文将指导你完成安全迁移函数应用以在 Functions 运行时版本 4.x 上运行的过程。 由于项目升级说明与语言相关,因此请务必从 文章顶部 的选择器中选择你的开发语言。

选择目标 .NET

在 Functions 运行时版本 3.x 上,C# 函数应用面向 .NET Core 3.1。 将函数应用迁移到版本 4.x 时,可以选择 .NET 的目标版本。 可以将 C# 项目升级到以下 .NET 版本之一,所有这些版本都可以在 Functions 版本 4.x 上运行:

.NET 版本 进程模型 *

* 仅 .NET 的长期支持 (LTS) 版本支持 进程内执行 。 标准条款支持 (STS) 版本和 .NET Framework 都是受支持的 .NET Azure Functions 独立工作进程

在 Functions 运行时版本 3.x 上,如果你使用的是 .NET 5,建议升级到 .NET 7。 如果使用的是 .NET Core 3.1,建议升级到 .NET 6(进程内)以获得快速升级路径。

如果希望迁移到长期支持 (LTS) .NET 版本,建议升级到 .NET 6。

迁移到 .NET 独立工作进程模型以获得 Azure Functions .NET 独立工作进程提供的所有权益。 有关 .NET 独立工作进程优势的详细信息,请参阅 .NET 独立工作进程增强功能 。 有关 .NET 版本支持的详细信息,请参阅 支持的版本

从 .NET Core 3.1 升级到进程内运行的 .NET 6 需要对项目进行轻微的更新,但对于代码几乎不需要进行任何更新。 切换到独立工作进程模型需要对代码进行更改,但这样可以灵活轻松地在将来任何版本的 .NET 上运行。 有关两个进程模型之间的特性和功能比较,请参阅 进程内和独立工作进程 .NET Azure Functions 之间的差异

在将应用升级到 Functions 运行时版本 4.x 之前,应执行以下任务:

  • 查看 3.x 和 4.x 之间的中断性变更 列表。
  • 运行升级前验证程序
  • 使用 Azure PowerShell 识别当前 Azure 订阅中的 v2 和 v3 函数应用的列表。
  • 如果可能,请 将本地项目环境升级到版本 4.x 。 使用 Azure Functions Core Tools 版本 4.x 在本地全面测试应用。
  • 将 Azure 中的函数应用升级到新版本。 如果需要最大程度地减少停机时间,请考虑使用 过渡槽 在新运行时版本上测试和验证 Azure 中迁移的应用。 然后,可以将具有更新的版本设置的应用部署到生产槽。 有关详细信息,请参阅 使用槽进行迁移
  • 将迁移的项目重新发布到升级的函数应用。 使用 Visual Studio 将版本 4.x 项目发布到较低版本的现有函数应用时,系统会提示让 Visual Studio 在部署期间将该函数应用升级到版本 4.x。 此升级使用 在不使用槽的情况下迁移 中定义的相同过程。
  • 运行升级前验证程序

    Azure Functions 提供升级前验证程序,用于帮助识别将函数应用迁移到 4.x 时的潜在问题。 运行升级前验证程序:

  • Azure 门户 中,导航到你的函数应用。

  • 打开“诊断和解决问题”页。

  • 在“Function App 诊断”中,开始键入 Functions 4.x Pre-Upgrade Validator ,然后从列表中选择它。

  • 验证完成后,请查看建议并解决应用中的任何问题。 如果需要对应用进行更改,请确保 在本地使用 Azure Functions Core Tools v4 或通过 使用过渡槽 来验证针对 Functions 运行时版本 4.x 的更改。

    确定要升级的函数应用

    使用以下 PowerShell 脚本,在订阅中生成当前面向版本 2.x 或 3.x 的函数应用的列表:

    $Subscription = '<YOUR SUBSCRIPTION ID>' Set-AzContext -Subscription $Subscription | Out-Null $FunctionApps = Get-AzFunctionApp $AppInfo = @{} foreach ($App in $FunctionApps) if ($App.ApplicationSettings["FUNCTIONS_EXTENSION_VERSION"] -like '*3*') $AppInfo.Add($App.Name, $App.ApplicationSettings["FUNCTIONS_EXTENSION_VERSION"]) $AppInfo

    升级本地项目

    升级指令依赖于语言。 如果没有看到你使用的语言,请通过 文章顶部 的选择器选择它。

    选择与目标版本的 .NET 和所需进程模型匹配的选项卡(进程内或独立工作进程)。

    .csproj 文件

    以下示例是在版本 3.x 上使用 .NET Core 3.1 的 .csproj 项目文件:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <AzureFunctionsVersion>v3</AzureFunctionsVersion>
      </PropertyGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.13" />
      </ItemGroup>
      <ItemGroup>
        <Reference Include="Microsoft.CSharp" />
      </ItemGroup>
      <ItemGroup>
        <None Update="host.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
        <None Update="local.settings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
          <CopyToPublishDirectory>Never</CopyToPublishDirectory>
        </None>
      </ItemGroup>
    </Project>
    

    使用以下过程之一将此 XML 文件更新为在 Functions 版本 4.x 中运行:

    .NET 6(进程内) .NET 6(独立) .NET 7
  • 更改 PropertyGroup 的值。将 TargetFramework 指定为 net6.0

  • 更改 PropertyGroup 的值。将 AzureFunctionsVersion 指定为 v4

  • 替换现有 ItemGroupPackageReference 列表,包含以下 ItemGroup

    <ItemGroup> <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.2.0" /> </ItemGroup>

    进行这些更改后,更新的项目应如以下示例所示:

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> <RootNamespace>My.Namespace</RootNamespace> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.1" /> </ItemGroup> <ItemGroup> <None Update="host.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Update="local.settings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </None> </ItemGroup> </Project>
  • 更改 PropertyGroup 的值。将 TargetFramework 指定为 net6.0

  • 更改 PropertyGroup 的值。将 AzureFunctionsVersion 指定为 v4

  • 将以下 OutputType 元素添加到 PropertyGroup

    <OutputType>Exe</OutputType>
  • 替换现有 ItemGroupPackageReference 列表,包含以下 ItemGroup

    <ItemGroup> <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.18.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.12.0" /> </ItemGroup>
  • 添加以下新的 ItemGroup

    <ItemGroup> <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext"/> </ItemGroup>

    进行这些更改后,更新的项目应如以下示例所示:

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> <RootNamespace>My.Namespace</RootNamespace> <OutputType>Exe</OutputType> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.6.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.3.0" /> </ItemGroup> <ItemGroup> <None Update="host.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Update="local.settings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </None> </ItemGroup> <ItemGroup> <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext"/> </ItemGroup> </Project>
  • 更改 PropertyGroup 的值。将 TargetFramework 指定为 net7.0

  • 更改 PropertyGroup 的值。将 AzureFunctionsVersion 指定为 v4

  • 将以下 OutputType 元素添加到 PropertyGroup

    <OutputType>Exe</OutputType>
  • 替换现有 ItemGroupPackageReference 列表,包含以下 ItemGroup

    <ItemGroup> <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.18.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.12.0" /> </ItemGroup>
  • 添加以下新的 ItemGroup

    <ItemGroup> <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext"/> </ItemGroup>

    进行这些更改后,更新的项目应如以下示例所示:

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net7.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> <RootNamespace>My.Namespace</RootNamespace> <OutputType>Exe</OutputType> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.8.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.7.0" /> </ItemGroup> <ItemGroup> <None Update="host.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Update="local.settings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </None> </ItemGroup> <ItemGroup> <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext"/> </ItemGroup> </Project>

    program.cs 文件

    迁移项目以在独立工作进程中运行时,必须将以下 program.cs 文件添加到项目:

    .NET 6(进程内) .NET 6(独立) .NET 7 "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "AzureWebJobsStorageConnectionStringValue", "FUNCTIONS_WORKER_RUNTIME": "dotnet" "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "AzureWebJobsStorageConnectionStringValue", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "AzureWebJobsStorageConnectionStringValue", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"

    命名空间更改

    在独立工作进程中运行的 C# 函数使用不同命名空间中的库,而不是在进程内运行时使用的那些库。 进程内库通常位于命名空间 Microsoft.Azure.WebJobs.* 中。 独立工作进程函数应用使用命名空间 Microsoft.Azure.Functions.Worker.* 中的库。 可以在以下 usingHTTP 触发器模板示例中查看这些命名空间更改对 语句的影响。

    由于进程内和独立工作进程 API 之间有差异,某些关键类会更改名称。

    下表列出了 Functions 使用的、在从进程内迁移时可能会更改的关键 .NET 类:

    .NET Core 3.1 .NET 6(进程内) .NET 6(独立) .NET 7

    绑定中也可能存在类名差异。 有关详细信息,请参阅特定绑定的参考文章。

    HTTP 触发器模板

    在 HTTP 触发的函数中可以看到进程内和隔离工作进程之间的差异。 版本 3.x(进程内)的 HTTP 触发器模板如以下示例所示:

    using System; using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace Company.Function public static class HttpTriggerCSharp [FunctionName("HttpTriggerCSharp")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.AuthLevelValue, "get", "post", Route = null)] HttpRequest req, ILogger log) log.LogInformation("C# HTTP trigger function processed a request."); string name = req.Query["name"]; string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic data = JsonConvert.DeserializeObject(requestBody); name = name ?? data?.name; string responseMessage = string.IsNullOrEmpty(name) ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response." : $"Hello, {name}. This HTTP triggered function executed successfully."; return new OkObjectResult(responseMessage);

    迁移后的版本的 HTTP 触发器模板如以下示例所示:

    .NET 6(进程内) .NET 6(独立) .NET 7 using System.Net; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; namespace Company.Function public class HttpTriggerCSharp private readonly ILogger _logger; public HttpTriggerCSharp(ILoggerFactory loggerFactory) _logger = loggerFactory.CreateLogger<HttpTriggerCSharp>(); [Function("HttpTriggerCSharp")] public HttpResponseData Run([HttpTrigger(AuthorizationLevel.AuthLevelValue, "get", "post")] HttpRequestData req) _logger.LogInformation("C# HTTP trigger function processed a request."); var response = req.CreateResponse(HttpStatusCode.OK); response.Headers.Add("Content-Type", "text/plain; charset=utf-8"); response.WriteString("Welcome to Azure Functions!"); return response; using System.Net; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; namespace Company.Function public class HttpTriggerCSharp private readonly ILogger _logger; public HttpTriggerCSharp(ILoggerFactory loggerFactory) _logger = loggerFactory.CreateLogger<HttpTriggerCSharp>(); [Function("HttpTriggerCSharp")] public HttpResponseData Run([HttpTrigger(AuthorizationLevel.AuthLevelValue, "get", "post")] HttpRequestData req) _logger.LogInformation("C# HTTP trigger function processed a request."); var response = req.CreateResponse(HttpStatusCode.OK); response.Headers.Add("Content-Type", "text/plain; charset=utf-8"); response.WriteString("Welcome to Azure Functions!"); return response;
  • 如果需要,请迁移到版本 4.x 支持的 Java 版本之一。

  • 更新应用的 POM.xml 文件以将 FUNCTIONS_EXTENSION_VERSION 设置修改为 ~4,如以下示例所示:

    <configuration>
        <resourceGroup>${functionResourceGroup}</resourceGroup>
        <appName>${functionAppName}</appName>
        <region>${functionAppRegion}</region>
        <appSettings>
            <property>
                <name>WEBSITE_RUN_FROM_PACKAGE</name>
                <value>1</value>
            </property>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~4</value>
            </property>
        </appSettings>
    </configuration>
    

    在 Azure 中升级函数应用

    在发布迁移的项目之前,需要将 Azure 中函数应用主机的运行时升级到版本 4.x。 Functions 主机使用的运行时版本由 FUNCTIONS_EXTENSION_VERSION 应用程序设置控制,但在某些情况下,还必须更新其他设置。 代码更改和应用程序设置更改都需要重启函数应用。

    最简单的方法是不使用槽进行升级,然后重新发布应用项目。 也可以使用槽进行升级,以最大程度地减少应用中的停机时间并简化回滚。

    不使用槽进行升级

    升级到 v4.x 的最简单方法是在 Azure 中将函数应用上的 FUNCTIONS_EXTENSION_VERSION 应用程序设置设为 ~4。 必须在带有槽的站点上执行其他过程

    Azure CLI Azure PowerShell

    在 Windows 上运行时,还需要启用运行时版本 4.x 所需的 .NET 6.0。

    az functionapp config set --net-framework-version v6.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
    

    Windows 上运行的任何语言的函数应用都需要 .NET 6。

    在 Windows 上运行时,还需要启用运行时版本 4.x 所需的 .NET 6.0。

    Set-AzWebApp -NetFrameworkVersion v6.0 -Name <APP_NAME> -ResourceGroupName <RESOURCE_GROUP_NAME>
    

    Windows 上运行的任何语言的函数应用都需要 .NET 6。

    你还可能需要更新 linuxFxVersion 站点设置以面向特定语言版本。 如果已设置正确的 linuxFxVersion 值,则可以跳过此步骤。 有关详细信息,请参阅有效的 linuxFxVersion

    在 Functions 4.x 发布之前,Linux 上不支持 PowerShell 应用。 这一事实意味着无需升级 Linux 上运行的 PowerShell 函数应用。

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "DOTNET|6.0"
    

    如果你要迁移到 .NET Functions 独立工作进程,请对 --linux-fx-version 使用 DOTNET-ISOLATED|6.0DOTNET-ISOLATED|7.0

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Java|11"
    

    --linux-fx-version 值必须与目标 Java 版本匹配。

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Node|16"
    

    --linux-fx-version 值必须与目标 Node.js 版本匹配。

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Python|3.9"
    

    --linux-fx-version 值必须与目标 PowerShell 版本匹配。

    在本例中,请将 <APP_NAME> 替换为函数应用的名称,并将 <RESOURCE_GROUP_NAME> 替换为资源组的名称。

    现可重新发布已迁移为在版本 4.x 上运行的应用项目。

    使用槽进行升级

    使用部署槽是将函数应用从旧版本升级到 v4.x 运行时的好办法。 通过使用过渡槽,可以在过渡槽中的新运行时版本上运行应用,并在验证后切换到生产槽。 这些槽还提供一种在升级期间最大程度地缩短停机时间的方法。 如果需要最大程度地缩短停机时间,请按照最短停机时间升级中的步骤操作。

    在升级槽中验证应用后,可以将应用和新版本设置切换到生产槽。 此切换需要在生产槽中包含设置 WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0。 添加此设置的方式会影响升级所需的停机时间。

    如果启用了槽的函数应用可以处理一次完整重启的停机时间,那么你可以直接在生产槽中更新 WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS 设置。 由于直接在生产槽中更改此设置会导致重启,从而影响可用性,因此请考虑在流量减少时执行此更改。 然后,可以从过渡槽中切换升级的版本。

    Update-AzFunctionAppSetting PowerShell cmdlet 当前不支持这些槽。 你必须使用 Azure CLI 或 Azure 门户。

  • 使用以下命令在生产槽中设置 WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0

    az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0  -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> 
    

    在本例中,请将 <APP_NAME> 替换为函数应用的名称,并将 <RESOURCE_GROUP_NAME> 替换为资源组的名称。 此命令会导致在生产槽中运行的应用重启。

  • 同样,使用以下命令在过渡槽中设置 WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS

    az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  • 使用以下命令更改 FUNCTIONS_EXTENSION_VERSION 并将过渡槽升级到新的运行时版本:

    az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  • 在 Windows 中,Functions 运行时版本 4.x 需要 .NET 6。 在 Linux 上,.NET 应用还必须升级到 .NET 6。 使用以下命令使运行时可在 .NET 6 上运行:

    Windows Linux

    在 Windows 上运行时,还需要启用运行时版本 4.x 所需的 .NET 6.0。

    az functionapp config set --net-framework-version v6.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
    

    Windows 上运行的任何语言的函数应用都需要 .NET 6。

    你还可能需要更新 linuxFxVersion 站点设置以面向特定语言版本。 如果已设置正确的 linuxFxVersion 值,则可以跳过此步骤。 有关详细信息,请参阅有效的 linuxFxVersion

    在 Functions 4.x 发布之前,Linux 上不支持 PowerShell 应用。 这一事实意味着无需升级 Linux 上运行的 PowerShell 函数应用。

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "DOTNET|6.0"
    

    如果你要迁移到 .NET Functions 独立工作进程,请对 --linux-fx-version 使用 DOTNET-ISOLATED|6.0DOTNET-ISOLATED|7.0

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Java|11"
    

    --linux-fx-version 值必须与目标 Java 版本匹配。

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Node|16"
    

    --linux-fx-version 值必须与目标 Node.js 版本匹配。

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Python|3.9"
    

    --linux-fx-version 值必须与目标 PowerShell 版本匹配。

    在本例中,请将 <APP_NAME> 替换为函数应用的名称,并将 <RESOURCE_GROUP_NAME> 替换为资源组的名称。

  • 如果代码项目需要任何更新才能在版本 4.x 上运行,请立即将这些更新部署到过渡槽。

  • 在切换之前,请确认函数应用在升级的过渡环境中正常运行。

  • 使用以下命令将升级的过渡槽切换到生产槽:

    az functionapp deployment slot swap -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME> --target-slot production
    

    最短停机时间升级

    若要最大程度地缩短生产应用的停机时间,可以将 WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS 设置从过渡槽切换到生产槽。 然后,可以从预热过渡槽切换到升级的版本。

  • 使用以下命令在过渡槽中设置 WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0

    az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  • 使用以下命令将带有新设置的槽切换到生产槽,同时还原过渡槽中的版本设置。

    az functionapp deployment slot swap -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME> --target-slot production
    az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~3 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    

    在切换期间过渡槽可能会出现错误,并且会在暂存时还原运行时版本。 此错误的可能原因是,在交换期间过渡槽中仅包含 WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0,因此删除了过渡槽中的 FUNCTIONS_EXTENSION_VERSION 设置。 在没有此版本设置的情况下,槽处于错误状态。 在切换后立即更新过渡槽中的版本应该会将槽重新置于良好状态,并且你可以根据需要调用回滚更改。 但是,对于切换的任何回滚,你还需要在切换返回之前直接从生产槽中删除 WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0,以免生产槽中出现与过渡槽中相同的错误。 然后,生产设置中的此更改会导致重启。

  • 使用以下命令在过渡槽中再次设置 WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0

    az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    

    此时,这两个槽都已设置 WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0

  • 使用以下命令更改 FUNCTIONS_EXTENSION_VERSION 并将过渡槽升级到新的运行时版本:

    az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  • 在 Windows 中,Functions 运行时版本 4.x 需要 .NET 6。 在 Linux 上,.NET 应用还必须升级到 .NET 6。 使用以下命令使运行时可在 .NET 6 上运行:

    Windows Linux

    在 Windows 上运行时,还需要启用运行时版本 4.x 所需的 .NET 6.0。

    az functionapp config set --net-framework-version v6.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
    

    Windows 上运行的任何语言的函数应用都需要 .NET 6。

    你还可能需要更新 linuxFxVersion 站点设置以面向特定语言版本。 如果已设置正确的 linuxFxVersion 值,则可以跳过此步骤。 有关详细信息,请参阅有效的 linuxFxVersion

    在 Functions 4.x 发布之前,Linux 上不支持 PowerShell 应用。 这一事实意味着无需升级 Linux 上运行的 PowerShell 函数应用。

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "DOTNET|6.0"
    

    如果你要迁移到 .NET Functions 独立工作进程,请对 --linux-fx-version 使用 DOTNET-ISOLATED|6.0DOTNET-ISOLATED|7.0

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Java|11"
    

    --linux-fx-version 值必须与目标 Java 版本匹配。

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Node|16"
    

    --linux-fx-version 值必须与目标 Node.js 版本匹配。

    az functionapp config set --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --linux-fx-version "Python|3.9"
    

    --linux-fx-version 值必须与目标 PowerShell 版本匹配。

    在本例中,请将 <APP_NAME> 替换为函数应用的名称,并将 <RESOURCE_GROUP_NAME> 替换为资源组的名称。

  • 如果代码项目需要任何更新才能在版本 4.x 上运行,请立即将这些更新部署到过渡槽。

  • 在切换之前,请确认函数应用在升级的过渡环境中正常运行。

  • 使用以下命令将升级的预热过渡槽切换到生产槽:

    az functionapp deployment slot swap -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME> --target-slot production
    

    3\.x 和 4.x 之间的中断性变更

    以下是在将 3.x 应用升级到 4.x 之前需要注意的关键中断性变更,其中包括特定于语言的中断性变更。 如需完整列表,请参阅标有中断性变更:已批准的 Azure Functions GitHub 问题。

    如果没有看到你的编程语言,请从页面顶部选择。

  • Azure Functions 代理是 Azure Functions 运行时版本 1.x 到 3.x 的旧功能。 可以在 4.x 版本中重新启用对 Functions 代理的支持,以便可以将函数应用成功升级到最新的运行时版本。 应尽快切换到将函数应用与 Azure API 管理集成。 API 管理使你能够利用一组更完整的功能来定义、保护、管理基于 Functions 的 API 并从中获利。 有关详细信息,请参阅 API 管理集成。 若要了解如何在 Functions 版本 4.x 中重新启用代理支持,请参阅在 Functions v4.x 中重新启用代理

  • 4\.x 不再支持使用 AzureWebJobsDashboard 登录到 Azure 存储。 应改用 Application Insights。 (#1923)

  • Azure Functions 4.x 现在强制实施对扩展的最低版本要求。 升级到受影响的扩展的最新版本。 对于非 .NET 语言,请升级到扩展包版本 2.x 或更高版本。 (#1987)

  • 现在,对于消耗计划中运行于 Linux 上的函数应用,会强制实施 4.x 中的默认超时和最大超时。 (#1915)

  • Azure Functions 4.x 为 Key Vault 提供程序使用 Azure.IdentityAzure.Security.KeyVault.Secrets,已经弃用了 Microsoft.Azure.KeyVault。 有关如何配置函数应用设置的详细信息,请参阅机密存储库中的 Key Vault 选项。 (#2048)

  • 现在,如果共享存储帐户的多个函数应用具有相同的主机 ID,则这些应用将无法启动。 有关详细信息,请参阅主机 ID 注意事项。 (#2049)

  •