Aracılığıyla paylaş


Uygulamaları Azure İşlevleri sürüm 1.x'ten sürüm 4.x'e geçirme

Önemli

Java, Azure İşlevleri çalışma zamanının 1.x sürümü tarafından desteklenmez. Belki de Java uygulamanızı 3.x sürümünden 4.x sürümüne geçirmek istiyorsunuz. Sürüm 1.x işlev uygulamasını geçiriyorsanız yukarıdaki C# veya JavaScript'i seçin.

Önemli

TypeScript, Azure İşlevleri çalışma zamanının 1.x sürümü tarafından desteklenmez. Belki de TypeScript uygulamanızı 3.x sürümünden 4.x sürümüne geçirmek istiyorsunuz. Sürüm 1.x işlev uygulamasını geçiriyorsanız yukarıdaki C# veya JavaScript'i seçin.

Önemli

PowerShell, Azure İşlevleri çalışma zamanının 1.x sürümü tarafından desteklenmez. Bunun yerine PowerShell uygulamanızı 3.x sürümünden 4.x sürümüne geçirmek istiyorsunuz olabilir. Sürüm 1.x işlev uygulamasını geçiriyorsanız yukarıdaki C# veya JavaScript'i seçin.

Önemli

Python, Azure İşlevleri çalışma zamanının 1.x sürümü tarafından desteklenmez. Belki de Python uygulamanızı 3.x sürümünden 4.x sürümüne geçirmek istiyorsunuz. Sürüm 1.x işlev uygulamasını geçiriyorsanız yukarıdaki C# veya JavaScript'i seçin.

Önemli

Azure İşlevleri çalışma zamanının 1.x sürümü için destek 14 Eylül 2026'da sona erecektir. Bu makaledeki yönergeleri izleyerek uygulamalarınızı 4.x sürümüne geçirmenizi kesinlikle öneririz.

Bu makalede, İşlevler çalışma zamanının 4.x sürümünde çalışacak şekilde işlev uygulamanızı güvenli bir şekilde geçirme işleminde size yol gösterilir. Proje geçiş yönergeleri dile bağlı olduğundan, makalenin üst kısmındaki seçiciden geliştirme dilinizi seçtiğinizden emin olun.

Azure Stack Hub'da çalışma zamanının 1.x sürümünü çalıştırıyorsanız bkz . Öncelikle Azure Stack Hub ile ilgili önemli noktalar.

Geçirecek işlev uygulamalarını tanımlama

Aboneliğinizde şu anda 1.x sürümünü hedefleyen işlev uygulamalarının listesini oluşturmak için aşağıdaki PowerShell betiğini kullanın:

$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

Hedef .NET sürümünüzü seçin

İşlevler çalışma zamanının 1.x sürümünde, C# işlev uygulamanız .NET Framework'i hedefler.

İşlev uygulamanızı geçirirken hedef .NET sürümünü seçme fırsatınız vardır. C# projenizi İşlevler sürüm 4.x tarafından desteklenen aşağıdaki .NET sürümlerinden biriyle güncelleştirebilirsiniz:

.NET sürümü .NET Resmi Destek İlkesi sürüm türü İşlevler işlem modeli1,2
.NET 9 Önizleme3 Yalıtılmış çalışan modeli
.NET 8 LTS (destek sonu 10 Kasım 2026) Yalıtılmış çalışan modeli,
İşlem içi model2
.NET 6 LTS (destek sonu 12 Kasım 2024) Yalıtılmış çalışan modeli,
İşlem içi model2
.NET Framework 4.8 İlkeye bakın Yalıtılmış çalışan modeli

1 Yalıtılmış çalışan modeli , .NET Framework'ün yanı sıra .NET'in Uzun Vadeli Destek (LTS) ve Standart Terim Desteği (STS) sürümlerini destekler. İşlem içi model yalnızca .NET 8 ile biten .NET'in LTS sürümlerini destekler. İki model arasında tam özellik ve işlevsellik karşılaştırması için bkz. .NET Azure İşlevleri çalışan işlemi ile yalıtma arasındaki farklar.

2 İşlem içi model için destek 10 Kasım 2026'da sona eriyor. Daha fazla bilgi için bu destek duyurusna bakın. Sürekli tam destek için uygulamalarınızı yalıtılmış çalışan modeline geçirmeniz gerekir.

3 Destek, geçerli kısıtlamalar ve önizleme sürümünü kullanma yönergeleri hakkında ayrıntılı bilgi için yalıtılmış çalışan modelinde .NET sürümlerini önizleme bölümüne bakın.

İpucu

