Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wichtig
Seit dem 13. Dezember 2022 haben Funktions-Apps, die auf den Versionen 2.x und 3.x der Azure Functions Laufzeit ausgeführt werden, das Ende des erweiterten Supports erreicht. Weitere Informationen finden Sie unter Eingestellte Versionen.
Azure Functions Version 4.x ist stark abwärtskompatibel mit Version 3.x. Bei den meisten Apps sollte eine Migration zu Version 4.x ohne erhebliche Codeänderungen problemlos möglich sein. Weitere Informationen zu Funktionen-Laufzeitversionen finden Sie unter Azure Functions Übersicht über Laufzeitversionen.
Wichtig
Funktions-Apps, die weiterhin die Version 3 Laufzeitumgebung, die das Ende des Lebenszyklus erreicht hat, unter Linux in einem Verbrauchsplan ausführen, stoppen ihren Betrieb nach dem 30. September 2026. Um Dienstunterbrechungen zu vermeiden, migrieren Sie Ihre App zur v4-Laufzeit.
Die Option zum Hosten von Funktions-Apps unter Linux in einem Verbrauchsplan wird am 30. September 2028 eingestellt. Der Linux-Verbrauchsplan erhält keine neuen Features oder Sprachversionen. Apps, die auf Windows in einem Verbrauchsplan ausgeführt werden, sind derzeit nicht betroffen. Migrieren Sie Ihre Apps zum Flex-Nutzungsplan vor dem Deaktivierungsdatum.
Dieser Artikel führt Sie durch den Prozess der sicheren Migration Ihrer Funktions-App zur Ausführung mit Version 4.x der Functions-Runtime. Da Projektmigrationsanweisungen sprachabhängig sind, stellen Sie sicher, dass Sie ihre Entwicklungssprache aus der Auswahl oben im Artikel auswählen.
Identifizieren zu migrierender Funktions-Apps
Verwenden Sie das folgende PowerShell-Skript, um eine Liste von Funktions-Apps in Ihrem Abonnement zu generieren, die derzeit auf die Versionen 2.x oder 3.x ausgerichtet sind:
$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
Wählen Sie Ihre Ziel-.NET-Version aus.
In Version 3.x der Funktionslaufzeit zielt Ihre C#-Funktions-App auf .NET Core 3.1 mithilfe des In-Process-Modells oder .NET 5 mithilfe des isolierten Workermodells ab.
Wenn Sie Ihre Funktions-App migrieren, haben Sie die Möglichkeit, die Zielversion von .NET auszuwählen. Sie können Ihr C#-Projekt auf eine der folgenden Versionen von .NET aktualisieren, die von Functions Version 4.x unterstützt werden:
| .NET-Version | .NET Offizielle Supportrichtlinie Releasetyp | Functions-Prozessmodell1,2 |
|---|---|---|
| .NET 10 | LTS (Ende des Supports vom 14. November 2028) | Isoliertes Workermodell |
| .NET 9 | STS (Ende des Supports vom 10. November 2026)3 | Isoliertes Workermodell |
| .NET 8 | LTS (Ende des Supports am 10. November 2026) |
Isoliertes Workermodell In-Process-Modell2 |
| .NET Framework 4.8 | Siehe Politik | Isoliertes Workermodell |
1 Das isolierte Workermodell unterstützt versionen Long Term Support (LTS) und Standard Term Support (STS) von .NET sowie .NET Framework. Das in-Process-Modell unterstützt nur LTS-Versionen von .NET, die mit .NET 8 enden. Einen vollständigen Funktions- und Leistungsumfangvergleich zwischen den beiden Modellen finden Sie unter Differences between in-process and isolate worker process .NET Azure Functions.
2 Die Unterstützung für das In-Process-Modell endet am 10. November 2026. Weitere Informationen finden Sie in dieser Supportankündigung. Um weiterhin uneingeschränkten Support zu erhalten, müssen Sie Ihre Apps zum Modell mit isolierten Workern migrieren.
3 .NET 9 hatte zuvor ein erwartetes Ende des Supports vom 12. Mai 2026. Während des .NET 9-Dienstfensters erweiterte das .NET Team den Support für STS-Versionen auf 24 Monate, beginnend mit .NET 9. Weitere Informationen finden Sie im Blogbeitrag.
Tipp
Es wird empfohlen, das Update auf .NET 8 für das isolierte Arbeitsmodell auszuführen. .NET 8 ist die vollständig veröffentlichte Version mit dem längsten Supportfenster von .NET.
Obwohl Sie sich dafür entscheiden können, stattdessen das In-Process-Modell zu verwenden, empfehlen wir diesen Ansatz nicht, wenn Sie ihn vermeiden können. Der Support für das In-Process-Modell endet am 10. November 2026, sodass Sie vorher zum Modell mit isolierten Workern wechseln sollten. Auf diese Weise verringert sich bei der Migration zu Version 4.x der gesamt erforderliche Aufwand, und das isolierte Workermodell bietet Ihrer App zusätzliche Vorteile, einschließlich der Möglichkeit, zukünftige Versionen von .NET einfacher zu unterstützen. Wenn Sie zum isolierten Workermodell wechseln, kann der .NET Upgrade-Assistent auch viele der erforderlichen Codeänderungen für Sie verarbeiten.
Dieses Handbuch enthält keine spezifischen Beispiele für .NET 10 (Vorschau) oder .NET 9. Wenn Sie auf eine dieser Versionen abzielen müssen, können Sie die .NET 8 Beispiele anpassen.
Vorbereiten der Migration
Falls noch nicht geschehen, identifizieren Sie die Liste der Apps, die in Ihrem aktuellen Azure-Abonnement migriert werden müssen, indem Sie die Azure PowerShell verwenden.
Bevor Sie eine App zu Version 4.x der Functions-Runtime migrieren, sollten Sie die folgenden Aufgaben ausführen:
- Überprüfen Sie die Liste der Breaking Changes zwischen 3.x und 4.x.
- Führen Sie die Schritte unter Migrieren Ihres lokalen Projekts aus, um Ihr lokales Projekt zu Version 4.x zu migrieren.
- Nachdem Sie Ihr Projekt migriert haben, testen Sie die App lokal mit Version 4.x der Azure Functions Core Tools.
- Führen Sie den Vorab-Upgrade-Validator aus auf der in Azure gehosteten App aus, und beheben Sie alle erkannten Probleme.
- Aktualisieren Sie Ihre Funktions-App in Azure auf die neue Version. Wenn Sie Ausfallzeiten minimieren müssen, sollten Sie ein staging slot verwenden, um Ihre migrierte App in Azure der neuen Laufzeitversion zu testen und zu überprüfen. Anschließend können Sie Ihre App mit den aktualisierten Versionseinstellungen für den Produktionsslot bereitstellen. Weitere Informationen finden Sie unter Aktualisieren mit Slots.
- Veröffentlichen Sie Ihr migriertes Projekt in der aktualisierten Funktions-App.
Wenn Sie Visual Studio verwenden, um ein Version 4.x-Projekt in einer vorhandenen Funktions-App mit einer niedrigeren Version zu veröffentlichen, werden Sie aufgefordert, Visual Studio die Funktions-App während der Bereitstellung auf Version 4.x zu aktualisieren. Dieses Update verwendet denselben Prozess, der in Aktualisieren ohne Slots definiert ist.
Migrieren Ihres lokalen Projekts
Upgradeanweisungen können sprachabhängig sein. Wenn Ihre Sprache nicht angezeigt wird, wählen Sie sie oben im Artikel aus.
Wählen Sie die Registerkarte aus, die Ihrer Zielversion von .NET und dem gewünschten Prozessmodell entspricht (prozessinterner oder isolierter Arbeitsprozess).
Tipp
Wenn Sie mit dem isolierten Arbeitsmodell zu einer LTS- oder STS-Version von .NET wechseln, kann der .NET Upgrade-Assistent verwendet werden, um automatisch viele der in den folgenden Abschnitten erwähnten Änderungen vorzunehmen.
Projektdatei
Das folgende Beispiel ist eine .csproj Projektdatei, die .NET Core 3.1 auf Version 3.x verwendet:
<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>
Verwenden Sie eines der folgenden Verfahren, um diese XML-Datei so zu aktualisieren, dass sie in Functions-Version 4.x ausgeführt wird:
Bei diesen Schritten wird ein lokales C#-Projekt vorausgesetzt; Wenn Ihre App stattdessen C#-Skript (CSX-Dateien ) verwendet, sollten Sie in das Projektmodell konvertieren , bevor Sie fortfahren.
Die folgenden Änderungen sind in der CSPROJ-XML-Projektdatei erforderlich:
Legen Sie den Wert von
PropertyGroupfest:TargetFrameworkinnet8.0.Legen Sie den Wert von
PropertyGroupfest:AzureFunctionsVersioninv4.Fügen Sie das folgende
OutputType-ElementPropertyGrouphinzu:<OutputType>Exe</OutputType>Ersetzen Sie in der Liste
ItemGroup.Ersetzen Sie in derPackageReference-Liste den Paketverweis aufMicrosoft.NET.Sdk.Functionsdurch die folgenden Verweise:<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" />Notieren Sie sich alle Verweise auf andere Pakete in den Namespaces
Microsoft.Azure.WebJobs.*. Diese Pakete werden in einem späteren Schritt ersetzt.Fügen Sie die folgende neue
ItemGrouphinzu:<ItemGroup> <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext"/> </ItemGroup>
Nachdem Sie diese Änderungen vorgenommen haben, sollte Ihr aktualisiertes Projekt wie das folgende Beispiel aussehen:
<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>
Paket- und Namespaceänderungen
Basierend auf dem Modell, zu dem Sie migrieren, müssen Sie möglicherweise die Pakete aktualisieren oder ändern, zu denen Ihre Anwendungsverweise verweisen. Wenn Sie die Zielpakete übernehmen, müssen Sie möglicherweise den Namespace von using-Anweisungen und einigen Typen aktualisieren, auf die Sie verweisen. Sie können die Auswirkungen dieser Namespaceänderungen in using-Anweisungen in den Beispielen für HTTP-Triggervorlagen weiter unten in diesem Artikel erkennen.
Falls noch nicht geschehen, aktualisieren Sie Ihr Projekt, um auf die neuesten stabilen Versionen der folgenden Komponenten zu verweisen:
Abhängig von den Triggern und Bindungen, die Ihre App verwendet, muss Ihre App möglicherweise auf andere Pakete verweisen. In der folgenden Tabelle sind die Ersetzungen für einige der am häufigsten verwendeten Erweiterungen aufgeführt:
| Szenario | Änderungen an Paketverweisen |
|---|---|
| Trigger mit Timer | Hinzufügen Microsoft.Azure. Functions.Worker.Extensions.Timer |
| Speicherbindungen | ReplaceMicrosoft.Azure.WebJobs.Extensions.Storagedurch Microsoft.Azure. Functions.Worker.Extensions.Storage.Blobs, Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues und Microsoft.Azure.Functions.Worker.Extensions.Tables |
| Blobbindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.Storage.Blobsdurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.Storage.Blobs |
| Warteschlangenbindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.Storage.Queuesdurch die neueste Version von Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues |
| Tabellenbindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.Tablesdurch die neueste Version von Microsoft.Azure.Functions.Worker.Extensions.Tables |
| Cosmos DB-Bindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.CosmosDBund/oder Microsoft.Azure.WebJobs.Extensions.DocumentDBdurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.CosmosDB |
| Service Bus Bindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.ServiceBusdurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.ServiceBus |
| Event Hubs-Bindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.EventHubsdurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.EventHubs |
| Event Grid-Bindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.EventGriddurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.EventGrid |
| SignalR Service Bindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.SignalRServicedurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.SignalRService |
| Dauerhafte Funktionen (Durable Functions) | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.DurableTaskdurch die neueste Version von Microsoft.Azure.Functions.Worker.Extensions.DurableTask |
| Dauerhafte Funktionen (Durable Functions) (SQL-Speicheranbieter) |
Ersetzen Sie Verweise aufMicrosoft.DurableTask.SqlServer.AzureFunctionsdurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.DurableTask.SqlServer |
| Dauerhafte Funktionen (Durable Functions) (Netherite-Speicheranbieter) |
Ersetzen Sie Verweise aufMicrosoft.Azure.DurableTask.Netherite.AzureFunctionsdurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.DurableTask.Netherite |
| SendGrid-Bindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.SendGriddurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.SendGrid |
| Kafka-Bindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.Kafkadurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.Kafka |
| RabbitMQ-Bindungen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.RabbitMQdurch die neueste Version von Microsoft.Azure. Functions.Worker.Extensions.RabbitMQ |
| Abhängigkeitsinjektion und Startkonfiguration |
Entfernen Sie Verweise aufMicrosoft.Azure.Functions.Extensions(Das isolierte Workermodell stellt diese Funktionalität standardmäßig bereit.) |
Eine vollständige Liste der zu berücksichtigenden Erweiterungen finden Sie unter Unterstützte Bindungen, und vollständige Installationsanweisungen für das isolierte Prozessmodell finden Sie in der Dokumentation der jeweiligen Erweiterung. Stellen Sie sicher, dass Sie die neueste stabile Version aller Pakete installieren, die Sie als Ziel verwenden.
Tipp
Alle Änderungen an Erweiterungsversionen während dieses Vorgangs erfordern möglicherweise, dass Sie auch Ihre host.json-Datei aktualisieren. Lesen Sie unbedingt die Dokumentation der einzelnen Erweiterungen, die Sie verwenden.
Die Service Bus Erweiterung hat beispielsweise schwerwiegende Änderungen an der Struktur zwischen den Versionen 4.x und 5.x. Weitere Informationen finden Sie unter Azure Service Bus Bindungen für Azure Functions.
Ihre isolierte Workermodellanwendung sollte nicht auf Pakete in den namespaces Microsoft.Azure.WebJobs.* oder Microsoft.Azure.Functions.Extensions verweisen. Wenn noch Verweise auf diese vorhanden sind, sollten Sie sie entfernen.
Tipp
Ihre App hängt möglicherweise auch von Azure SDK Typen ab, entweder als Teil Ihrer Trigger und Bindungen oder als eigenständige Abhängigkeit. Sie sollten die Gelegenheit nutzen, um auch diese zu aktualisieren. Die neuesten Versionen der Funktionen-Erweiterungen sind mit den neuesten Versionen des Azure SDK für .NET kompatibel, wobei fast alle Pakete die Form Azure.* haben.
Datei „program.cs“
Bei der Migration zur Ausführung in einem isolierten Workerprozess müssen Sie ihrem Projekt die folgende Datei „program.cs“ hinzufügen:
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();
Dieses Beispiel enthält ASP.NET Core Integration, um die Leistung zu verbessern und ein vertrautes Programmiermodell bereitzustellen, wenn Ihre App HTTP-Trigger verwendet. Wenn Sie nicht beabsichtigen, HTTP-Trigger zu verwenden, können Sie den Aufruf ConfigureFunctionsWebApplication durch einen Aufruf ConfigureFunctionsWorkerDefaultsersetzen. In diesem Rahmen können Sie den Verweis auf Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore aus der Projektdatei entfernen. Um jedoch die beste Leistung zu erzielen, sollten Sie auch für Funktionen mit anderen Triggertypen FrameworkReference in ASP.NET Core beibehalten.
Die Datei Program.cs ersetzt jede Datei mit dem Attribut FunctionsStartup. Diese ist in der Regel eine Datei vom Typ Startup.cs. An den Stellen, an denen Ihr FunctionsStartup Code auf IFunctionsHostBuilder.Services verweisen würde, können Sie stattdessen Anweisungen innerhalb der .ConfigureServices()-Methode der HostBuilder in Ihrer Program.cs hinzufügen. Weitere Informationen zum Arbeiten mit Program.cs finden Sie unter "Start- und Konfiguration " im Leitfaden zum isolierten Arbeitsmodell.
Die zuvor beschriebenen Standardbeispiele Program.cs umfassen das Einrichten von Application Insights. In Ihrem Program.cs müssen Sie auch alle Protokollfilter konfigurieren, die für Protokolle gelten sollten, die aus Code in Ihrem Projekt stammen. Im isolierten Workermodell steuert die dateihost.json nur Ereignisse, die von der Hostlaufzeit der Funktionen ausgegeben werden. Wenn Sie in Program.cs keine Filterregeln konfigurieren, treten möglicherweise Unterschiede auf den Protokollebenen für verschiedene Kategorien in Ihren Telemetriedaten auf.
Obwohl Sie benutzerdefinierte Konfigurationsquellen als Teil des HostBuilderProjekts registrieren können, gelten diese in ähnlicher Weise nur für Code in Ihrem Projekt. Die Plattform benötigt außerdem Trigger- und Bindungskonfigurationen, die über die Anwendungseinstellungen, Key Vault-Referenzen oder App-Konfigurationsreferenzen bereitgestellt werden sollten.
Nachdem Sie alles von einer beliebigen vorhandenen FunctionsStartup in die Program.cs Datei verschoben haben, können Sie das FunctionsStartup Attribut und die Klasse löschen, auf die sie angewendet wurde.
Datei „local.settings.json“
Die Datei „local.settings.json“ wird nur bei lokaler Ausführung verwendet. Weitere Informationen finden Sie unter Datei für lokale Einstellungen.
Stellen Sie bei der Migration zu Version 4.x sicher, dass Ihre Datei „local.settings.json“ mindestens die folgenden Elemente enthält:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "AzureWebJobsStorageConnectionStringValue",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
}
}
Hinweis
Wenn Sie von der prozessinternen Ausführung zur Ausführung in einem isolierten Workerprozess migrieren, müssen Sie den FUNCTIONS_WORKER_RUNTIME-Wert in „dotnet-isolated“ ändern.
Datei „host.json“
In Ihrer Datei host.json sind keine Änderungen erforderlich. Wenn Ihre Application Insights-Konfiguration in dieser Datei jedoch aus Ihrem Prozessmodellprojekt stammt, möchten Sie möglicherweise andere Änderungen an Ihrer Program.cs Datei vornehmen. Die Datei host.json steuert nur die Protokollierung der Functions-Hostruntime, und im Modell mit isolierten Workern stammen einige dieser Protokolle direkt aus Ihrer Anwendung, sodass Sie mehr Kontrolle erhalten. Ausführliche Informationen zum Filtern dieser Protokolle finden Sie unter Verwalten von Protokollebenen im Modell mit isolierten Workern.
Änderungen von Klassennamen
Für einige wichtigen Klassen wurden die Namen zwischen den Versionen geändert. Diese Änderungen führen entweder zu Änderungen an .NET APIs oder zu Unterschieden zwischen prozessinternem und isoliertem Arbeitsprozess. Die folgende Tabelle gibt wichtige .NET Klassen an, die von Funktionen verwendet werden, die sich bei der Migration ändern können:
| .NET Core 3.1 | .NET 5 | .NET 8 |
|---|---|---|
FunctionName (Attribut) |
Function (Attribut) |
Function (Attribut) |
ILogger |
ILogger |
ILogger, ILogger<T> |
HttpRequest |
HttpRequestData |
HttpRequestData, HttpRequest (mit ASP.NET Core integration) |
IActionResult |
HttpResponseData |
HttpResponseData, IActionResult (mit ASP.NET Core integration) |
FunctionsStartup (Attribut) |
Verwendet stattdessen Program.cs |
Verwendet stattdessen Program.cs |
Es kann auch Unterschiede bei Klassennamen in Bindungen geben. Weitere Informationen finden Sie im Referenzartikel für die jeweilige Bindung.
Weitere Codeänderungen
In diesem Abschnitt werden weitere Codeänderungen genannt, die während der Migration berücksichtigt werden müssen. Diese Änderungen werden von allen Anwendungen nicht benötigt, aber Sie sollten bewerten, ob sie für Ihre Szenarien relevant sind. Überprüfen Sie unbedingt die Breaking Changes zwischen 3.x und 4.x auf weitere Änderungen, die Sie möglicherweise an Ihrem Projekt vornehmen müssen.
JSON-Serialisierung
Standardmäßig verwendet das isolierte Workermodell System.Text.Json für die JSON-Serialisierung . Informationen zum Anpassen von Serialisierungsoptionen oder zum Wechseln zu JSON.NET (Newtonsoft.Json) finden Sie unter Customizing JSON serialization.
Application Insights: Protokollebenen und -filterung
Protokolle können sowohl von der Functions-Hostrumtime als auch von Code in Ihrem Projekt an Application Insights gesendet werden. Mit demhost.json können Sie Regeln für die Hostprotokollierung konfigurieren, aber um Protokolle aus Ihrem Code zu steuern, müssen Sie Filterregeln als Teil Ihrer Program.cs konfigurieren. Ausführliche Informationen zum Filtern dieser Protokolle finden Sie unter Verwalten von Protokollebenen im Modell mit isolierten Workern.
HTTP-Triggervorlage
Die Unterschiede zwischen prozessinternen und isolierten Workerprozessen können in durch HTTP ausgelösten Funktionen beobachtet werden. Die HTTP-Triggervorlage für Version 3.x (prozessintern) sieht wie im folgenden Beispiel aus:
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);
}
}
}
Die HTTP-Triggervorlage für die migrierte Version sieht wie im folgenden Beispiel aus:
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"]}!");
}
}
}
So aktualisieren Sie Ihr Projekt auf Azure Functions 4.x:
Aktualisieren Sie Ihre lokale Installation von Azure Functions Core Tools auf Version 4.x.
Aktualisieren Sie das Azure Functions-Erweiterungsbundle Ihrer App auf 2.x oder höher. Weitere Informationen finden Sie unter Breaking Changes.
Wechseln Sie bei Bedarf zu einer der Java-Versionen, die unter Version 4.x unterstützt werden.
Aktualisieren Sie die Datei
POM.xmlder App so, dass die EinstellungFUNCTIONS_EXTENSION_VERSIONin~4geändert wird, wie im folgenden Beispiel gezeigt:<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>
- Wechseln Sie bei Bedarf zu einer der Node.js-Versionen, die in Version 4.x unterstützt werden.
- Nutzen Sie diese Gelegenheit, um ein Upgrade auf PowerShell 7.2 durchzuführen, das empfohlen wird. Weitere Informationen finden Sie unter PowerShell-Versionen.
- Wenn Sie Python 3.6 verwenden, wechseln Sie zu einer der unterstützten Versionen.
Ausführen des Vorupgrade-Validierungssteuerelements
Azure Functions bietet einen Vorupgrade-Validator, mit dem Sie potenzielle Probleme beim Migrieren ihrer Funktions-App zu 4.x identifizieren können. So führen Sie das Vorupgrade-Validierungssteuerelement aus:
Navigieren Sie im Azure-Portal zu Ihrer Funktions-App.
Öffnen Sie die Seite Diagnose und Problembehandlung.
Beginnen Sie in der Funktions-App-Diagnose mit der Eingabe von
Functions 4.x Pre-Upgrade Validator, und wählen Sie es dann aus der Liste aus.Überprüfen Sie nach Abschluss der Überprüfung die Empfehlungen, und behandeln Sie alle Probleme in Ihrer App. Wenn Sie Änderungen an Ihrer App vornehmen müssen, überprüfen Sie die Änderungen anhand der Version 4.x der Funktionslaufzeit, entweder lokal unter Verwendung der Azure Functions Core Tools v4 oder durch Verwendung eines Staging-Slots.
Aktualisieren Sie Ihre Funktions-App in Azure
Sie müssen die Laufzeit des Funktions-App-Hosts in Azure auf Version 4.x aktualisieren, bevor Sie Ihr migriertes Projekt veröffentlichen. Die vom Functions-Host verwendete Runtimeversion wird von der FUNCTIONS_EXTENSION_VERSION-Anwendungseinstellung gesteuert, aber in einigen Fällen müssen auch andere Einstellungen aktualisiert werden. Sowohl Codeänderungen als auch Änderungen an Anwendungseinstellungen erfordern einen Neustart Ihrer Funktions-App.
Die einfachste Möglichkeit besteht darin, ein Update ohne Slots durchzuführen und Ihr App-Projekt dann erneut zu veröffentlichen. Sie können auch die Downtime in Ihrer App minimieren und das Rollback vereinfachen, indem Sie ein Update mithilfe von Slots durchführen.
Aktualisieren ohne Slots
Die einfachste Möglichkeit zum Aktualisieren auf v4.x ist das Festlegen der FUNCTIONS_EXTENSION_VERSION Anwendungseinstellung auf ~4 in Ihrer Funktions-App in Azure. Sie müssen ein anderes Verfahren an einem Standort mit Slots ausführen.
az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
Sie müssen auch eine andere Einstellung festlegen, die sich zwischen Windows und Linux unterscheidet.
Wenn Sie auf Windows arbeiten, müssen Sie auch .NET 8.0 aktivieren, das von Version 4.x der Laufzeitumgebung benötigt wird.
az functionapp config set --net-framework-version v8.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>
.NET 6 ist für Funktions-Apps in jeder Sprache erforderlich, die auf Windows ausgeführt wird.
Ersetzen Sie in diesem Beispiel <APP_NAME> durch den Namen Ihrer Funktions-App und <RESOURCE_GROUP_NAME> durch den Namen der Ressourcengruppe.
Sie können Ihr App-Projekt jetzt erneut veröffentlichen, das für die Ausführung in Version 4.x migriert wurde.
Aktualisieren mit Slots
Die Verwendung von Bereitstellungsslots ist eine gute Möglichkeit, Ihre Funktions-App von einer früheren Version auf die v4.x-Runtime zu aktualisieren. Mithilfe eines Stagingslos können Sie Ihre App auf der neuen Runtimeversion im Stagingslot ausführen und nach der Überprüfung zur Produktion wechseln. Slots bieten auch eine Möglichkeit, Downtime während des Updates zu minimieren. Wenn Sie Downtime minimieren müssen, führen Sie die Schritte unter Update mit minimaler Downtime aus.
Nachdem Sie Ihre App im aktualisierten Slot überprüft haben, können Sie die App und neue Versionseinstellungen in der Produktion übernehmen. Dieser Wechsel erfordert die Einstellung WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 im Produktionsslot. Wie Sie diese Einstellung hinzufügen, wirkt sich auf die Länge der für das Update erforderlichen Downtime aus.
Standardupdate
Wenn Ihre Funktions-App mit Slotunterstützung die Downtime eines vollständigen Neustarts verarbeiten kann, können Sie die WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS-Einstellung direkt im Produktionsslot aktualisieren. Da das Ändern dieser Einstellung direkt im Produktionsslot einen Neustart verursacht, der sich auf die Verfügbarkeit auswirkt, sollten Sie diese Änderung zu einem Zeitpunkt mit reduziertem Datenverkehr in Betracht ziehen. Anschließend können Sie die aktualisierte Version aus dem Stagingslot übernehmen.
Das Update-AzFunctionAppSetting-PowerShell-Cmdlet unterstützt derzeit keine Slots. Sie müssen Azure CLI oder das Azure Portal verwenden.
Verwenden Sie den folgenden Befehl, um im Produktionslot
WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0festzulegen:az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>Ersetzen Sie in diesem Beispiel
<APP_NAME>durch den Namen Ihrer Funktions-App und<RESOURCE_GROUP_NAME>durch den Namen der Ressourcengruppe. Dieser Befehl bewirkt, dass die im Produktionslot ausgeführte App neu gestartet wird.Verwenden Sie den folgenden Befehl, um auch im Stagingslot
WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONSfestzulegen:az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME>Verwenden Sie den folgenden Befehl, um
FUNCTIONS_EXTENSION_VERSIONzu ändern und den Stagingslot auf die neue Runtimeversion zu aktualisieren:az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME>Version 4.x der Funktionslaufzeit erfordert .NET 6 in Windows. Unter Linux müssen .NET-Apps auch auf .NET 6 aktualisiert werden. Verwenden Sie den folgenden Befehl, damit die Laufzeit auf .NET 6 ausgeführt werden kann:
Wenn Sie unter Windows arbeiten, müssen Sie auch .NET 8.0 aktivieren, da dieses von Version 4.x der Laufzeitumgebung benötigt wird.
az functionapp config set --net-framework-version v8.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>.NET 6 ist für Funktions-Apps in jeder Sprache erforderlich, die auf Windows ausgeführt wird.
Ersetzen Sie in diesem Beispiel
<APP_NAME>durch den Namen Ihrer Funktions-App und<RESOURCE_GROUP_NAME>durch den Namen der Ressourcengruppe.Wenn für Ihr Codeprojekt Updates erforderlich sind, die auf Version 4.x ausgeführt werden sollen, stellen Sie diese Updates jetzt für den Stagingslot bereit.
Vergewissern Sie sich vor dem Austausch, dass Ihre Funktions-App ordnungsgemäß in der aktualisierten Stagingumgebung ausgeführt wird.
Verwenden Sie den folgenden Befehl, um den aktualisierten Stagingslot in die Produktion zu übernehmen:
az functionapp deployment slot swap -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME> --target-slot production
Update mit minimaler Downtime
Um die Downtime in Ihrer Produktions-App zu minimieren, können Sie die WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS-Einstellung vom Stagingslot in die Produktion übernehmen. Danach können Sie von einem vordefinierten Stagingslot die aktualisierte Version übernehmen.
Verwenden Sie den folgenden Befehl, um
WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0im Stagingslot festzulegen:az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME>Verwenden Sie die folgenden Befehle, um den Slot mit der neuen Einstellung in die Produktion zu übernehmen und gleichzeitig die Versionseinstellung im Stagingslot wiederherzustellen.
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>Während der Zeit zwischen dem Austausch und der Runtimeversion, die beim Staging wiederhergestellt wird, werden möglicherweise Fehler vom Stagingslot angezeigt. Dieser Fehler kann auftreten, weil die
WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0-Einstellung im Staging entfernt wird, wennFUNCTIONS_EXTENSION_VERSIONwährend eines Austausches nur im Staging vorhanden ist. Ohne die Versionseinstellung befindet sich Ihr Slot in einem schlechten Zustand. Wenn Sie die Version im Stagingslot direkt nach dem Austausch aktualisieren, sollte der Slot wieder in einen guten Zustand versetzt werden, damit Sie bei Bedarf ein Rollback Ihrer Änderungen durchführen können. Ein Rollback des Austausches erfordert jedoch auch, dass SieWEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0direkt aus der Produktion entfernen, bevor der Austausch zurückgesetzt wird, um die gleichen Fehler, die im Staging auftreten, in der Produktion zu verhindern. Diese Änderung in der Produktionseinstellung würde dann einen Neustart verursachen.Verwenden Sie den folgenden Befehl, um
WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0wieder im Stagingslot festzulegen:az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME>An diesem Punkt ist für beide Slots
WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0festgelegt.Verwenden Sie den folgenden Befehl, um
FUNCTIONS_EXTENSION_VERSIONzu ändern und den Stagingslot auf die neue Runtimeversion zu aktualisieren:az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME>Version 4.x der Funktionslaufzeit erfordert .NET 6 in Windows. Unter Linux müssen .NET-Apps auch auf .NET 6 aktualisiert werden. Verwenden Sie den folgenden Befehl, damit die Laufzeit auf .NET 6 ausgeführt werden kann:
Wenn Sie auf Windows arbeiten, müssen Sie auch .NET 8.0 aktivieren, das von der Version 4.x der Laufzeitumgebung benötigt wird.
az functionapp config set --net-framework-version v8.0 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>.NET 6 ist für Funktions-Apps in jeder Sprache erforderlich, die auf Windows ausgeführt wird.
Ersetzen Sie in diesem Beispiel
<APP_NAME>durch den Namen Ihrer Funktions-App und<RESOURCE_GROUP_NAME>durch den Namen der Ressourcengruppe.Wenn für Ihr Codeprojekt Updates erforderlich sind, die auf Version 4.x ausgeführt werden sollen, stellen Sie diese Updates jetzt für den Stagingslot bereit.
Vergewissern Sie sich vor dem Austausch, dass Ihre Funktions-App ordnungsgemäß in der aktualisierten Stagingumgebung ausgeführt wird.
Verwenden Sie den folgenden Befehl, um den aktualisierten und vordefinierten Stagingslot in die Produktion zu übernehmen:
az functionapp deployment slot swap -g <RESOURCE_GROUP_NAME> -n <APP_NAME> --slot <SLOT_NAME> --target-slot production
Wichtige Unterschiede zwischen 3.x und 4.x
Nachfolgend finden Sie wichtige Breaking Changes, die vor dem Upgrade einer 3.x-App auf 4.x beachtet werden müssen, einschließlich sprachspezifischer Breaking Changes. Eine vollständige Liste finden Sie unter Azure Functions GitHub Issues mit dem Label Breaking Change: Approved.
Wenn Ihre Programmiersprache nicht angezeigt wird, wählen Sie sie oben auf der Seite aus.
Typ
Azure Functions Proxies war eine Funktion in den Versionen 1.x bis 3.x der Azure Functions Laufzeit. Dieses Feature wird in Version 4.x nicht unterstützt. Weitere Informationen finden Sie unter Serverless REST-APIs mit Azure Functions.
Die Protokollierung bei Azure Storage mit AzureWebJobsDashboard wird in 4.x nicht mehr unterstützt. Es empfiehlt sich, stattdessen Application Insights zu verwenden. (#1923)
Azure Functions 4.x erzwingt jetzt minimum-Versionsanforderungen für Erweiterungen. Führen Sie ein Update auf die neueste Version der betroffenen Erweiterungen durch. Für Nicht-.NET-Sprachen aktualisieren Sie auf Erweiterungspaket Version 2.x oder höher. (#1987)
Standardmäßige und maximale Timeouts werden nun in Version 4.x für Funktions-Apps erzwungen, die unter Linux im Rahmen eines Verbrauchsplans ausgeführt werden. (#1915)
Azure Functions 4.x verwendet
Azure.IdentityundAzure.Security.KeyVault.Secretsfür den Key Vault-Anbieter und hat die Verwendung von Microsoft.Azure.KeyVault verworfen. Weitere Informationen zum Konfigurieren von Funktions-App-Einstellungen finden Sie in der option Key Vault in Manage key storage. (#2048)Funktions-Apps mit gemeinsam genutzten Speicherkonten können nicht mehr gestartet werden, wenn ihre Host-IDs identisch sind. Weitere Informationen finden Sie unter Überlegungen zur Host-ID. (#2049)
Azure Functions 4.x unterstützt neuere Versionen von .NET. Eine vollständige Liste der Versionen finden Sie unter Supported languages in Azure Functions.
InvalidHostServicesExceptionist jetzt ein schwerwiegender Fehler. (#2045)EnableEnhancedScopesist standardmäßig aktiviert. (#1954)Entfernt
HttpClientals registrierten Dienst. (#1911)
- Standardthreadanzahl wurde aktualisiert. Funktionen, die nicht threadsicher sind oder eine hohe Arbeitsspeicherauslastung mit sich bringen, können betroffen sein. (#1962)