Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Внимание
Java не поддерживается версией 1.x среды выполнения Функции Azure. Возможно, вы хотите перенести приложение Java с версии 3.x на версию 4.x. Если вы переносите приложение-функцию версии 1.x, выберите C# или JavaScript выше.
Внимание
TypeScript не поддерживается версией 1.x среды выполнения Функции Azure. Возможно, вы хотите перенести приложение TypeScript с версии 3.x на версию 4.x. Если вы переносите приложение-функцию версии 1.x, выберите C# или JavaScript выше.
Внимание
PowerShell не поддерживается версией 1.x среды выполнения Функции Azure. Возможно, вы хотите перенести приложение PowerShell с версии 3.x на версию 4.x. Если вы переносите приложение-функцию версии 1.x, выберите C# или JavaScript выше.
Внимание
Python не поддерживается версией 1.x среды выполнения Функции Azure. Возможно, вы хотите перенести приложение Python с версии 3.x на версию 4.x. Если вы переносите приложение-функцию версии 1.x, выберите C# или JavaScript выше.
Внимание
Поддержка будет прекращена для версии 1.x среды выполнения Azure Functions 14 сентября 2026 г. Настоятельно рекомендуется перенести приложения в версию 4.x, следуя инструкциям в этой статье.
В этой статье описывается процесс безопасной миграции вашего функционального приложения для запуска в среде выполнения Функций версии 4.x. Так как инструкции по миграции проекта зависят от языка, обязательно выберите язык разработки из селектора в верхней части статьи.
Если вы используете среду выполнения версии 1.x в Azure Stack Hub, сначала ознакомьтесь с рекомендациями по Azure Stack Hub .
Определение приложений-функций для миграции
Используйте следующий сценарий PowerShell для создания списка приложений-функций в подписке, предназначенных для текущей версии 1.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 '*1*')
{
$AppInfo.Add($App.Name, $App.ApplicationSettings["FUNCTIONS_EXTENSION_VERSION"])
}
}
$AppInfo
Выбор целевой версии .NET
В среде выполнения функций версии 1.x ваше приложение с функцией C# предназначено для платформы .NET Framework.
При переносе приложения-функции у вас есть возможность выбрать целевую версию .NET. Проект C# можно обновить до одной из следующих версий .NET, поддерживаемых функциями версии 4.x:
Версия .NET | Тип выпуска официальной политики поддержки .NET | Модельпроцесса функций 1,2 |
---|---|---|
.NET 9 | STS (окончание поддержки 12 мая 2026 г.) | Изолированная рабочая модель |
.NET 8 | LTS (окончание поддержки 10 ноября 2026 г.) |
Изолированная рабочая модель, Модель в процессе2 |
.NET Framework 4.8 | См. политику | Изолированная рабочая модель |
1 Изолированная рабочая модель поддерживает версии с долгосрочной поддержкой (LTS) и с обычным сроком поддержки (STS) платформы .NET, а также .NET Framework. Модель в процессе поддерживает только LTS-выпуски .NET, заканчивая .NET 8. Полное сравнение функционала и возможностей двух моделей можно найти в разделе "Различия между встроенным и изолированным рабочими процессами .NET Функции Azure".
2 Поддержка заканчивается для модели в процессе 10 ноября 2026 года. Дополнительные сведения см. в этом объявлении о поддержке. Для непрерывной поддержки следует перенести приложения в изолированную рабочую модель.
Совет
Если приложение не зависит от библиотеки или API, доступной только для платформа .NET Framework, рекомендуется обновить до .NET 8 в изолированной рабочей модели. Многие приложения версии 1.x ориентированы только на .NET Framework, так как это была единственная доступная платформа на момент их создания. Дополнительные возможности доступны для более новых версий .NET, и если ваше приложение не вынуждено оставаться на платформе .NET Framework из-за зависимости, следует выбрать более новую версию. .NET 8 — это полностью выпущенная версия с самым длинным окном поддержки из .NET.
Хотя можно выбрать модель внутри процесса, это не рекомендуется, если это возможно избежать. Поддержка будет завершена для модели в процессе 10 ноября 2026 года, поэтому перед этим вам потребуется перейти к изолированной рабочей модели. Это при миграции на версию 4.x уменьшит общее количество необходимых усилий, и изолированная рабочая модель даст вашему приложению дополнительные преимущества, включая возможность более легко использовать будущие версии .NET. При переходе к изолированной рабочей модели помощник по обновлению .NET также может обрабатывать многие необходимые изменения кода.
В этом руководстве нет конкретных примеров для .NET 9. Если вам нужно настроить эту версию, можно адаптировать примеры .NET 8 для изолированной рабочей модели.
Подготовка к переносу
Если вы еще не сделали этого, определите список приложений, которые необходимо перенести в текущей подписке Azure с помощью Azure PowerShell.
Прежде чем перенести приложение в среду выполнения функций версии 4.x, выполните следующие задачи:
- Просмотрите список изменений поведения после версии 1.x. Миграция с версии 1.x на версию 4.x также может повлиять на привязки.
- Выполните действия, описанные в разделе "Миграция локального проекта", чтобы перенести локальный проект в версию 4.x.
- После переноса проекта полностью протестируйте приложение локально с помощью версии 4.x Azure Functions Core Tools.
- Обновите функциональное приложение в Azure до последней версии. Если вам нужно свести к минимуму время простоя, рассмотрите возможность использования промежуточного слота для тестирования и проверки перенесенного приложения в Azure в новой версии среды выполнения. Затем можно развернуть приложение с обновленными параметрами версии в рабочем слоте. Для получения дополнительной информации см. раздел Обновление с помощью слотов.
- Опубликуйте перенесенный проект в обновленном приложении-функции.
При использовании Visual Studio для публикации проекта версии 4.x в существующем приложении-функции в более низкой версии вам будет предложено разрешить Visual Studio обновить приложение-функцию до версии 4.x во время развертывания. Это обновление использует тот же процесс, определенный в Обновлении без слотов.
Перенос локального проекта
В следующих разделах описаны обновления, которые необходимо внести в файлы проекта C#, чтобы иметь возможность выполняться в одной из поддерживаемых версий .NET в Функциях версии 4.x. Отображаемые обновления являются общими для большинства проектов. Код проекта может требовать обновления, не упомянутые в этой статье, особенно при использовании пользовательских пакетов NuGet.
Перенос приложения-функции C# с версии 1.x на версию 4.x среды выполнения функций требует внесения изменений в код проекта. Многие из этих изменений являются результатом изменений на языке C# и API .NET.
Выберите вкладку, соответствующую целевой версии .NET, и требуемую модель процесса (внутрипроцессный или изолированный рабочий процесс).
Совет
При переходе на LTS или STS-версию .NET с помощью изолированной рабочей модели помощник по обновлению .NET можно использовать для автоматического внесения многих изменений, упомянутых в следующих разделах.
Файл проекта
Следующий пример — файл проекта .csproj
, работающий на версии 1.x.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<AzureFunctionsVersion>v1</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.24" />
</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-файл для запуска в Функциях версии 4.x:
Эти шаги предполагают локальный проект C#. Если ваше приложение вместо этого использует скрипты C# (.csx файлы), вам следует преобразовать приложение в модель проекта перед продолжением.
В XML-файле проекта CSPROJ требуются следующие изменения:
Задайте значение
PropertyGroup
.TargetFramework
изменено наnet8.0
.Задайте значение
PropertyGroup
.AzureFunctionsVersion
изменено наv4
.Добавьте следующий
OutputType
элемент в :PropertyGroup
<OutputType>Exe</OutputType>
ItemGroup
в.PackageReference
список, замените ссылку на пакетMicrosoft.NET.Sdk.Functions
следующими ссылками:<FrameworkReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.21.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.2" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="1.2.1" /> <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" /> <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.2.0" />
Запишите ссылки на другие пакеты в
Microsoft.Azure.WebJobs.*
пространствах имен. Вы замените эти пакеты на следующем шаге.Добавьте новый элемент
ItemGroup
:<ItemGroup> <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext"/> </ItemGroup>
После внесения этих изменений обновленный проект должен выглядеть следующим образом:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<RootNamespace>My.Namespace</RootNamespace>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.21.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.2" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="1.2.1" />
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.2.0" />
<!-- Other packages may also be in this list -->
</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>
Изменения в структуре пакета и пространстве имен
На основе модели, в которую выполняется миграция, может потребоваться обновить или изменить пакеты, на которые ссылается приложение. При внедрении целевых пакетов необходимо обновить пространство имен инструкций using и некоторые типы, на которые вы ссылаетесь. Вы можете увидеть влияние этих изменений пространства имен на инструкции в примерах HTTP-триггера, представленных далее в статье.
Если вы еще не сделали этого, обновите проект, чтобы ссылаться на последние стабильные версии:
В зависимости от триггеров и привязок, которые использует приложение, может потребоваться ссылаться на другой набор пакетов. В следующей таблице показаны замены некоторых наиболее часто используемых расширений:
Сценарий | Изменения ссылок на пакеты |
---|---|
Триггер таймера | Добавить Microsoft.Azure.Functions.Worker.Extensions.Timer |
Привязки для хранилища | ЗаменитьMicrosoft.Azure.WebJobs.Extensions.Storage на Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs, Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues и Microsoft.Azure.Functions.Worker.Extensions.Tables |
Привязки больших двоичных объектов | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.Storage.Blobs с последней версией Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs |
Привязки очередей | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.Storage.Queues с последней версией Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues |
Привязки таблиц | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.Tables с последней версией Microsoft.Azure.Functions.Worker.Extensions.Tables |
Привязки Cosmos DB | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.CosmosDB и (или) Microsoft.Azure.WebJobs.Extensions.DocumentDB с последней версией Microsoft.Azure.Functions.Worker.Extensions.CosmosDB |
Привязки служебной шины | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.ServiceBus с последней версией Microsoft.Azure.Functions.Worker.Extensions.ServiceBus |
Привязки к Центрам событий | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.EventHubs с последней версией Microsoft.Azure.Functions.Worker.Extensions.EventHubs |
Привязки сетки событий | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.EventGrid с последней версией Microsoft.Azure.Functions.Worker.Extensions.EventGrid |
Привязки Службы SignalR | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.SignalRService с последней версией Microsoft.Azure.Functions.Worker.Extensions.SignalRService |
Устойчивые функции | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.DurableTask с последней версией Microsoft.Azure.Functions.Worker.Extensions.DurableTask |
Устойчивые функции (поставщик хранилища SQL) |
Замена ссылок наMicrosoft.DurableTask.SqlServer.AzureFunctions с последней версией Microsoft.Azure.Functions.Worker.Extensions.DurableTask.SqlServer |
Устойчивые функции (поставщик хранилища Netherite) |
Замена ссылок наMicrosoft.Azure.DurableTask.Netherite.AzureFunctions с последней версией Microsoft.Azure.Functions.Worker.Extensions.DurableTask.Netherite |
Привязки SendGrid | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.SendGrid с последней версией Microsoft.Azure.Functions.Worker.Extensions.SendGrid |
Привязки Kafka | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.Kafka с последней версией Microsoft.Azure.Functions.Worker.Extensions.Kafka |
Привязки RabbitMQ | Замена ссылок наMicrosoft.Azure.WebJobs.Extensions.RabbitMQ с последней версией Microsoft.Azure.Functions.Worker.Extensions.RabbitMQ |
Внедрение зависимостей и конфигурация запуска |
Удаление ссылок наMicrosoft.Azure.Functions.Extensions (Изолированная рабочая модель предоставляет эту функцию по умолчанию.) |
Ознакомьтесь с поддерживаемыми привязками для полного списка расширений, которые следует рассмотреть, и ознакомьтесь с документацией по каждому расширению, чтобы получить полные инструкции по установке для изолированной модели процесса. Не забудьте установить последнюю стабильную версию всех целевых пакетов.
Совет
Любые изменения версий расширений во время этого процесса могут потребовать обновления host.json
файла. Обязательно ознакомьтесь с документацией по каждому используемому расширению.
Например, расширение «Service Bus» имеет существенные изменения в структуре между версиями 4.x и 5.x. Дополнительные сведения см. в привязках Служебной шины Azure для функций Azure.
Приложение изолированной рабочей модели не должно ссылаться на пакеты в Microsoft.Azure.WebJobs.*
пространствах имен или Microsoft.Azure.Functions.Extensions
. Если у вас есть оставшиеся ссылки на них, их следует удалить.
Совет
Ваше приложение также может зависеть от типов Azure SDK, как в рамках триггеров и привязок, так и в качестве автономной зависимости. Вы должны воспользоваться этой возможностью, чтобы также их обновить. Последние версии функциональных расширений работают с последними версиями пакета Azure SDK для .NET, при этом почти все пакеты имеют вид Azure.*
.
Привязки центров уведомлений и мобильных приложений поддерживаются только в версии 1.x среды выполнения. При обновлении до версии 4.x среды выполнения необходимо удалить эти привязки в пользу работы с этими службами непосредственно с помощью пакетов SDK.
файл Program.cs
В большинстве случаев миграция требует добавления в проект следующего program.cs файла:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureServices(services => {
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
})
.Build();
host.Run();
Этот пример включает интеграцию ASP.NET Core для повышения производительности и предоставления знакомой модели программирования при использовании триггеров HTTP в приложении. Если вы не планируете использовать триггеры HTTP, можно заменить вызов ConfigureFunctionsWebApplication
вызовом ConfigureFunctionsWorkerDefaults
. При этом можно удалить ссылку Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore
на файл проекта. Однако для оптимальной производительности, даже для функций с другими типами триггеров, следует сохранить FrameworkReference
на ASP.NET Core.
Файл Program.cs заменяет любой файл с FunctionsStartup
атрибутом, который обычно является файлом Startup.cs. В местах, где ваш код FunctionsStartup
будет ссылаться на IFunctionsHostBuilder.Services
, можно вместо этого добавить инструкции в метод .ConfigureServices()
класса HostBuilder
в вашем файле Program.cs. Дополнительные сведения о работе с Program.cs см. в руководстве по запуску и настройке в изолированной рабочей модели.
Примеры Program.cs по умолчанию включают настройку Application Insights. В Program.cs необходимо также настроить фильтрацию журналов, которая должна применяться к журналам, поступающим из кода в проекте. В изолированной рабочей модели файл host.json управляет событиями, создаваемыми средой выполнения узла функций. Если правила фильтрации не настроены в Program.cs, могут возникнуть различия в уровнях журнала, присутствующих для различных категорий телеметрии.
Хотя вы можете зарегистрировать пользовательские источники конфигурации в рамках HostBuilder
, они аналогично применяются только к коду в вашем проекте. Платформа также нуждается в настройке триггера и привязки, и это должно быть предоставлено с помощью параметров приложения, ссылок на Key Vault или ссылок на конфигурацию приложений .
После того как вы переместите все из любых существующих FunctionsStartup
в файл Program.cs, можно удалить атрибут FunctionsStartup
и класс, к которому он был применён.
файл host.json
Параметры в файле host.json применяются на уровне приложения-функции как локально, так и в Azure. В версии 1.x файл host.json пуст или содержит некоторые параметры, которые применяются ко всем функциям в приложении-функции. Дополнительные сведения см. в Host.json версии 1. Если ваш файл host.json имеет значения параметров, просмотрите формат host.json версии 2 на предмет любых изменений.
Чтобы запуститься в версии 4.x, необходимо добавить "version": "2.0"
в файл host.json. Также следует добавить logging
в конфигурацию, как показано в следующих примерах:
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
},
"enableLiveMetricsFilters": true
}
}
}
Файл host.json
управляет ведением журнала только из среды выполнения узла Функций и в изолированной рабочей модели некоторые из этих журналов приходят непосредственно из приложения, что дает вам больше контроля. Дополнительные сведения об фильтрации этих журналов см. в статье "Управление уровнями журналов в изолированной рабочей модели ".
local.settings.json файл
Файл local.settings.json используется только при локальном запуске. Дополнительные сведения см. в файле локальных параметров. В версии 1.x файл local.settings.json имеет только два обязательных значения:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "AzureWebJobsStorageConnectionStringValue",
"AzureWebJobsDashboard": "AzureWebJobsStorageConnectionStringValue"
}
}
При переходе на версию 4.x убедитесь, что файл local.settings.json содержит по крайней мере следующие элементы:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "AzureWebJobsStorageConnectionStringValue",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
}
}
Примечание.
При переходе от выполнения процесса к выполнению в изолированном рабочем процессе необходимо изменить FUNCTIONS_WORKER_RUNTIME
значение на "dotnet-isolated".
Изменения имени класса
Некоторые классы ключей изменили имена между версиями 1.x и версией 4.x. Эти изменения являются результатом изменений в API .NET или в различиях между процессом и изолированным рабочим процессом. В следующей таблице указаны ключевые классы .NET, используемые функциями, которые могут измениться при миграции:
Версия 1.x | .NET 8 |
---|---|
FunctionName (атрибут) |
Function (атрибут) |
TraceWriter |
ILogger<T> , ILogger |
HttpRequestMessage |
HttpRequestData , HttpRequest (использование интеграции ASP.NET Core) |
HttpResponseMessage |
HttpResponseData , IActionResult (использование интеграции ASP.NET Core) |
В привязках также могут быть различия имен классов. Для получения дополнительной информации см. справочные статьи по конкретным привязкам.
Другие изменения кода
В этом разделе рассматриваются другие изменения кода, которые следует учитывать при работе с миграцией. Эти изменения не требуются для всех приложений, но следует оценить, имеют ли они отношение к вашим сценариям. Не забудьте ознакомиться с изменениями поведения после версии 1.x, чтобы узнать о возможных корректировках, которые может потребоваться внести в ваш проект.
Сериализация JSON
По умолчанию изолированная рабочая модель использует System.Text.Json для сериализации JSON. Сведения о настройке параметров сериализатора или переключении на JSON.NET (Newtonsoft.Json) см. в разделе "Настройка сериализации JSON".
Уровни логов Application Insights и фильтрация
Журналы можно отправлять в Application Insights как из среды выполнения функции, так и из кода в проекте. host.json позволяет настраивать правила ведения журнала хоста, но для управления журналами, поступающими из вашего кода, необходимо настроить правила фильтрации в рамках Program.cs. Дополнительные сведения об фильтрации этих журналов см. в статье "Управление уровнями журналов в изолированной рабочей модели ".
Шаблон триггера HTTP
Большинство изменений кода между версией 1.x и версией 4.x можно увидеть в триггерных функциях HTTP. Шаблон триггера HTTP для версии 1.x выглядит следующим образом:
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
namespace Company.Function
{
public static class HttpTriggerCSharp
{
[FunctionName("HttpTriggerCSharp")]
public static async Task<HttpResponseMessage>
Run([HttpTrigger(AuthorizationLevel.AuthLevelValue, "get", "post",
Route = null)]HttpRequestMessage req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
// parse query parameter
string name = req.GetQueryNameValuePairs()
.FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
.Value;
if (name == null)
{
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
name = data?.name;
}
return name == null
? req.CreateResponse(HttpStatusCode.BadRequest,
"Please pass a name on the query string or in the request body")
: req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
}
}
}
В версии 4.x шаблон триггера HTTP выглядит следующим образом:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace Company.Function
{
public class HttpTriggerCSharp
{
private readonly ILogger<HttpTriggerCSharp> _logger;
public HttpTriggerCSharp(ILogger<HttpTriggerCSharp> logger)
{
_logger = logger;
}
[Function("HttpTriggerCSharp")]
public IActionResult Run(
[HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req)
{
_logger.LogInformation("C# HTTP trigger function processed a request.");
return new OkObjectResult($"Welcome to Azure Functions, {req.Query["name"]}!");
}
}
}
Чтобы обновить проект до версии 4.x службы "Функции Azure":
Обновите локальную установку Azure Functions Core Tools до версии 4.x.
Перейдите к одной из версий Node.js, поддерживаемых в версии 4.x.
Добавьте элементы
version
иextensionBundle
в host.json, чтобы он выглядел следующим образом:{ "version": "2.0", "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[3.3.0, 4.0.0)" } }
Элемент
extensionBundle
требуется, так как после версии 1.x привязки сохраняются как внешние пакеты. Дополнительные сведения см. в разделе "Пакеты расширений".Обновите файл local.settings.json таким образом, чтобы он содержит по крайней мере следующие элементы:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node" } }
Параметр
AzureWebJobsStorage
может быть эмулятором хранилища Azurite или фактической учетной записью хранения Azure. Дополнительные сведения см. в эмуляторе локального хранилища.
Обновите ваше функциональное приложение в Azure
Перед публикацией перенесенного проекта необходимо обновить среду выполнения узла приложения-функции в Azure до версии 4.x. Версия среды выполнения, используемая узлом функций, управляется FUNCTIONS_EXTENSION_VERSION
параметром приложения, но в некоторых случаях другие параметры также должны быть обновлены. Изменения кода и изменения параметров приложения требуют перезапуска приложения-функции.
Наиболее простой способ — обновить без слотов, а затем повторно опубликовать проект приложения. Вы также можете свести к минимуму время простоя в приложении и упростить откат, обновляя через слоты.
Обновление без слотов
Самый простой способ обновления до версии 4.x — задать FUNCTIONS_EXTENSION_VERSION
параметр ~4
приложения в приложении-функции в Azure. На сайте со слотами необходимо выполнить другую процедуру.
az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
Необходимо также задать другой параметр, который отличается от Windows и Linux.
При запуске в Windows также необходимо включить .NET 6.0, что требуется для среды выполнения версии 4.x.
az functionapp config set --net-framework-version v6.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
.NET 6 требуется для приложений-функций на любом языке, работающем в Windows.
В этом примере замените <APP_NAME>
именем приложения-функции и <RESOURCE_GROUP_NAME>
именем группы ресурсов.
Теперь вы можете повторно опубликовать проект приложения, перенесенный для запуска в версии 4.x.
Обновить с использованием слотов
Использование слотов развертывания — это хороший способ обновить функциональное приложение до исполняющей среды версии 4.x с предыдущей версии. С помощью промежуточного слота можно запустить приложение в новой версии среды выполнения в промежуточном слоте и перейти в рабочую среду после проверки. Слоты также позволяют свести к минимуму время простоя во время обновления. Если необходимо свести к минимуму время простоя, выполните действия, описанные в разделе "Минимальное время простоя".
После проверки приложения в обновленном слоте вы можете переместить приложение и настройки новой версии в рабочую среду. Для этого переключения требуется установить параметр WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0
в рабочем слоте. Добавление этого параметра влияет на время простоя, необходимое для обновления.
Стандартное обновление
Если для приложения-функции с поддержкой слотов допустимо время простоя, необходимое для полного перезапуска, можно обновить параметр WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS
непосредственно в рабочем слоте. Так как изменение этого параметра непосредственно в рабочем слоте приводит к перезапуску, влияющему на доступность, рекомендуется выполнять это изменение в период пониженного трафика. Затем вы можете задействовать обновленную версию, переместив ее в промежуточный слот.
Командлет PowerShell Update-AzFunctionAppSetting
в настоящее время не поддерживает слоты. Необходимо использовать 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>
Для среды выполнения функций версии 4.x требуется .NET 6 в Windows. В Linux приложения .NET также должны обновляться до .NET 6. Используйте следующую команду, чтобы среда выполнения была запущена в .NET 6:
При запуске в Windows также необходимо включить .NET 6.0, что требуется для среды выполнения версии 4.x.
az functionapp config set --net-framework-version v6.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
.NET 6 требуется для приложений-функций на любом языке, работающем в Windows.
В этом примере замените
<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>
Для среды выполнения функций версии 4.x требуется .NET 6 в Windows. В Linux приложения .NET также должны обновляться до .NET 6. Используйте следующую команду, чтобы среда выполнения была запущена в .NET 6:
При запуске в Windows также необходимо включить .NET 6.0, что требуется для среды выполнения версии 4.x.
az functionapp config set --net-framework-version v6.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
.NET 6 требуется для приложений-функций на любом языке, работающем в Windows.
В этом примере замените
<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
Изменения поведения после версии 1.x
В этом разделе подробно описаны изменения, внесенные после версии 1.x в поведении триггера и привязки, а также в основных функциях и поведении функций.
Изменения в триггерах и привязках
Начиная с версии 2.x, вам потребуется устанавливать расширения для конкретных триггеров и привязок, которые используются функциями вашего приложения. Единственное исключение — триггеры HTTP и таймера, для которых не требуется расширение. Для получения дополнительной информации см. Зарегистрируйте и установите расширения привязки.
Также при смене версий были внесены некоторые изменения в function.json или атрибуты функций. Например, свойство path
для концентраторов событий теперь имеет атрибут eventHubName
. Для получения ссылок на документацию для каждой привязки см. таблицу существующих привязок.
Изменения в функциях и возможностях
Некоторые функции были удалены, обновлены или заменены после версии 1.x. В этом разделе подробно описаны изменения, которые вы увидите в более поздних версиях после использования версии 1.x.
В версии 2.x внесены следующие изменения.
Ключи для вызова конечных точек HTTP всегда хранятся в зашифрованном виде в хранилище BLOB-объектов Azure. В версии 1.x эти ключи по умолчанию хранились в хранилище файлов. При переносе приложения с версии 1.x на версию 2.x существующие секретные данные, находящиеся в файлах Azure, сбрасываются.
Среда выполнения версии 2.x не имеет встроенной поддержки вебхуков. Это изменение внесено для повышения производительности. Вы по-прежнему можете использовать HTTP триггеры в качестве конечных точек для веб-перехватчиков.
Чтобы улучшить мониторинг, панель веб-заданий на портале с параметром
AzureWebJobsDashboard
заменена на Azure Application Insights, который использует параметрAPPINSIGHTS_INSTRUMENTATIONKEY
. Дополнительные сведения см. в разделе Мониторинг функций Azure.Все функции в рамках одного приложения должны использовать один язык. При создании приложения-функции необходимо выбрать для приложения стек среды выполнения. В параметрах приложения стек среды выполнения определяется значением
FUNCTIONS_WORKER_RUNTIME
. Это требование добавлено для уменьшения занимаемого места и ускорения запуска. При локальной разработке также необходимо включить этот параметр в файл local.settings.json.По умолчанию для функций в плане службы приложений устанавливается время ожидания 30 минут. Вы можете вручную снять это ограничение, изменив параметр functionTimeout в файле host.json.
Регулирование параллельной обработки HTTP по умолчанию применяется для функций плана потребления, по умолчанию допуская не более 100 одновременных запросов на один экземпляр. Это поведение можно изменить в параметре
maxConcurrentRequests
файла host.json.Из-за ограничений .NET Core удалена поддержка функций в виде скриптов F# (файлы
.fsx
). Скомпилированные функции F# (.fs) по-прежнему поддерживаются.Для веб-перехватчиков триггера Event Grid формат URL-адреса изменен в соответствии со следующим шаблоном:
https://{app}/runtime/webhooks/{triggerName}
.Имена некоторых предварительно определенных пользовательских метрик были изменены после версии 1.x.
Duration
был заменен наMaxDurationMs
,MinDurationMs
иAvgDurationMs
.Success Rate
также был переименован вSuccess Rate
.
Рекомендации по Azure Stack Hub
Служба приложений в Azure Stack Hub не поддерживает версию 4.x Azure Functions. При планировании миграции c версии 1.x в Azure Stack Hub можно выбрать один из следующих вариантов:
- Мигрируйте на версию 4.x, размещенную в общедоступном облаке Azure Functions, используя инструкции в этой статье. Вместо обновления существующего приложения вы создадите новое приложение с помощью версии 4.x, а затем развернете измененный проект в нем.
- Переключитесь на веб-задания, размещенные в плане Служба приложений в Azure Stack Hub.