Uygulamanız yalnızca .NET Framework tarafından kullanılabilen bir kitaplığa veya API'ye bağımlı değilse, yalıtılmış çalışan modelinde .NET 8'e güncelleştirmenizi öneririz. Sürüm 1.x'te birçok uygulama .NET Framework'ü hedeflediğinden, yalnızca bunlar oluşturulduğunda bu kullanılabilirdi. .NET'in daha yeni sürümlerinde ek özellikler sağlanır ve uygulamanız bir bağımlılık nedeniyle .NET Framework'te kalmaya zorlanmazsa, daha yeni bir sürümü hedeflemeniz gerekir. .NET 8, .NET'ten en uzun destek penceresine sahip tam olarak yayımlanan sürümdür.

Bunun yerine işlem içi modeli kullanmayı seçebilirsiniz, ancak önlenebilirse bu önerilmez. İşlem içi model desteği 10 Kasım 2026'da sona ereceğinden, bundan önce yalıtılmış çalışan modeline geçmeniz gerekir. 4.x sürümüne geçiş sırasında bu işlem yapılması gereken toplam çabayı azaltır ve yalıtılmış çalışan modeli, .NET'in gelecekteki sürümlerini daha kolay hedefleme özelliği de dahil olmak üzere uygulamanıza ek avantajlar sağlar. Yalıtılmış çalışan modeline geçiyorsanız, .NET Yükseltme Yardımcısı sizin için gerekli kod değişikliklerinin çoğunu da işleyebilir.

Bu kılavuz .NET 6 için belirli örnekler sunmaz. Bu sürümü hedeflemeniz gerekiyorsa .NET 8 örneklerini uyarlayabilirsiniz.

Geçiş için hazırlanma

Henüz yapmadıysanız Azure PowerShell kullanarak geçerli Azure Aboneliğinizde geçirilmesi gereken uygulamaların listesini belirleyin.

Bir uygulamayı İşlevler çalışma zamanının 4.x sürümüne geçirmeden önce aşağıdaki görevleri gerçekleştirmeniz gerekir:

  1. 1.x sürümünden sonraki davranış değişiklikleri listesini gözden geçirin. Sürüm 1.x'ten sürüm 4.x'e geçiş de bağlamaları etkileyebilir.
  2. Yerel projenizi sürüm 4.x'e geçirmek için Yerel projenizi geçirme bölümünde yer alan adımları tamamlayın.
  3. Projenizi geçirdikten sonra, Azure İşlevleri Core Tools'un 4.x sürümünü kullanarak uygulamayı yerel olarak tam olarak test edin.
  4. Azure'daki işlev uygulamanızı yeni sürüme güncelleştirin. Kapalı kalma süresini en aza indirmeniz gerekiyorsa, azure'da geçirilen uygulamanızı yeni çalışma zamanı sürümünde test etmek ve doğrulamak için bir hazırlama yuvası kullanmayı göz önünde bulundurun. Ardından uygulamanızı güncelleştirilmiş sürüm ayarlarıyla üretim yuvasına dağıtabilirsiniz. Daha fazla bilgi için bkz . Yuvaları kullanarak güncelleştirme.
  5. Geçirilen projenizi güncelleştirilmiş işlev uygulamasında yayımlayın.

Visual Studio'yu kullanarak bir sürüm 4.x projesini daha düşük bir sürümde mevcut bir işlev uygulamasına yayımladığınızda, Visual Studio'nun dağıtım sırasında işlev uygulamasını 4.x sürümüne güncelleştirmesine izin vermeniz istenir. Bu güncelleştirme, Yuva olmadan güncelleştirme bölümünde tanımlanan işlemi kullanır.

Yerel projenizi geçirme

Aşağıdaki bölümlerde, İşlevler sürüm 4.x'te desteklenen .NET sürümlerinden birinde çalışabilmek için C# proje dosyalarınızda yapmanız gereken güncelleştirmeler açıklanmaktadır. Gösterilen güncelleştirmeler çoğu proje için ortak olan güncelleştirmelerdir. Proje kodunuz, özellikle özel NuGet paketleri kullanılırken bu makalede belirtilmeyen güncelleştirmeleri gerektirebilir.

C# işlev uygulamasını İşlevler çalışma zamanının 1.x sürümünden 4.x sürümüne geçirmek için proje kodunuzda değişiklik yapmanız gerekir. Bu değişikliklerin çoğu C# dilindeki ve .NET API'lerindeki değişikliklerin bir sonucudur.

Hedef .NET sürümünüzle ve istenen işlem modeliyle (işlem içi veya yalıtılmış çalışan işlemi) eşleşen sekmeyi seçin.

İpucu

Yalıtılmış çalışan modelini kullanarak .NET'in LTS veya STS sürümüne geçiyorsanız, .NET Yükseltme Yardımcısı aşağıdaki bölümlerde belirtilen değişikliklerin çoğunu otomatik olarak yapmak için kullanılabilir.

Proje dosyası

Aşağıdaki örnek, 1.x sürümünde çalışan bir .csproj proje dosyasıdır:

<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>

Bu XML dosyasını İşlevler sürüm 4.x'te çalışacak şekilde güncelleştirmek için aşağıdaki yordamlardan birini kullanın:

