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.
Die Azure Functions-Version 4.x bietet eine hohe Abwärtskompatibilität mit der 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 den Functions-Runtimeversionen finden Sie unter Übersicht über die Runtimeversionen von Azure Functions.
Wichtig
Seit dem 13. Dezember 2022 haben Funktions-Apps, die in den Versionen 2.x und 3.x der Azure Functions-Runtime ausgeführt werden, das Ende des erweiterten Supports erreicht. Weitere Informationen finden Sie unter Eingestellte Versionen.
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
Auswählen der .NET-Zielversion
Bei Version 3.x der Functions-Runtime hat Ihre C#-Functions-App als Zielversion .NET Core 3.1 unter Verwendung des In-Process-Modells bzw. .NET 5 unter Verwendung des isolierten Workermodells.
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 der Functions-Version 4.x unterstützt werden:
| .NET-Version | Releasetyp der offiziellen .NET-Supportrichtlinie | 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 die Versionen LTS (Long Term Support) und STS (Standard Term Support) von .NET sowie .NET Framework. Das In-Process-Modell unterstützt nur LTS-Releases von .NET, endend mit .NET 8. Einen umfassenden Feature- und Funktionsvergleich zwischen den beiden Modellen finden Sie unter Unterschiede zwischen einem In-Process- und einem isolierten Workerprozess in .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 End-of-Support-Datum vom 12. Mai 2026. Im .NET 9-Dienstfenster 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, für das Modell mit isolierten Workern ein Update auf .NET 8 durchzufü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 der bei der Migration zu Version 4.x erforderliche Aufwand. Außerdem bietet das Modell mit isolierten Workern Ihrer App zusätzliche Vorteile, einschließlich der Möglichkeit, zukünftige Versionen von .NET einfacher als Ziel zu nutzen. 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
Sofern noch nicht geschehen, ermitteln Sie mithilfe von Azure PowerShell die Liste der Apps, die in Ihrem aktuellen Azure-Abonnement migriert werden müssen.
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 und umfassend mit Version 4.x der Azure Functions Core Tools.
- Führen Sie das Vorupgrade-Validierungssteuerelement für die in Azure gehostete App aus, und beheben Sie alle identifizierten Probleme.
- Aktualisieren Sie Ihre Funktions-App in Azure auf die neue Version. Wenn Sie Downtime minimieren müssen, sollten Sie die Verwendung eines Stagingslots in Betracht ziehen, um Ihre migrierte App in Azure mit der neuen Runtimeversion 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 in einer niedrigeren Version zu veröffentlichen, werden Sie aufgefordert, Visual Studio das Update der Funktions-App auf Version 4.x während der Bereitstellung zu ermöglichen. 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 (prozessinterner oder isolierter Workerprozess) entspricht.
Tipp
Wenn Sie mithilfe des isolierten Workermodells 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 in 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.PackageReferenceden Paketverweis durchMicrosoft.NET.Sdk.Functionsmit den folgenden Verweisen:<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
Microsoft.Azure.WebJobs.*-Namespaces. 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 |
| Langlebige Funktionen | Ersetzen Sie Verweise aufMicrosoft.Azure.WebJobs.Extensions.DurableTaskdurch die neueste Version von Microsoft.Azure.Functions.Worker.Extensions.DurableTask |
| Langlebige Funktionen (SQL-Speicheranbieter) |
Ersetzen Sie Verweise aufMicrosoft.DurableTask.SqlServer.AzureFunctionsdurch die neueste Version von Microsoft.Azure.Functions.Worker.Extensions.DurableTask.SqlServer |
| Langlebige Funktionen (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.
Bei der Service Bus-Erweiterung gibt es beispielsweise Ä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 darf auf keine Pakete in den Microsoft.Azure.WebJobs.*-Namespaces oder in Microsoft.Azure.Functions.Extensions verweisen. Wenn noch Verweise auf diese vorhanden sind, sollten Sie sie entfernen.
Tipp
Ihre App kann auch von Azure SDK-Typen abhängig sein, 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 Functions-Erweiterungen können mit den neuesten Versionen des Azure SDK für .NET verwendet werden, wobei fast alle Pakete in der Form Azure.* vorliegen.
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 umfasst 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 Fall 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 für FrameworkReference 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 Bindungskonfiguration, und dies sollte über die Anwendungseinstellungen, Key Vault-Verweise oder App-Konfigurationsreferenzfeatures bereitgestellt werden.
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 sind das Ergebnis von Änderungen in .NET-APIs oder von Unterschieden zwischen prozessinternen und isolierten Workerprozess. In der folgenden Tabelle werden die wichtigsten .NET-Klassen aufgeführt, die von Functions verwendet werden und 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 (unter Verwendung der ASP.NET Core-Integration) |
IActionResult |
HttpResponseData |
HttpResponseData, IActionResult (unter Verwendung der 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 Anpassen der JSON-Serialisierung.
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 der Azure Functions Core Tools auf Version 4.x.
Aktualisieren Sie das Azure Functions-Erweiterungenbundle 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 in 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 ein Vorupgrade-Validierungssteuerelement, um potenzielle Probleme beim Migrieren der Funktions-App auf 4.x zu erkennen. 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 Functions-Runtime, entweder lokal mithilfe der Azure Functions Core Tools v4 oder mithilfe eines Stagingslots.
Aktualisieren Ihrer Funktions-App in Azure
Sie müssen die Runtime 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 Update auf v4.x besteht darin, die FUNCTIONS_EXTENSION_VERSION-Anwendungseinstellung in Ihrer Funktions-App in Azure auf ~4 festzulegen. 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 für Windows und Linux unterscheidet.
Bei der Ausführung unter Windows müssen Sie auch .NET 8.0 aktivieren, das von Version 4.x der Laufzeit 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 unter 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 Functions-Runtime erfordert .NET 6 unter Windows. In Linux müssen .NET-Apps auch auf .NET 6 aktualisiert werden. Verwenden Sie den folgenden Befehl, damit die Runtime unter .NET 6 ausgeführt werden kann:
Bei der Ausführung unter Windows müssen Sie auch .NET 8.0 aktivieren, das von Version 4.x der Laufzeit 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 unter 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 Functions-Runtime erfordert .NET 6 unter Windows. In Linux müssen .NET-Apps auch auf .NET 6 aktualisiert werden. Verwenden Sie den folgenden Befehl, damit die Runtime unter .NET 6 ausgeführt werden kann:
Bei der Ausführung unter Windows müssen Sie auch .NET 8.0 aktivieren, das von Version 4.x der Laufzeit 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 unter 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 mit der Bezeichnung Breaking Change: Approved.
Wenn Ihre Programmiersprache nicht angezeigt wird, wählen Sie sie oben auf der Seite aus.
Typ
Azure Functions Proxies war ein Feature 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.
Sich bei Azure Storage mithilfe von AzureWebJobsDashboard anzumelden, wird in 4.x nicht mehr unterstützt. Es empfiehlt sich, stattdessen Application Insights zu verwenden. (#1923)
Azure Functions 4.x erzwingt nun Mindestversionsanforderungen für Erweiterungen. Führen Sie ein Update auf die neueste Version der betroffenen Erweiterungen durch. Für andere Sprachen als .NET führen Sie ein Update auf Version 2.x oder höher des Erweiterungspakets durch. (#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. Die Verwendung von „Microsoft.Azure.KeyVault“ ist veraltet. Weitere Informationen zum Konfigurieren der Einstellungen für Funktions-Apps finden Sie in Verwalten von Schlüsselspeichern unter der Schlüsseltresoroption. (#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 Unterstützte Sprachen 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)
Python 3.6 wird von Azure Functions 4.x nicht unterstützt. (#1999)
Shared Memory-Übertragung ist standardmäßig aktiviert. (#1973)
Standardthreadanzahl wurde aktualisiert. Funktionen, die nicht threadsicher sind oder eine hohe Arbeitsspeicherauslastung mit sich bringen, können betroffen sein. (#1962)