Bu adımlarda yerel bir C# projesi varsayılır ve uygulamanız bunun yerine C# betiği (.csx dosyalar) kullanıyorsa devam etmeden önce proje modeline dönüştürmeniz gerekir.

XML proje dosyasında aşağıdaki değişiklikler gereklidir .csproj :

  1. değerini PropertyGroupayarlayın.TargetFramework için net8.0.

  2. değerini PropertyGroupayarlayın.AzureFunctionsVersion için v4.

  3. öğesine aşağıdaki OutputType öğeyi PropertyGroupekleyin:

    <OutputType>Exe</OutputType>
    
  4. içinde ItemGroup.PackageReference listesinde, paket başvurusını Microsoft.NET.Sdk.Functions aşağıdaki başvurularla değiştirin:

      <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" />
    

    Ad alanları içindeki Microsoft.Azure.WebJobs.* diğer paketlere yapılan başvuruları not edin. Sonraki bir adımda bu paketleri değiştireceksiniz.

  5. Aşağıdaki yeni ItemGroupöğesini ekleyin:

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

Bu değişiklikleri yaptıktan sonra güncelleştirilmiş projeniz aşağıdaki örnekteki gibi görünmelidir:

<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 ve ad alanı değişiklikleri

Geçiş yaptığınız modele bağlı olarak, uygulamanızın başvurabileceği paketleri güncelleştirmeniz veya değiştirmeniz gerekebilir. Hedef paketleri benimsediğinizde, using deyimlerinin ve başvurabileceğiniz bazı türlerin ad alanını güncelleştirmeniz gerekir. Bu ad alanı değişikliklerinin deyimler üzerindeki using etkisini bu makalenin devamında http tetikleyici şablonu örneklerinde görebilirsiniz.

Henüz yapmadıysanız, projenizi aşağıdakilerin en son kararlı sürümlerine başvuracak şekilde güncelleştirin:

Uygulamanızın kullandığı tetikleyicilere ve bağlamalara bağlı olarak, uygulamanızın farklı bir paket kümesine başvurması gerekebilir. Aşağıdaki tabloda, en yaygın kullanılan uzantılardan bazılarının yerine geçenler gösterilmektedir:

Senaryo Paket başvurularında yapılan değişiklikler
Süreölçer tetikleyicisi Ekle
Microsoft.Azure.Functions.Worker.Extensions.Timer
Depolama bağlamaları Replace
Microsoft.Azure.WebJobs.Extensions.Storage
örneklerini şununla değiştirin:
Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs,
Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues ve
Microsoft.Azure.Functions.Worker.Extensions.Tables
Blob bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.Storage.Blobs
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs
Kuyruk bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.Storage.Queues
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues
Tablo bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.Tables
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.Tables
Cosmos DB bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.CosmosDB
ve/veya
Microsoft.Azure.WebJobs.Extensions.DocumentDB
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.CosmosDB
Service Bus bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.ServiceBus
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.ServiceBus
Event Hubs bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.EventHubs
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.EventHubs
Event Grid bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.EventGrid
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.EventGrid
SignalR Hizmeti bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.SignalRService
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.SignalRService
Dayanıklı İşlevler Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.DurableTask
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.DurableTask
Dayanıklı İşlevler
(SQL depolama sağlayıcısı)
Başvuruları şununla değiştirin:
Microsoft.DurableTask.SqlServer.AzureFunctions
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.SqlServer
Dayanıklı İşlevler
(Netherite depolama sağlayıcısı)
Başvuruları şununla değiştirin:
Microsoft.Azure.DurableTask.Netherite.AzureFunctions
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.Netherite
SendGrid bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.SendGrid
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.SendGrid
Kafka bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.Kafka
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.Kafka
RabbitMQ bağlamaları Başvuruları şununla değiştirin:
Microsoft.Azure.WebJobs.Extensions.RabbitMQ
en son sürümüyle
Microsoft.Azure.Functions.Worker.Extensions.RabbitMQ
Bağımlılık ekleme
ve başlangıç yapılandırması
Başvurularını kaldırma
Microsoft.Azure.Functions.Extensions
(Yalıtılmış çalışan modeli bu işlevi varsayılan olarak sağlar.)

Dikkate alınacak uzantıların tam listesi için desteklenen bağlamalar bölümüne bakın ve yalıtılmış işlem modeline yönelik tam yükleme yönergeleri için her uzantının belgelerine bakın. Hedeflediğiniz paketlerin en son kararlı sürümünü yüklediğinizden emin olun.

İpucu

Bu işlem sırasında uzantı sürümlerinde yapılan tüm değişiklikler dosyanızı da güncelleştirmenizi host.json gerektirebilir. Kullandığınız her uzantının belgelerini okuduğunuzdan emin olun. Örneğin, Service Bus uzantısında 4.x ve 5.x sürümleri arasındaki yapıda hataya neden olan değişiklikler vardır. Daha fazla bilgi için bkz. Azure İşlevleri için Azure Service Bus bağlamaları.

Yalıtılmış çalışan modeli uygulamanız veya Microsoft.Azure.Functions.Extensionsad alanları içindeki hiçbir pakete Microsoft.Azure.WebJobs.* başvurmamalıdır. Bunlara yönelik kalan başvurularınız varsa, bunlar kaldırılmalıdır.

İpucu

Uygulamanız, tetikleyicilerinizin ve bağlamalarınızın bir parçası olarak veya tek başına bağımlılık olarak Azure SDK türlerine de bağlı olabilir. Bunları güncelleştirmek için de bu fırsatı değerlendirmelisiniz. İşlev uzantılarının en son sürümleri, .NET için Azure SDK'sının en son sürümleriyle çalışır ve neredeyse tüm paketleri biçimindedirAzure.*.

Notification Hubs ve Mobile Apps bağlamaları yalnızca çalışma zamanının 1.x sürümünde desteklenir. Çalışma zamanının 4.x sürümüne yükseltirken, doğrudan SDK'larını kullanarak bu hizmetlerle çalışmak yerine bu bağlamaları kaldırmanız gerekir.

Program.cs dosyası

Çoğu durumda, geçiş için projenize aşağıdaki program.cs dosyasını eklemeniz gerekir:

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();

Bu örnek, performansı geliştirmek ve uygulamanız HTTP tetikleyicileri kullandığında tanıdık bir programlama modeli sağlamak için ASP.NET Core tümleştirmesini içerir. HTTP tetikleyicilerini kullanmayı düşünmüyorsanız, çağrısı ConfigureFunctionsWebApplication yerine öğesine yapılan çağrıyı ConfigureFunctionsWorkerDefaultsdeğiştirebilirsiniz. Bunu yaparsanız, başvuruyu Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore proje dosyanızdan kaldırabilirsiniz. Ancak, en iyi performans için, diğer tetikleyici türlerine sahip işlevler için bile ASP.NET Core'da tutmalısınız FrameworkReference .

Dosya, Program.cs özniteliğine FunctionsStartup sahip olan ve genellikle bir dosya olan herhangi bir Startup.cs dosyanın yerini alır. Kodunuzun FunctionsStartup başvuracağı IFunctionsHostBuilder.Servicesyerlerde, bunun yerine içindeki yöntemine Program.csHostBuilder deyimler .ConfigureServices() ekleyebilirsiniz. ile Program.csçalışma hakkında daha fazla bilgi edinmek için yalıtılmış çalışan modeli kılavuzundaki Başlangıç ve yapılandırma bölümüne bakın.

Yukarıdaki varsayılan Program.cs örnekler, yalıtılmış çalışan modeli için Application Insights tümleştirmesi kurulumunu içerir. içinde, projenizdeki Program.cskoddan gelen günlüklere uygulanması gereken günlük filtrelemelerini de yapılandırmanız gerekir. Yalıtılmış çalışan modelinde host.json , dosya yalnızca İşlevler konak çalışma zamanı tarafından yayılan olayları denetler. içinde Program.csfiltreleme kurallarını yapılandırmazsanız, telemetrinizdeki çeşitli kategoriler için mevcut günlük düzeylerinde farklılıklar görebilirsiniz.

özel yapılandırma kaynaklarını öğesinin HostBuilderbir parçası olarak kaydedebilirsiniz, ancak bunların benzer şekilde yalnızca projenizdeki kodlar için de geçerli olduğunu unutmayın. Tetikleyici ve bağlama yapılandırması platform tarafından da gereklidir ve bu, uygulama ayarları, Key Vault başvuruları veya Uygulama Yapılandırması başvuru özellikleri aracılığıyla sağlanmalıdır.

Var olan FunctionsStartup herhangi bir öğeden dosyaya Program.cs her şeyi taşıdıktan sonra özniteliğini FunctionsStartup ve uygulandığı sınıfı silebilirsiniz.

host.json dosyası

host.json dosyasındaki ayarlar hem yerel olarak hem de Azure'da işlev uygulaması düzeyinde uygulanır. Sürüm 1.x'te, host.json dosyanız boş veya işlev uygulamasındaki tüm işlevlere uygulanan bazı ayarlar içeriyor. Daha fazla bilgi için bkz . Host.json v1. host.json dosyanızda ayar değerleri varsa, değişiklikler için host.json v2 biçimini gözden geçirin.

4.x sürümünde çalıştırmak için host.json dosyasına eklemeniz "version": "2.0" gerekir. Aşağıdaki örneklerde gösterildiği gibi yapılandırmanıza ekleme logging yapmayı da göz önünde bulundurmalısınız:

{
    "version": "2.0",
    "logging": {
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "excludedTypes": "Request"
            },
            "enableLiveMetricsFilters": true
        }
    }
}

Dosya host.json yalnızca İşlevler ana bilgisayar çalışma zamanından günlüğe kaydetmeyi denetler ve yalıtılmış çalışan modelinde bu günlüklerden bazıları doğrudan uygulamanızdan gelir ve size daha fazla denetim sağlar. Bu günlükleri filtreleme hakkında ayrıntılı bilgi için bkz . Yalıtılmış çalışan modelinde günlük düzeylerini yönetme.

local.settings.json dosyası

local.settings.json dosyası yalnızca yerel olarak çalıştırılırken kullanılır. Bilgi için bkz . Yerel ayarlar dosyası. Sürüm 1.x'te, local.settings.json dosyasının yalnızca iki gerekli değeri vardır:

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "AzureWebJobsStorageConnectionStringValue",
        "AzureWebJobsDashboard": "AzureWebJobsStorageConnectionStringValue"
    }
}

Sürüm 4.x'e geçiş yaptığınızda, local.settings.json dosyanızda en az aşağıdaki öğelerin olduğundan emin olun:

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "AzureWebJobsStorageConnectionStringValue",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
    }
}

Not

İşlem içi çalıştırmadan yalıtılmış bir çalışan işleminde çalıştırmaya geçiş yaparken, değeri "dotnet-isolated" olarak değiştirmeniz FUNCTIONS_WORKER_RUNTIME gerekir.

Sınıf adı değişiklikleri

Bazı anahtar sınıfları, sürüm 1.x ile sürüm 4.x arasında adları değiştirdi. Bu değişiklikler, .NET API'lerindeki değişikliklerin veya işlem içi ile yalıtılmış çalışan işlemi arasındaki farkların bir sonucudur. Aşağıdaki tablo, geçiş sırasında değişebilen İşlevler tarafından kullanılan anahtar .NET sınıflarını gösterir:

Sürüm 1.x .NET 8
FunctionName (öznitelik) Function (öznitelik)
TraceWriter ILogger<T>, ILogger
HttpRequestMessage HttpRequestData, HttpRequest (ASP.NET Core tümleştirmesini kullanarak)
HttpResponseMessage HttpResponseData, IActionResult (ASP.NET Core tümleştirmesini kullanarak)

Bağlamalarda sınıf adı farklılıkları da olabilir. Daha fazla bilgi için, belirli bağlamalar için başvuru makalelerine bakın.

Diğer kod değişiklikleri

Bu bölümde, geçişte çalışırken dikkate alınacak diğer kod değişiklikleri vurgulanır. Bu değişiklikler tüm uygulamalar için gerekli değildir, ancak senaryolarınızla ilgili olup olmadığını değerlendirmeniz gerekir. Projenizde yapmanız gerekebilecek ek değişiklikler için 1.x sürümünden sonraki davranış değişikliklerini denetlediğinizden emin olun.

JSON seri hale getirme

Varsayılan olarak, yalıtılmış çalışan modeli JSON serileştirme için kullanır System.Text.Json . Seri hale getirici seçeneklerini özelleştirmek veya JSON.NET ()Newtonsoft.Json seçeneğine geçmek için bu yönergelere bakın.

Application Insights günlük düzeyleri ve filtreleme

Günlükler hem İşlevler konak çalışma zamanından hem de projenizdeki koddan Application Insights'a gönderilebilir. , host.json konak günlüğü için kuralları yapılandırmanıza olanak tanır, ancak kodunuzdan gelen günlükleri denetlemek için filtreleme kurallarını öğesinin bir parçası olarak yapılandırmanız Program.csgerekir. Bu günlükleri filtreleme hakkında ayrıntılı bilgi için bkz . Yalıtılmış çalışan modelinde günlük düzeylerini yönetme.

HTTP tetikleyicisi şablonu

Sürüm 1.x ile sürüm 4.x arasındaki kod değişikliklerinin çoğu HTTP ile tetiklenen işlevlerde görülebilir. Sürüm 1.x için HTTP tetikleyici şablonu aşağıdaki örneğe benzer:

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);
        }
    }
}

Sürüm 4.x'te HTTP tetikleyici şablonu aşağıdaki örneğe benzer:

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"]}!");
        }
    }
}

Projenizi Azure İşlevleri 4.x'e güncelleştirmek için:

  1. Azure İşlevleri Core Tools yerel yüklemenizi 4.x sürümüne güncelleştirin.

  2. 4.x sürümünde desteklenen Node.js sürümlerden birine geçin.

  3. Hem hem extensionBundle de version öğelerini host.json ekleyerek aşağıdaki örneğe benzemesi için:

    {
        "version": "2.0",
        "extensionBundle": {
            "id": "Microsoft.Azure.Functions.ExtensionBundle",
            "version": "[3.3.0, 4.0.0)"
        }
    }
    

    1.x sürümünden extensionBundle sonra bağlamalar dış paketler olarak tutulacağından öğesi gereklidir. Daha fazla bilgi için bkz . Uzantı paketleri.

  4. local.settings.json dosyanızı en azından aşağıdaki öğelere sahip olacak şekilde güncelleştirin:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node"
        }
    }
    

    Ayar AzureWebJobsStorage , Azurite depolama öykünücüsü veya gerçek bir Azure depolama hesabı olabilir. Daha fazla bilgi için bkz . Yerel depolama öykünücüsü.

Azure'da işlev uygulamanızı güncelleştirme

Geçirilen projenizi yayımlamadan önce Azure'daki işlev uygulaması konağı çalışma zamanını 4.x sürümüne güncelleştirmeniz gerekir. İşlevler konağı tarafından kullanılan çalışma zamanı sürümü uygulama ayarı tarafından FUNCTIONS_EXTENSION_VERSION denetlenmektedir, ancak bazı durumlarda diğer ayarların da güncelleştirilmiş olması gerekir. Hem kod değişiklikleri hem de uygulama ayarlarında yapılan değişiklikler, işlev uygulamanızın yeniden başlatılmasını gerektirir.

En kolay yol yuva olmadan güncelleştirme yapmak ve ardından uygulama projenizi yeniden yayımlamaktır. Ayrıca, yuvaları kullanarak güncelleştirerek uygulamanızda kapalı kalma süresini en aza indirip geri almayı basitleştirebilirsiniz.

Yuva olmadan güncelleştirme

v4.x'e güncelleştirmenin en basit yolu, Uygulama ayarını Azure'daki işlev uygulamanızda olarak ~4 ayarlamaktırFUNCTIONS_EXTENSION_VERSION. Yuvaları olan bir sitede farklı bir yordamı izlemeniz gerekir.

az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME> -n <APP_NAME>

Windows ve Linux arasında farklılık gösteren başka bir ayar da ayarlamanız gerekir.

Windows'da çalışırken, çalışma zamanının 4.x sürümü için gereken .NET 6.0'ı da etkinleştirmeniz gerekir.

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

.NET 6, Windows üzerinde çalışan herhangi bir dildeki işlev uygulamaları için gereklidir.

Bu örnekte değerini işlev uygulamanızın adıyla ve <RESOURCE_GROUP_NAME> kaynak grubunun adıyla değiştirin<APP_NAME>.

Artık 4.x sürümünde çalıştırılacak şekilde geçirilen uygulama projenizi yeniden yayımlayabilirsiniz.

Yuvaları kullanarak güncelleştirme

Dağıtım yuvalarını kullanmak, işlev uygulamanızı önceki bir sürümden v4.x çalışma zamanına güncelleştirmenin iyi bir yoludur. Hazırlama yuvası kullanarak uygulamanızı hazırlama yuvasındaki yeni çalışma zamanı sürümünde çalıştırabilir ve doğrulamadan sonra üretime geçebilirsiniz. Yuvalar ayrıca güncelleştirme sırasında kapalı kalma süresini en aza indirmenin bir yolunu sağlar. Kapalı kalma süresini en aza indirmeniz gerekiyorsa En düşük kapalı kalma süresi güncelleştirmesi'ndeki adımları izleyin.

Uygulamanızı güncelleştirilmiş yuvada doğruladıktan sonra uygulamayı ve yeni sürüm ayarlarını üretime geçirebilirsiniz. Bu değiştirme için üretim yuvasında ayar WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 yapılması gerekir. Bu ayarı ekleme şekliniz, güncelleştirme için gereken kapalı kalma süresini etkiler.

Standart güncelleştirme

Yuva etkin işlev uygulamanız tam yeniden başlatmanın kapalı kalma süresini işleyebilirse, ayarı doğrudan üretim yuvasında güncelleştirebilirsiniz WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS . Bu ayarı doğrudan üretim yuvasında değiştirmek kullanılabilirliği etkileyen bir yeniden başlatmaya neden olduğundan, bu değişikliği trafiğin azaldığı bir zamanda yapmayı göz önünde bulundurun. Ardından, hazırlama yuvasından güncelleştirilmiş sürümü değiştirebilirsiniz.

Update-AzFunctionAppSetting PowerShell cmdlet'i şu anda yuvaları desteklememektedir. Azure CLI'yi veya Azure portalını kullanmanız gerekir.

  1. Üretim yuvasında ayarlamak WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 için aşağıdaki komutu kullanın:

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

    Bu örnekte değerini işlev uygulamanızın adıyla ve <RESOURCE_GROUP_NAME> kaynak grubunun adıyla değiştirin<APP_NAME>. Bu komut, üretim yuvasında çalışan uygulamanın yeniden başlatılmasına neden olur.

  2. Hazırlama yuvasında ayarlamak WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS için aşağıdaki komutu kullanın:

    az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  3. Hazırlama yuvasını yeni çalışma zamanı sürümüne değiştirmek FUNCTIONS_EXTENSION_VERSION ve güncelleştirmek için aşağıdaki komutu kullanın:

    az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  4. İşlevler çalışma zamanının 4.x sürümü Için Windows'ta .NET 6 gerekir. Linux'ta .NET uygulamaları da .NET 6'ya güncelleştirilmelidir. Çalışma zamanının .NET 6'da çalışabilmesi için aşağıdaki komutu kullanın:

    Windows'da çalışırken, çalışma zamanının 4.x sürümü için gereken .NET 6.0'ı da etkinleştirmeniz gerekir.

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

    .NET 6, Windows üzerinde çalışan herhangi bir dildeki işlev uygulamaları için gereklidir.

    Bu örnekte değerini işlev uygulamanızın adıyla ve <RESOURCE_GROUP_NAME> kaynak grubunun adıyla değiştirin<APP_NAME>.

  5. Kod projeniz 4.x sürümünde çalışacak güncelleştirmeler gerektiriyorsa, bu güncelleştirmeleri hazırlama yuvasına şimdi dağıtın.

  6. Değiştirmeden önce işlev uygulamanızın güncelleştirilmiş hazırlama ortamında doğru şekilde çalıştığını onaylayın.

  7. Güncelleştirilmiş hazırlama yuvasını üretime değiştirmek için aşağıdaki komutu kullanın:

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

En düşük kapalı kalma süresi güncelleştirmesi

Üretim uygulamanızda kapalı kalma süresini en aza indirmek için, ayarı hazırlama yuvasından üretime değiştirebilirsiniz WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS . Bundan sonra, önceden değiştirilmiş bir hazırlama yuvasından güncelleştirilmiş sürümü değiştirebilirsiniz.

  1. Hazırlama yuvasında ayarlamak WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 için aşağıdaki komutu kullanın:

    az functionapp config appsettings set --settings WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  2. Yuvayı yeni ayar ile üretime değiştirmek ve aynı zamanda hazırlama yuvasındaki sürüm ayarını geri yüklemek için aşağıdaki komutları kullanın.

    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>
    

    Değiştirme ile hazırlama sırasında geri yüklenen çalışma zamanı sürümü arasındaki süre boyunca hazırlama yuvasından hatalar görebilirsiniz. Bu hatanın nedeni, yalnızca değiştirme sırasında hazırlamanın olması WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 , hazırlamadaki FUNCTIONS_EXTENSION_VERSION ayarı kaldırdığından oluşabilir. Sürüm ayarı olmadan yuvanız kötü durumdadır. Değiştirme işleminden hemen sonra hazırlama yuvasındaki sürümün güncelleştirilmesi yuvayı yeniden iyi duruma getirmelidir ve gerekirse değişikliklerinizi geri alma çağrısı yapabilirsiniz. Ancak, değiştirme işleminin herhangi bir geri alınması, hazırlamada görülen üretimde aynı hataları önlemek için değiştirme işleminden önce üretimden doğrudan kaldırmanızı WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 da gerektirir. Üretim ayarındaki bu değişiklik yeniden başlatmaya neden olur.

  3. Hazırlama yuvasında yeniden ayarlamak WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 için aşağıdaki komutu kullanın:

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

    Bu noktada her iki yuva da ayarlanmıştır WEBSITE_OVERRIDE_STICKY_EXTENSION_VERSIONS=0 .

  4. Hazırlama yuvasını yeni çalışma zamanı sürümüne değiştirmek FUNCTIONS_EXTENSION_VERSION ve güncelleştirmek için aşağıdaki komutu kullanın:

    az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -g <RESOURCE_GROUP_NAME>  -n <APP_NAME> --slot <SLOT_NAME>
    
  5. İşlevler çalışma zamanının 4.x sürümü Için Windows'ta .NET 6 gerekir. Linux'ta .NET uygulamaları da .NET 6'ya güncelleştirilmelidir. Çalışma zamanının .NET 6'da çalışabilmesi için aşağıdaki komutu kullanın:

    Windows'da çalışırken, çalışma zamanının 4.x sürümü için gereken .NET 6.0'ı da etkinleştirmeniz gerekir.

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

    .NET 6, Windows üzerinde çalışan herhangi bir dildeki işlev uygulamaları için gereklidir.

    Bu örnekte değerini işlev uygulamanızın adıyla ve <RESOURCE_GROUP_NAME> kaynak grubunun adıyla değiştirin<APP_NAME>.

  6. Kod projeniz 4.x sürümünde çalışacak güncelleştirmeler gerektiriyorsa, bu güncelleştirmeleri hazırlama yuvasına şimdi dağıtın.

  7. Değiştirmeden önce işlev uygulamanızın güncelleştirilmiş hazırlama ortamında doğru şekilde çalıştığını onaylayın.

  8. Güncelleştirilmiş ve önceden uyarlanmış hazırlama yuvasını üretimle değiştirmek için aşağıdaki komutu kullanın:

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

1.x sürümünden sonraki davranış değişiklikleri

Bu bölümde hem tetikleyici hem de bağlama davranışlarında ve temel İşlevler özelliklerinde ve davranışlarında 1.x sürümünden sonra yapılan değişiklikler ayrıntılı olarak açıklanır.

Tetikleyicilerdeki ve bağlamalardaki değişiklikler

Sürüm 2.x'den başlayarak, uygulamanızdaki işlevler tarafından kullanılan belirli tetikleyiciler ve bağlamalar için uzantıları yüklemeniz gerekir. Bu HTTP ve zamanlayıcı tetikleyicileri için uzantı gerektirmeyen tek özel durum. Daha fazla bilgi için bkz . Bağlama uzantılarını kaydetme ve yükleme.

İşlevin sürümler arasındaki function.json veya özniteliklerinde de birkaç değişiklik vardır. Örneğin, Event Hubs path özelliği artık eventHubNameşeklindedir. Her bağlamaya yönelik belgelerin bağlantıları için mevcut bağlama tablosuna bakın.

Özellikler ve işlevlerdeki değişiklikler

Sürüm 1.x'in ardından birkaç özellik kaldırıldı, güncelleştirildi veya değiştirildi. Bu bölümde, 1.x sürümünü kullandıktan sonra sonraki sürümlerde gördüğünüz değişiklikler ayrıntılı olarak gösterilir.

Sürüm 2.x'te aşağıdaki değişiklikler yapıldı:

  • HTTP uç noktalarını çağırma anahtarları her zaman Azure Blob depolamada şifrelenmiş olarak depolanır. Sürüm 1.x'te anahtarlar varsayılan olarak Azure Dosyalar depolandı. Bir uygulamayı 1.x sürümünden 2.x sürümüne geçirdiğinizde, Azure Dosyalar olan mevcut gizli diziler sıfırlanır.

  • Sürüm 2.x çalışma zamanı, web kancası sağlayıcıları için yerleşik destek içermez. Bu değişiklik, performansı geliştirmek için yapılmıştır. Http tetikleyicilerini web kancaları için uç nokta olarak kullanmaya devam edebilirsiniz.

  • İzlemeyi geliştirmek için portaldaki ayarı kullanan AzureWebJobsDashboard Web İşleri panosu, ayarı kullanan APPINSIGHTS_INSTRUMENTATIONKEY Azure Uygulaması lication Insights ile değiştirilir. Daha fazla bilgi için bkz. İzleme Azure İşlevleri.

  • İşlev uygulamasındaki tüm işlevlerin aynı dili paylaşması gerekir. bir işlev uygulaması oluşturduğunuzda, uygulama için bir çalışma zamanı yığını seçmeniz gerekir. Çalışma zamanı yığını, uygulama ayarlarındaki FUNCTIONS_WORKER_RUNTIME değer tarafından belirtilir. Bu gereksinim, ayak izini ve başlangıç süresini iyileştirmek için eklenmiştir. Yerel olarak geliştirirken, bu ayarı local.settings.json dosyasına da eklemeniz gerekir.

  • App Service planındaki işlevler için varsayılan zaman aşımı 30 dakikaya değiştirilir. host.json'daki functionTimeout ayarını kullanarak zaman aşımını el ile sınırsız olarak değiştirebilirsiniz.

  • HTTP eşzamanlılık azaltmaları Tüketim planı işlevleri için varsayılan olarak uygulanır ve örnek başına varsayılan olarak 100 eşzamanlı istek kullanılır. Bu davranışı maxConcurrentRequests host.json dosyasındaki ayarda değiştirebilirsiniz.

  • .NET Core sınırlamaları nedeniyle F# betiği (.fsxdosyalar) işlevleri desteği kaldırıldı. Derlenmiş F# işlevleri (.fs) hala desteklenmektedir.

  • Event Grid tetikleyici web kancalarının URL biçimi şu deseni izleyecek şekilde değiştirildi: https://{app}/runtime/webhooks/{triggerName}.

  • Önceden tanımlanmış bazı özel ölçümlerin adları 1.x sürümünden sonra değiştirildi. Duration, ve AvgDurationMsile MaxDurationMsMinDurationMsdeğiştirildi. Success Rate olarak da yeniden adlandırıldı Success Rate.

Azure Stack Hub ile ilgili dikkat edilmesi gerekenler

Azure Stack Hub'da App Service, Azure İşlevleri 4.x sürümünü desteklemez. Azure Stack Hub'da 1.x sürümünden geçiş yapmayı planlarken aşağıdaki seçeneklerden birini belirleyebilirsiniz:

  • Bu makaledeki yönergeleri kullanarak genel bulut Azure İşlevleri barındırılan 4.x sürümüne geçin. Mevcut uygulamanızı yükseltmek yerine 4.x sürümünü kullanarak yeni bir uygulama oluşturup değiştirilen projenizi buna dağıtırsınız.
  • Azure Stack Hub'da app service planında barındırılan Web İşleri'ne geçin.

Sonraki adımlar