Aracılığıyla paylaş


Yalıtılmış çalışan modelinde C# Azure İşlevleri çalıştırma kılavuzu

Bu makale, yalıtılmış çalışan modelini kullanarak .NET'te Azure İşlevleri ile çalışmaya giriş niteliğindedir. Bu model, projenizin diğer çalışma zamanı bileşenlerinden bağımsız olarak .NET sürümlerini hedeflemesine olanak tanır. Desteklenen belirli .NET sürümleri hakkında bilgi için desteklenen sürüme bakın.

.NET yalıtılmış çalışan modeli işlevlerini oluşturmaya hemen başlamak için aşağıdaki bağlantıları kullanın.

Başlarken Kavramlar Örnekler

Yalıtılmış çalışan modeli projesini Azure'a dağıtma hakkında bilgi edinmek için bkz. Azure İşlevleri dağıtma.

Yalıtılmış çalışan modelinin avantajları

.NET sınıf kitaplığı işlevlerinizi çalıştırabileceğiniz iki mod vardır: İşlevler konak çalışma zamanıyla aynı işlemde (işlem içi) veya yalıtılmış bir çalışan işleminde. .NET işlevleriniz yalıtılmış bir çalışan işleminde çalıştırıldığında aşağıdaki avantajlardan yararlanabilirsiniz:

  • Daha az çakışma: İşlevleriniz ayrı bir işlemde çalıştığından, uygulamanızda kullanılan derlemeler konak işlemi tarafından kullanılan aynı derlemelerin farklı sürümleriyle çakışmaz.
  • İşlemin tam denetimi: Uygulamanın başlatılmasını denetlersiniz, bu da kullanılan yapılandırmaları yönetebileceğiniz ve ara yazılımı başlatabileceğiniz anlamına gelir.
  • Standart bağımlılık ekleme: İşlemin tam denetimine sahip olduğunuzdan, işlev uygulamanıza bağımlılık ekleme ve ara yazılım ekleme için geçerli .NET davranışlarını kullanabilirsiniz.
  • .NET sürüm esnekliği: Konak işleminin dışında çalışmak, işlevlerinizin .NET Framework de dahil olmak üzere İşlevler çalışma zamanı tarafından yerel olarak desteklenmeyen .NET sürümlerinde çalışabileceği anlamına gelir.

Devam eden bir C# işlev uygulamanız varsa, bu avantajlardan yararlanmak için uygulamanızı geçirmeniz gerekir. Daha fazla bilgi için bkz . .NET uygulamalarını işlem içi modelden yalıtılmış çalışan modeline geçirme.

İki mod arasında kapsamlı bir karşılaştırma için bkz. .NET Azure İşlevleri işlem içi ve yalıtma çalışan işlemi arasındaki farklar.

Desteklenen sürümler

İşlevler çalışma zamanının sürümleri .NET'in belirli sürümlerini destekler. İşlev sürümleri hakkında daha fazla bilgi edinmek için bkz. Azure İşlevleri çalışma zamanı sürümlerine genel bakış. Sürüm desteği, işlevlerinizin işlem içinde mi yoksa yalıtılmış çalışan işlemi mi çalıştırdığına da bağlıdır.

Not

İşlev uygulamanız tarafından kullanılan İşlevler çalışma zamanı sürümünü değiştirmeyi öğrenmek için bkz . Geçerli çalışma zamanı sürümünü görüntüleme ve güncelleştirme.

Aşağıdaki tabloda, İşlevler'in belirli bir sürümüyle kullanılabilecek en yüksek .NET veya .NET Framework düzeyi gösterilmektedir.

İşlevler çalışma zamanı sürümü Yalıtılmış çalışan modeli İşlem içi model5
İşlevler 4.x1 .NET 9.0 (önizleme)
.NET 8.0
.NET 6.02
.NET Framework 4.83
.NET 8.0
.NET 6.02
İşlevler 1.x4 yok .NET Framework 4.8

1 .NET 7, yalıtılmış çalışan modelinde daha önce destekleniyordu ancak 14 Mayıs 2024'te resmi desteğin sonuna ulaştı.

2 .NET 6, 12 Kasım 2024'te resmi desteğin sonuna ulaşıyor.

3 Derleme işlemi ayrıca .NET SDK'sını gerektirir.

4 Azure İşlevleri çalışma zamanının 1.x sürümü için destek 14 Eylül 2026'da sona erer. Daha fazla bilgi için bu destek duyurusna bakın. Sürekli tam destek için uygulamalarınızı 4.x sürümüne geçirmeniz gerekir.

5 İş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.

Belirli eski ikincil sürümlerin kaldırılması da dahil olmak üzere Azure İşlevleri sürümlerle ilgili en son haberler için Azure Uygulaması Hizmet duyurularını izleyin.

Proje yapısı

Yalıtılmış çalışan modelini kullanan Azure İşlevleri için bir .NET projesi, desteklenen bir .NET çalışma zamanını hedefleyen bir .NET konsol uygulaması projesidir. Aşağıdakiler, herhangi bir .NET yalıtılmış projesinde gereken temel dosyalardır:

  • Projeyi ve bağımlılıkları tanımlayan C# proje dosyası (.csproj).
  • Uygulamanın giriş noktası olan dosyayı Program.cs.
  • İşlevlerinizi tanımlayan tüm kod dosyaları.
  • Projenizdeki işlevler tarafından paylaşılan yapılandırmayı tanımlayan host.json dosyası.
  • Makinenizde yerel olarak çalıştırıldığında projeniz tarafından kullanılan ortam değişkenlerini tanımlayan local.settings.json dosyası.

Tam örnekler için bkz . .NET 8 örnek projesi ve .NET Framework 4.8 örnek projesi.

Paket başvuruları

Yalıtılmış çalışan modelini kullanan Azure İşlevleri için bir .NET projesi, hem temel işlevsellik hem de bağlama uzantıları için benzersiz bir paket kümesi kullanır.

Çekirdek paketler

.NET işlevlerinizi yalıtılmış bir çalışan işleminde çalıştırmak için aşağıdaki paketler gereklidir:

Sürüm 2.x (Önizleme)

Çekirdek paketlerin 2.x sürümleri desteklenen çerçeveleri değiştirir ve bu sonraki sürümlerden yeni .NET API'leri için destek getirir. .NET 9 (Önizleme) veya sonraki bir sürümü hedeflediğinizde uygulamanızın her iki paketin 2.0.0-preview1 veya sonraki bir sürümüne başvurması gerekir.

İlk önizleme sürümleri 1.x sürümüne göre yazılmış kodla uyumludur. Ancak, önizleme döneminde daha yeni sürümler yazdığınız kodu etkileyebilecek davranış değişikliklerine neden olabilir.

2.x sürümlerine güncelleştirirken aşağıdaki değişiklikleri not edin:

  • 2.0.0-preview2 sürümünden başlayarak Microsoft.Azure.Functions.Worker.Sdk, SDK kapsayıcı derlemeleri için varsayılan yapılandırmalar ekler.
  • Microsoft.Azure.Functions.Worker'ın 2.0.0-preview2 sürümünden itibaren:
    • Bu sürüm için IHostApplicationBuilderdestek ekler. Bu kılavuzdaki bazı örnekler, kullanarak IHostApplicationBuilderalternatifleri göstermek için sekmeler içerir. Bu örnekler için 2.x sürümleri gerekir.
    • Hizmet sağlayıcısı kapsam doğrulaması, bir geliştirme ortamında çalıştırılırsa varsayılan olarak dahil edilir. Bu davranış ASP.NET Core ile eşleşir.
    • Seçenek EnableUserCodeException varsayılan olarak etkindir. Özelliği artık kullanım dışı olarak işaretlendi.
    • Seçenek IncludeEmptyEntriesInMessagePayload varsayılan olarak etkindir. Bu seçenek etkinleştirildiğinde, koleksiyonları temsil eden tetikleyici yükleri her zaman boş girdiler içerir. Örneğin, bir ileti gövde olmadan gönderilirse, tetikleyici verileri için boş bir giriş yine de string[] bulunur. Boş girişlerin eklenmesi, işlevin de başvurabileceği meta veri dizileriyle çapraz başvuruda bulunmayı kolaylaştırır. Hizmet yapılandırmasında WorkerOptions olarak ayarlayarak IncludeEmptyEntriesInMessagePayload false bu davranışı devre dışı bırakabilirsiniz.
    • ILoggerExtensions sınıfı olarak yeniden adlandırılırFunctionsLoggerExtensions. Yeniden adlandırma, bir örnekte kullanırken LogMetric() belirsiz bir ILogger çağrı hatası oluşmasını önler.

Uzantı paketleri

.NET yalıtılmış çalışan işlemi işlevleri farklı bağlama türleri kullandığından, benzersiz bir bağlama uzantısı paketleri kümesi gerektirir.

Bu uzantı paketlerini Microsoft.Azure.Functions.Worker.Extensions altında bulabilirsiniz.

Başlatma ve yapılandırma

Yalıtılmış çalışan modelini kullandığınızda, genellikle içinde Program.csbulunan işlev uygulamanızın başlangıcına erişebilirsiniz. Kendi konak örneğinizi oluşturmak ve başlatmak sizin sorumluluğunuzdadır. Bu nedenle, uygulamanızın yapılandırma işlem hattına doğrudan erişiminiz de vardır. .NET İşlevleri yalıtılmış çalışan işlemiyle yapılandırmaları çok daha kolay ekleyebilir, bağımlılıkları ekleyebilir ve kendi ara yazılımınızı çalıştırabilirsiniz.

Aşağıdaki kodda HostBuilder işlem hattı örneği gösterilmektedir:

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(s =>
    {
        s.AddApplicationInsightsTelemetryWorkerService();
        s.ConfigureFunctionsApplicationInsights();
        s.AddSingleton<IHttpResponderService, DefaultHttpResponderService>();
        s.Configure<LoggerFilterOptions>(options =>
        {
            // The Application Insights SDK adds a default logging filter that instructs ILogger to capture only Warning and more severe logs. Application Insights requires an explicit override.
            // Log levels can also be configured using appsettings.json. For more information, see https://learn.microsoft.com/en-us/azure/azure-monitor/app/worker-service#ilogger-logs
            LoggerFilterRule toRemove = options.Rules.FirstOrDefault(rule => rule.ProviderName
                == "Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider");

            if (toRemove is not null)
            {
                options.Rules.Remove(toRemove);
            }
        });
    })
    .Build();

Bu kod gerektirir using Microsoft.Extensions.DependencyInjection;.

üzerinde IHostBuilderaramadan Build() önce şunları yapmalısınız:

  • ConfigureFunctionsWebApplication() ASP.NET Core tümleştirmesi kullanıyorsanız veya ConfigureFunctionsWorkerDefaults() başka bir şekilde arayın. Bu seçeneklerle ilgili ayrıntılar için bkz . HTTP tetikleyicisi .
    Uygulamanızı F# kullanarak yazıyorsanız, bazı tetikleyici ve bağlama uzantıları fazladan yapılandırma gerektirir. Bu uzantıları bir F# uygulamasında kullanmayı planlarken Bloblar uzantısı, Tablolar uzantısı ve Cosmos DB uzantısı için kurulum belgelerine bakın.
  • Projenizin gerektirdiği hizmetleri veya uygulama yapılandırmasını yapılandırın. Ayrıntılar için bkz . Yapılandırma .
    Application Insights'ı kullanmayı planlıyorsanız temsilciyi ConfigureServices() aramanız AddApplicationInsightsTelemetryWorkerService() gerekirConfigureFunctionsApplicationInsights(). Ayrıntılar için bkz . Application Insights .

Projeniz .NET Framework 4.8'i hedef alıyorsa HostBuilder'ı oluşturmadan önce de eklemeniz FunctionsDebugger.Enable(); gerekir. Yönteminizin Main() ilk satırı olmalıdır. Daha fazla bilgi için bkz . .NET Framework hedeflenirken hata ayıklama.

HostBuilder, işlev uygulamanızı başlatmak için zaman uyumsuz olarak çalıştırdığınız tam olarak başlatılan IHost bir örneği derlemek ve döndürmek için kullanılır.

await host.RunAsync();

Yapılandırma

Kullandığınız oluşturucu türü, uygulamayı nasıl yapılandırabileceğinizi belirler.

configureFunctionsWorkerDefaults yöntemi, işlev uygulamasının çalışması için gereken ayarları eklemek için kullanılır. yöntemi aşağıdaki işlevleri içerir:

  • Varsayılan dönüştürücü kümesi.
  • Özellik adlarında büyük/küçük harfe dönüştürmeyi yoksaymak için varsayılan JsonSerializerOptions değerini ayarlayın.
  • Azure İşlevleri günlüğüyle tümleştirme.
  • Çıkış bağlama ara yazılımı ve özellikleri.
  • İşlev yürütme ara yazılımı.
  • Varsayılan gRPC desteği.
.ConfigureFunctionsWorkerDefaults()

Konak oluşturucu işlem hattına erişim sahibi olmak, başlatma sırasında uygulamaya özgü yapılandırmaları da ayarlayabileceğiniz anlamına gelir. Kodunuzun gerektirdiği yapılandırma kaynaklarını eklemek için HostBuilder'da ConfigureAppConfiguration yöntemini bir veya daha fazla kez çağırabilirsiniz. Uygulama yapılandırması hakkında daha fazla bilgi edinmek için bkz . ASP.NET Core'da yapılandırma.

Bu yapılandırmalar yalnızca yazdığınız çalışan kodu için geçerlidir ve İşlevler ana bilgisayarının veya tetikleyicilerinin ve bağlamalarının yapılandırmasını doğrudan etkilemez. İşlev ana bilgisayarında veya tetikleyici ve bağlama yapılandırmasında değişiklik yapmak için yine de host.json dosyasını kullanmanız gerekir.

Not

Özel yapılandırma kaynakları tetikleyicilerin ve bağlamaların yapılandırması için kullanılamaz. Tetikleyici ve bağlama yapılandırması yalnızca uygulama kodunuz için değil İşlevler platformunda kullanılabilir olmalıdır. Bu yapılandırmayı uygulama ayarları, Key Vault başvuruları veya Uygulama Yapılandırması başvuru özellikleri aracılığıyla sağlayabilirsiniz.

Bağımlılık ekleme

Yalıtılmış çalışan modeli, hizmetleri eklemek için standart .NET mekanizmalarını kullanır.

kullandığınızdaHostBuilder, konak oluşturucuda ConfigureServices'i çağırın ve belirli hizmetleri eklemek için IServiceCollection'da uzantı yöntemlerini kullanın. Aşağıdaki örnek bir tekil hizmet bağımlılığını eklimektedir:

.ConfigureServices(services =>
{
    services.AddSingleton<IHttpResponderService, DefaultHttpResponderService>();
})

Bu kod gerektirir using Microsoft.Extensions.DependencyInjection;. Daha fazla bilgi edinmek için bkz . ASP.NET Core'da bağımlılık ekleme.

Azure istemcilerini kaydetme

Bağımlılık ekleme, diğer Azure hizmetleriyle etkileşime geçmek için kullanılabilir. Microsoft.Extensions.Azure paketini kullanarak .NET için Azure SDK'sından istemciler ekleyebilirsiniz. Paketi yükledikten sonra, içindeki hizmet koleksiyonunda Program.csarayarak AddAzureClients() istemcileri kaydedin. Aşağıdaki örnekte Azure Blobları için adlandırılmış bir istemci yapılandırılır:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Azure;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices((hostContext, services) =>
    {
        services.AddAzureClients(clientBuilder =>
        {
            clientBuilder.AddBlobServiceClient(hostContext.Configuration.GetSection("MyStorageConnection"))
                .WithName("copierOutputBlob");
        });
    })
    .Build();

host.Run();

Aşağıdaki örnekte, eklenen istemciyi kullanarak blob içeriğini bir kapsayıcıdan diğerine akış olarak kopyalamak için bu kaydı ve SDK türlerini nasıl kullanabileceğimiz gösterilmektedir:

using Microsoft.Extensions.Azure;
using Microsoft.Extensions.Logging;

namespace MyFunctionApp
{
    public class BlobCopier
    {
        private readonly ILogger<BlobCopier> _logger;
        private readonly BlobContainerClient _copyContainerClient;

        public BlobCopier(ILogger<BlobCopier> logger, IAzureClientFactory<BlobServiceClient> blobClientFactory)
        {
            _logger = logger;
            _copyContainerClient = blobClientFactory.CreateClient("copierOutputBlob").GetBlobContainerClient("samples-workitems-copy");
            _copyContainerClient.CreateIfNotExists();
        }

        [Function("BlobCopier")]
        public async Task Run([BlobTrigger("samples-workitems/{name}", Connection = "MyStorageConnection")] Stream myBlob, string name)
        {
            await _copyContainerClient.UploadBlobAsync(name, myBlob);
            _logger.LogInformation($"Blob {name} copied!");
        }

    }
}

ILogger<T> Bu örnekteki de bağımlılık ekleme yoluyla elde edildi, bu nedenle otomatik olarak kaydedilir. Günlüğe kaydetme yapılandırma seçenekleri hakkında daha fazla bilgi edinmek için bkz . Günlüğe kaydetme.

İpucu

Örnekte hem hem de Program.cs işlevinde istemcinin adı için değişmez değer dizesi kullanılmıştır. Bunun yerine işlev sınıfında tanımlanan paylaşılan bir sabit dize kullanmayı göz önünde bulundurun. Örneğin, her iki konuma da ekleyip public const string CopyStorageClientName = nameof(_copyContainerClient); başvurabilirsiniz BlobCopier.CopyStorageClientName . Yapılandırma bölümü adını da içinde değil Program.csişleviyle benzer şekilde tanımlayabilirsiniz.

Ara yazılım

Yalıtılmış çalışan modeli, ASP.NET'de bulunana benzer bir model kullanarak ara yazılım kaydını da destekler. Bu model, çağırma işlem hattına ve işlevlerin yürütülmesinden önce ve sonra mantık ekleme olanağı sağlar.

ConfigureFunctionsWorkerDefaults uzantısı yöntemi, aşağıdaki örnekte görebileceğiniz gibi kendi ara yazılımınızı kaydetmenizi sağlayan bir aşırı yüklemeye sahiptir.

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(workerApplication =>
    {
        // Register our custom middlewares with the worker

        workerApplication.UseMiddleware<ExceptionHandlingMiddleware>();

        workerApplication.UseMiddleware<MyCustomMiddleware>();

        workerApplication.UseWhen<StampHttpHeaderMiddleware>((context) =>
        {
            // We want to use this middleware only for http trigger invocations.
            return context.FunctionDefinition.InputBindings.Values
                          .First(a => a.Type.EndsWith("Trigger")).Type == "httpTrigger";
        });
    })
    .Build();

UseWhen Uzantı yöntemi, koşullu olarak yürütülen bir ara yazılımı kaydetmek için kullanılabilir. Bu yönteme boole değeri döndüren bir koşul geçirmelisiniz ve koşulun dönüş değeri olduğunda ara yazılım çağırma işleme işlem hattına truekatılır.

FunctionContext'teki aşağıdaki uzantı yöntemleri, yalıtılmış modelde ara yazılımla çalışmayı kolaylaştırır.

Metot Açıklama
GetHttpRequestDataAsync HTTP tetikleyicisi HttpRequestData tarafından çağrıldığında örneği alır. Bu yöntem, istek üst bilgileri ve tanımlama bilgileri gibi ileti verilerini okumak istediğinizde yararlı olan bir örneğini ValueTask<HttpRequestData?>döndürür.
GetHttpResponseData HTTP tetikleyicisi HttpResponseData tarafından çağrıldığında örneği alır.
GetInvocationResult Geçerli işlev yürütmesinin sonucunu temsil eden bir örneğini InvocationResultalır. Value Değeri gerektiği gibi almak veya ayarlamak için özelliğini kullanın.
GetOutputBindings Geçerli işlev yürütmesi için çıkış bağlama girdilerini alır. Bu yöntemin sonucundaki her girdi türündedir OutputBindingData. gerektiğinde değerini almak veya ayarlamak için özelliğini kullanabilirsiniz Value .
BindInputAsync İstenen BindingMetadata örnek için bir giriş bağlama öğesi bağlar. Örneğin, ara yazılımınız tarafından kullanılması gereken giriş bağlamasına sahip bir BlobInput işleviniz olduğunda bu yöntemi kullanabilirsiniz.

Bu, örneği okuyan HttpRequestData ve işlev yürütme sırasında örneği güncelleştiren HttpResponseData bir ara yazılım uygulaması örneğidir:

internal sealed class StampHttpHeaderMiddleware : IFunctionsWorkerMiddleware
{
    public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
    {
        var requestData = await context.GetHttpRequestDataAsync();

        string correlationId;
        if (requestData!.Headers.TryGetValues("x-correlationId", out var values))
        {
            correlationId = values.First();
        }
        else
        {
            correlationId = Guid.NewGuid().ToString();
        }

        await next(context);

        context.GetHttpResponseData()?.Headers.Add("x-correlationId", correlationId);
    }
}

Bu ara yazılım, belirli bir istek üst bilgisinin (x-correlationId) varlığını denetler ve mevcut olduğunda bir yanıt üst bilgisini damgalama için üst bilgi değerini kullanır. Aksi takdirde, yeni bir GUID değeri oluşturur ve bunu yanıt üst bilgisini damgalama için kullanır. İşlev uygulamanızda özel ara yazılım kullanmanın daha eksiksiz bir örneği için özel ara yazılım başvuru örneğine bakın.

JSON serileştirmesini özelleştirme

Yalıtılmış çalışan modeli varsayılan olarak kullanır System.Text.Json . Hizmetleri dosyanızın Program.cs bir parçası olarak yapılandırarak seri hale getiricinin davranışını özelleştirebilirsiniz. Bu bölüm genel amaçlı serileştirmeyi kapsar ve ayrı olarak yapılandırılması gereken ASP.NET Core tümleştirmesi ile HTTP tetikleyicisi JSON serileştirmesini etkilemeyecektir.

Aşağıdaki örnek bunu kullanarak ConfigureFunctionsWebApplicationgösterir, ancak aynı zamanda için ConfigureFunctionsWorkerDefaultsde çalışır:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication((IFunctionsWorkerApplicationBuilder builder) =>
    {
        builder.Services.Configure<JsonSerializerOptions>(jsonSerializerOptions =>
        {
            jsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
            jsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
            jsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;

            // override the default value
            jsonSerializerOptions.PropertyNameCaseInsensitive = false;
        });
    })
    .Build();

host.Run();

Bunun yerine serileştirme için JSON.NET (Newtonsoft.Json) kullanmak isteyebilirsiniz. Bunu yapmak için paketi yüklersiniz Microsoft.Azure.Core.NewtonsoftJson . Ardından, hizmet kaydınızda özelliği yapılandırmada Serializer WorkerOptions yeniden atayabilirsiniz. Aşağıdaki örnek bunu kullanarak ConfigureFunctionsWebApplicationgösterir, ancak aynı zamanda için ConfigureFunctionsWorkerDefaultsde çalışır:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication((IFunctionsWorkerApplicationBuilder builder) =>
    {
        builder.Services.Configure<WorkerOptions>(workerOptions =>
        {
            var settings = NewtonsoftJsonObjectSerializer.CreateJsonSerializerSettings();
            settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            settings.NullValueHandling = NullValueHandling.Ignore;

            workerOptions.Serializer = new NewtonsoftJsonObjectSerializer(settings);
        });
    })
    .Build();

host.Run();

İşlev olarak tanınan yöntemler

İşlev yöntemi, aşağıdaki örnekte gösterildiği gibi yöntemine uygulanan bir Function özniteliği ve giriş parametresine tetikleyici özniteliği uygulanmış bir ortak sınıfın genel yöntemidir:

[Function(nameof(QueueFunction))]
[QueueOutput("output-queue")]
public string[] Run([QueueTrigger("input-queue")] Album myQueueItem, FunctionContext context)

Tetikleyici özniteliği tetikleyici türünü belirtir ve giriş verilerini bir yöntem parametresine bağlar. Önceki örnek işlev bir kuyruk iletisi tarafından tetiklenmiş ve kuyruk iletisi parametresindeki myQueueItem yöntemine geçirilir.

Function özniteliği, yöntemini bir işlev giriş noktası olarak işaretler. Ad proje içinde benzersiz olmalı, harfle başlamalıdır ve yalnızca en fazla 127 karakter uzunluğunda harf, _sayı, ve -içermelidir. Proje şablonları genellikle adlı Runbir yöntem oluşturur, ancak yöntem adı geçerli bir C# yöntemi adı olabilir. yöntemi, bir ortak sınıfın genel üyesi olmalıdır. Hizmetlerin bağımlılık ekleme yoluyla geçirilebilmesi için genellikle bir örnek yöntemi olmalıdır.

İşlev parametreleri

İşlev yöntemi imzası kapsamında ekleyebileceğiniz parametrelerden bazıları şunlardır:

Yürütme bağlamı

.NET yalıtılmış işlevi yöntemlerinize bir FunctionContext nesnesi geçirir. Bu nesne, GetLogger yöntemini çağırıp bir dize sağlayarak günlüklere yazabileceğiniz bir ILogger categoryName örnek almanıza olanak tanır. Bağımlılık ekleme kullanmak zorunda kalmadan bir ILogger elde etmek için bu bağlamı kullanabilirsiniz. Daha fazla bilgi için bkz . Günlüğe kaydetme.

İptal belirteçleri

İşlev bir CancellationToken parametresini kabul edebilir ve bu parametre, işletim sisteminin işlev sonlandırılacakken kodunuzu bildirmesini sağlar. İşlevin verileri tutarsız bir durumda bırakabilecek şekilde beklenmedik şekilde sonlandırılmadığından emin olmak için bu bildirimi kullanabilirsiniz.

İptal belirteçleri yalıtılmış bir çalışan işleminde çalıştırılırken .NET işlevlerinde desteklenir. Aşağıdaki örnek, iptal isteği alındığında bir özel durum oluşturur:

[Function(nameof(ThrowOnCancellation))]
public async Task ThrowOnCancellation(
    [EventHubTrigger("sample-workitem-1", Connection = "EventHubConnection")] string[] messages,
    FunctionContext context,
    CancellationToken cancellationToken)
{
    _logger.LogInformation("C# EventHub {functionName} trigger function processing a request.", nameof(ThrowOnCancellation));

    foreach (var message in messages)
    {
        cancellationToken.ThrowIfCancellationRequested();
        await Task.Delay(6000); // task delay to simulate message processing
        _logger.LogInformation("Message '{msg}' was processed.", message);
    }
}

Aşağıdaki örnek, bir iptal isteği alındığında temizleme eylemleri gerçekleştirir:

[Function(nameof(HandleCancellationCleanup))]
public async Task HandleCancellationCleanup(
    [EventHubTrigger("sample-workitem-2", Connection = "EventHubConnection")] string[] messages,
    FunctionContext context,
    CancellationToken cancellationToken)
{
    _logger.LogInformation("C# EventHub {functionName} trigger function processing a request.", nameof(HandleCancellationCleanup));

    foreach (var message in messages)
    {
        if (cancellationToken.IsCancellationRequested)
        {
            _logger.LogInformation("A cancellation token was received, taking precautionary actions.");
            // Take precautions like noting how far along you are with processing the batch
            _logger.LogInformation("Precautionary activities complete.");
            break;
        }

        await Task.Delay(6000); // task delay to simulate message processing
        _logger.LogInformation("Message '{msg}' was processed.", message);
    }
}

Bağlamalar

Bağlamalar yöntemler, parametreler ve dönüş türleri üzerindeki öznitelikler kullanılarak tanımlanır. Bağlamalar verileri dizeler, diziler ve düz eski sınıf nesneleri (POCO' lar) gibi serileştirilebilir türler olarak sağlayabilir. Bazı bağlama uzantıları için, hizmet SDK'larında tanımlanan hizmete özgü türlere de bağlanabilirsiniz.

HTTP tetikleyicileri için HTTP tetikleyicisi bölümüne bakın.

Yalıtılmış çalışan işlemi işlevlerine sahip tetikleyicileri ve bağlamaları kullanan eksiksiz bir başvuru örnekleri kümesi için bağlama uzantıları başvuru örneğine bakın.

Giriş bağlamaları

İşlev, bir işleve veri geçirebilen sıfır veya daha fazla giriş bağlamasına sahip olabilir. Tetikleyiciler gibi giriş bağlamaları da bir giriş parametresine bağlama özniteliği uygulanarak tanımlanır. İşlev yürütürken, çalışma zamanı bağlamada belirtilen verileri almaya çalışır. İstenen veriler genellikle bağlama parametreleri kullanılarak tetikleyici tarafından sağlanan bilgilere bağlıdır.

Çıkış bağlamaları

Bir çıkış bağlamasına yazmak için, ilişkili hizmete nasıl yazacağını tanımlayan işlev yöntemine bir çıkış bağlama özniteliği uygulamanız gerekir. yöntemi tarafından döndürülen değer çıkış bağlamasına yazılır. Örneğin, aşağıdaki örnek bir çıkış bağlaması kullanarak adlı output-queue ileti kuyruğuna bir dize değeri yazar:

[Function(nameof(QueueFunction))]
[QueueOutput("output-queue")]
public string[] Run([QueueTrigger("input-queue")] Album myQueueItem, FunctionContext context)
{
    // Use a string array to return more than one message.
    string[] messages = {
        $"Album name = {myQueueItem.Name}",
        $"Album songs = {myQueueItem.Songs.ToString()}"};

    _logger.LogInformation("{msg1},{msg2}", messages[0], messages[1]);

    // Queue Output messages
    return messages;
}

Birden çok çıkış bağlaması

Çıkış bağlamasına yazılan veriler her zaman işlevin dönüş değeridir. Birden fazla çıkış bağlamasına yazmanız gerekiyorsa, özel bir dönüş türü oluşturmanız gerekir. Bu dönüş türü, sınıfın bir veya daha fazla özelliğine uygulanan çıkış bağlama özniteliğine sahip olmalıdır. Aşağıdaki örnek, hem HTTP yanıtına hem de kuyruk çıkış bağlamasına yazan ASP.NET Core tümleştirmesi kullanan HTTP ile tetiklenen bir işlevdir:

public class MultipleOutputBindings
{
    private readonly ILogger<MultipleOutputBindings> _logger;

    public MultipleOutputBindings(ILogger<MultipleOutputBindings> logger)
    {
        _logger = logger;
    }

    [Function("MultipleOutputBindings")]
    public MyOutputType Run([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req)
    {
        _logger.LogInformation("C# HTTP trigger function processed a request.");
        var myObject = new MyOutputType
        {
            Result = new OkObjectResult("C# HTTP trigger function processed a request."),
            MessageText = "some output"
        };
        return myObject;
    }

    public class MyOutputType
    {
        [HttpResult]
        public IActionResult Result { get; set; }

        [QueueOutput("myQueue")]
        public string MessageText { get; set; }
    }
}

ASP.NET Core tümleştirmesi ile birden çok çıkış bağlaması için özel dönüş türleri kullanırken, sonucu sağlayan özelliğe özniteliğini eklemeniz [HttpResult] gerekir. ÖZNITELIĞI, HTTP uzantısının HttpResult 3.2.0 veya sonraki sürümü ve ASP.NET Core uzantısının 1.3.0 veya sonraki sürümleriyle birlikte SDK 1.17.3-preview2 veya üzeri kullanılırken kullanılabilir.

SDK türleri

Hizmete özgü bazı bağlama türleri için, bağlama verileri hizmet SDK'larından ve çerçevelerinden türler kullanılarak sağlanabilir. Bunlar, serileştirilmiş bir dizenin veya düz eski CLR nesnesinin (POCO) sunabileceği özelliklerin ötesinde daha fazla özellik sağlar. Daha yeni türleri kullanmak için projenizin çekirdek bağımlılıkların daha yeni sürümlerini kullanacak şekilde güncelleştirilmesi gerekir.

Dependency Sürüm gereksinimi
Microsoft.Azure.Functions.Worker 1.18.0 veya üzeri
Microsoft.Azure.Functions.Worker.Sdk 1.13.0 veya üzeri

Makinenizde SDK türlerini yerel olarak test ederken, Azure İşlevleri Core Tools, sürüm 4.0.5000 veya üzerini de kullanmanız gerekir. Komutunu kullanarak func version geçerli sürümünüzü de kontrol edebilirsiniz.

Her tetikleyici ve bağlama uzantısının, uzantı başvuru makalelerinde açıklanan kendi en düşük sürüm gereksinimi de vardır. Aşağıdaki hizmete özgü bağlamalar SDK türlerini sağlar:

Hizmet Tetikle Giriş bağlaması Çıkış bağlaması
Azure Blobları Genel Kullanıma Sunuldu Genel Kullanıma Sunuldu SDK türleri önerilmez.1
Azure Kuyrukları Genel Kullanıma Sunuldu Giriş bağlaması yok SDK türleri önerilmez.1
Azure Service Bus Genel Kullanıma Sunuldu Giriş bağlaması yok SDK türleri önerilmez.1
Azure Event Hubs Genel Kullanıma Sunuldu Giriş bağlaması yok SDK türleri önerilmez.1
Azure Cosmos DB KullanılmayanSDK türleri 2 Genel Kullanıma Sunuldu SDK türleri önerilmez.1
Azure Tabloları Tetikleyici yok Genel Kullanıma Sunuldu SDK türleri önerilmez.1
Azure Event Grid Genel Kullanıma Sunuldu Giriş bağlaması yok SDK türleri önerilmez.1

1 SDK türünü kullanacağınız çıkış senaryoları için, bir çıkış bağlaması kullanmak yerine doğrudan SDK istemcileri oluşturup bu istemcilerle çalışmanız gerekir. Bağımlılık ekleme örneği için bkz . Azure istemcilerini kaydetme.

2 Cosmos DB tetikleyicisi Azure Cosmos DB değişiklik akışını kullanır ve değişiklik akışı öğelerini JSON serileştirilebilir türler olarak kullanıma sunar. SDK türlerinin olmaması bu senaryo için tasarım gereğidir.

Not

Tetikleyici verilerini kullanan bağlama ifadeleri kullanılırken, tetikleyicinin kendisi için SDK türleri kullanılamaz.

HTTP tetikleyicisi

HTTP tetikleyicileri , bir işlevin bir HTTP isteği tarafından çağrılmasına olanak tanır. Kullanılabilecek iki farklı yaklaşım vardır:

ASP.NET Core tümleştirmesi

Bu bölümde, HttpRequest, HttpResponse ve IActionResult gibi ASP.NET Core'dan türleri kullanarak temel alınan HTTP isteği ve yanıt nesneleriyle nasıl çalışabilirsiniz gösterilmektedir. Bu model, .NET Framework'ün hedeflendiği uygulamalarda kullanılamaz ve bunun yerine yerleşik modeli kullanması gerekir.

Not

ASP.NET Core'un tüm özellikleri bu model tarafından kullanıma sunulmaz. Özellikle, ASP.NET Core ara yazılım işlem hattı ve yönlendirme özellikleri kullanılamaz. ASP.NET Core tümleştirmesi güncelleştirilmiş paketleri kullanmanızı gerektirir.

HTTP için ASP.NET Core tümleştirmesini etkinleştirmek için:

  1. Projenizde Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore paketi, sürüm 1.0.0 veya sonraki bir sürüme başvuru ekleyin.

  2. Projenizi şu belirli paket sürümlerini kullanacak şekilde güncelleştirin:

  3. Dosyanızda Program.cs konak oluşturucu yapılandırmasını çağıracak ConfigureFunctionsWebApplication()şekilde güncelleştirin. Bu yöntemi aksi takdirde kullanırsanız, bunun yerini alır ConfigureFunctionsWorkerDefaults() . Aşağıdaki örnekte, diğer özelleştirmeler olmadan minimum kurulum gösterilmektedir:

    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Extensions.Hosting;
    
    var host = new HostBuilder()
        .ConfigureFunctionsWebApplication()
        .Build();
    
    host.Run();
    
  4. ASP.NET Core türlerini kullanmak için mevcut HTTP ile tetiklenen işlevleri güncelleştirin. Bu örnekte standart HttpRequest ve IActionResult basit bir "hello, world" işlevi için kullanılan bir gösterilir:

    [Function("HttpFunction")]
    public IActionResult Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req)
    {
        return new OkObjectResult($"Welcome to Azure Functions, {req.Query["name"]}!");
    }
    

ASP.NET Core tümleştirmesi ile JSON serileştirme

ASP.NET Core'un kendi serileştirme katmanı vardır ve genel serileştirme yapılandırmasını özelleştirmeden etkilenmez. HTTP tetikleyicileriniz için kullanılan serileştirme davranışını özelleştirmek için hizmet kaydının bir parçası olarak bir .AddMvc() çağrı eklemeniz gerekir. Döndürülen IMvcBuilder , ASP.NET Core'un JSON serileştirme ayarlarını değiştirmek için kullanılabilir. Aşağıdaki örnekte, bu yaklaşımı kullanarak serileştirme için JSON.NET (Newtonsoft.Json) yapılandırma işlemi gösterilmektedir:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication()
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
        services.AddMvc().AddNewtonsoftJson();
    })
    .Build();
host.Run();

Yerleşik HTTP modeli

Yerleşik modelde sistem, gelen HTTP istek iletisini işleve geçirilen bir HttpRequestData nesnesine çevirir. Bu nesne istekten , , Cookies, IdentitiesURLve isteğe bağlı olarak bir ileti Bodyde dahil olmak üzere Headersveri sağlar. Bu nesne, HTTP isteğinin bir gösterimidir ancak temel alınan HTTP dinleyicisine veya alınan iletiye doğrudan bağlı değildir.

Benzer şekilde, işlev, http StatusCodeyanıtını oluşturmak için kullanılan verileri sağlayan bir HttpResponseData nesnesi döndürür. İleti , Headersve isteğe bağlı olarak bir ileti Bodyde dahil olmak üzere.

Aşağıdaki örnekte ve HttpResponseDatakullanımı gösterilmektedirHttpRequestData:

[Function(nameof(HttpFunction))]
public static HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequestData req,
    FunctionContext executionContext)
{
    var logger = executionContext.GetLogger(nameof(HttpFunction));
    logger.LogInformation("message logged");

    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    response.WriteString("Welcome to .NET isolated worker !!");

    return response;
}

Günlük Kaydı

Veya ILogger örneğini kullanarak ILogger<T> günlüklere yazabilirsiniz. Günlükçü, bir veya bir ILoggerFactory'nin ILogger<T>bağımlılık ekleme yoluyla elde edilebilir:

public class MyFunction {
    
    private readonly ILogger<MyFunction> _logger;
    
    public MyFunction(ILogger<MyFunction> logger) {
        _logger = logger;
    }
    
    [Function(nameof(MyFunction))]
    public void Run([BlobTrigger("samples-workitems/{name}", Connection = "")] string myBlob, string name)
    {
        _logger.LogInformation($"C# Blob trigger function Processed blob\n Name: {name} \n Data: {myBlob}");
    }

}

Günlükçü, işlevinize geçirilen bir FunctionContext nesnesinden de alınabilir. Günlüklerin yazıldığı kategorinin adı olan bir dize değeri geçirerek GetLogger<T> veya GetLogger yöntemini çağırın. Kategori genellikle günlüklerin yazıldığı belirli işlevin adıdır. Kategoriler hakkında daha fazla bilgi edinmek için izleme makalesine bakın.

veya LogErrorgibi LogWarning çeşitli günlük düzeylerini ILogger<T> yazmak için ve ILogger yöntemlerini kullanın. Günlük düzeyleri hakkında daha fazla bilgi edinmek için izleme makalesine bakın. Filtreleri kaydederek kodunuza eklenen bileşenlerin günlük düzeylerini özelleştirebilirsiniz:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services =>
    {
        // Registers IHttpClientFactory.
        // By default this sends a lot of Information-level logs.
        services.AddHttpClient();
    })
    .ConfigureLogging(logging =>
    {
        // Disable IHttpClientFactory Informational logs.
        // Note -- you can also remove the handler that does the logging: https://github.com/aspnet/HttpClientFactory/issues/196#issuecomment-432755765 
        logging.AddFilter("System.Net.Http.HttpClient", LogLevel.Warning);
    })
    .Build();

uygulamanızı içinde Program.csyapılandırmanın bir parçası olarak, hataların günlüklerinize nasıl ortaya çıkarılacağını gösteren davranışı da tanımlayabilirsiniz. Varsayılan davranış, kullandığınız oluşturucunun türüne bağlıdır.

varsayılan olarak bir HostBuilderkullandığınızda, kodunuz tarafından oluşan özel durumlar içinde RpcExceptionsarmalanabilir. Bu ek katmanı kaldırmak için oluşturucuyu yapılandırmanın EnableUserCodeException bir parçası olarak özelliğini "true" olarak ayarlayın:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(builder => {}, options =>
    {
        options.EnableUserCodeException = true;
    })
    .Build();

host.Run();

Application Insights

Yalıtılmış işlem uygulamanızı günlükleri doğrudan Application Insights'a yayacak şekilde yapılandırabilirsiniz. Bu davranış, günlükleri konak üzerinden geçirmenin varsayılan davranışının yerini alır ve bu günlüklerin nasıl yayıldığında size denetim sağladığından önerilir.

Paketleri yükleme

Kodunuzdan doğrudan Application Insights'a günlük yazmak için projenizde bu paketlere başvurular ekleyin:

Projenize bu başvuruları eklemek için aşağıdaki komutları çalıştırabilirsiniz:

dotnet add package Microsoft.ApplicationInsights.WorkerService
dotnet add package Microsoft.Azure.Functions.Worker.ApplicationInsights

Başlatmayı yapılandırma

Paketler yüklendikten sonra, aşağıdaki örnekte olduğu gibi dosyanızda Program.cs ve hizmet yapılandırması sırasında öğesini çağırmalısınız:AddApplicationInsightsTelemetryWorkerService() ConfigureFunctionsApplicationInsights()

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
    
var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services => {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .Build();

host.Run();

çağrısıConfigureFunctionsApplicationInsights(), İşlevler tanımlı ActivitySourcebir ITelemetryModuleöğesini dinleyen bir ekler. Bu, dağıtılmış izlemeyi desteklemek için gereken bağımlılık telemetrisini oluşturur. Bu uygulamayı kullanma hakkında AddApplicationInsightsTelemetryWorkerService() daha fazla bilgi edinmek için bkz . Çalışan Hizmeti uygulamaları için Application Insights.

Günlük düzeylerini yönetme

Önemli

İşlevler ana bilgisayarı ve yalıtılmış işlem çalışanı günlük düzeyleri için ayrı yapılandırmaya sahiptir. host.json'daki herhangi bir Application Insights yapılandırması çalışandan gelen günlüğü etkilemez ve benzer şekilde, çalışan kodunuzda yapılan yapılandırma da konaktan günlüğe kaydetmeyi etkilemez. Senaryonuz her iki katmanda da özelleştirme gerektiriyorsa değişiklikleri her iki yerde de uygulamanız gerekir.

Uygulamanızın geri kalanı ve ILogger<T>ile ILogger çalışmaya devam eder. Ancak, varsayılan olarak Application Insights SDK'sı günlükçüye yalnızca uyarıları ve daha ciddi günlükleri yakalamasını belirten bir günlük filtresi ekler. Bu davranışı devre dışı bırakmak istiyorsanız, hizmet yapılandırmasının bir parçası olarak filtre kuralını kaldırın:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services => {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .ConfigureLogging(logging =>
    {
        logging.Services.Configure<LoggerFilterOptions>(options =>
        {
            LoggerFilterRule defaultRule = options.Rules.FirstOrDefault(rule => rule.ProviderName
                == "Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider");
            if (defaultRule is not null)
            {
                options.Rules.Remove(defaultRule);
            }
        });
    })
    .Build();

host.Run();

Performansta iyileştirmeler

Bu bölümde, soğuk başlangıçla ilgili performansı geliştiren etkinleştirebileceğiniz seçenekler özetlenmiştir.

Genel olarak, uygulamanız temel bağımlılıklarının en son sürümlerini kullanmalıdır. Projenizi en azından aşağıdaki gibi güncelleştirmeniz gerekir:

  1. Microsoft.Azure.Functions.Worker'ı 1.19.0 veya sonraki bir sürüme yükseltin.
  2. Microsoft.Azure.Functions.Worker.Sdk'yi 1.16.4 veya sonraki bir sürüme yükseltin.
  3. Uygulamanız .NET Framework'i hedeflemediği sürece uygulamasına Microsoft.AspNetCore.Appbir çerçeve başvurusu ekleyin.

Aşağıdaki kod parçacığı bu yapılandırmayı bir proje dosyası bağlamında gösterir:

  <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.16.4" />
  </ItemGroup>

Yer tutucular

Yer tutucular, .NET 6 veya üzerini hedefleyen uygulamalar için soğuk başlatmayı geliştiren bir platform özelliğidir. Bu iyileştirmeyi kullanmak için aşağıdaki adımları kullanarak yer tutucuları açıkça etkinleştirmeniz gerekir:

  1. Proje yapılandırmanızı, önceki bölümde açıklandığı gibi en son bağımlılık sürümlerini kullanacak şekilde güncelleştirin.

  2. WEBSITE_USE_PLACEHOLDER_DOTNETISOLATED Bu az functionapp config appsettings set komutunu kullanarak yapabileceğiniz uygulama ayarını 1olarak ayarlayın:

    az functionapp config appsettings set -g <groupName> -n <appName> --settings 'WEBSITE_USE_PLACEHOLDER_DOTNETISOLATED=1'
    

    Bu örnekte değerini <groupName> kaynak grubunun adıyla, değerini ise işlev uygulamanızın adıyla değiştirin <appName> .

  3. İşlev uygulamasının netFrameworkVersion özelliğinin projenizin .NET 6 veya üzeri olması gereken hedef çerçevesiyle eşleştiğinden emin olun. Bunu yapmak için şu az functionapp config set komutunu kullanabilirsiniz:

    az functionapp config set -g <groupName> -n <appName> --net-framework-version <framework>
    

    Bu örnekte, hedef .NET sürümünüze göre değerini gibi v8.0uygun sürüm dizesiyle de değiştirin<framework>.

  4. İşlev uygulamanızın şu az functionapp config set komutunu kullanarak yapabileceğiniz 64 bitlik bir işlem kullanacak şekilde yapılandırıldığından emin olun:

    az functionapp config set -g <groupName> -n <appName> --use-32bit-worker-process false
    

Önemli

olarak ayarlanırken WEBSITE_USE_PLACEHOLDER_DOTNETISOLATED 1, diğer tüm işlev uygulaması yapılandırmaları doğru ayarlanmalıdır. Aksi takdirde işlev uygulamanız başlatılamaz.

İyileştirilmiş yürütücü

İşlev yürütücüsü, çağırmaların çalışmasına neden olan platformun bir bileşenidir. Bu bileşenin iyileştirilmiş bir sürümü, SDK'nın 1.16.2 sürümünden başlayarak varsayılan olarak etkinleştirilir. Başka yapılandırma gerekmez.

ReadyToRun

İşlev uygulamanızı ReadyToRun ikili dosyaları olarak derleyebilirsiniz. ReadyToRun, Bir Tüketim planında çalışırken soğuk başlangıçların etkisini azaltmaya yardımcı olmak için başlangıç performansını geliştirebilen bir önceden derleme biçimidir. ReadyToRun , .NET 6 ve sonraki sürümlerde kullanılabilir ve Azure İşlevleri çalışma zamanının 4.0 veya sonraki bir sürümünü gerektirir.

ReadyToRun, projeyi barındırma uygulamasının çalışma zamanı mimarisine göre derlemenizi gerektirir. Bunlar hizalanmamışsa, uygulamanız başlangıçta bir hatayla karşılaşır. Bu tablodan çalışma zamanı tanımlayıcınızı seçin:

İşletim Sistemi Uygulama 32 bit1 Çalışma zamanı tanımlayıcısı
Windows True win-x86
Windows False win-x64
Linux True Yok (desteklenmez)
Linux False linux-x64

1 Yalnızca 64 bit uygulamalar diğer bazı performans iyileştirmeleri için uygundur.

Windows uygulamanızın 32 bit mi yoksa 64 bit mi olduğunu denetlemek için kaynak grubunuzun adını ve <app_name> uygulamanızın adını yazarak aşağıdaki CLI komutunu <group_name> çalıştırabilirsiniz. "true" çıkışı, uygulamanın 32 bit, "false" ise 64 bit olduğunu gösterir.

 az functionapp config show -g <group_name> -n <app_name> --query "use32BitWorkerProcess"

Aynı değiştirmeleri kullanarak aşağıdaki komutla uygulamanızı 64 bit olarak değiştirebilirsiniz:

az functionapp config set -g <group_name> -n <app_name> --use-32bit-worker-process false`

Projenizi ReadyToRun olarak derlemek için ve <RuntimeIdentifier> öğelerini ekleyerek proje dosyanızı güncelleştirin<PublishReadyToRun>. Aşağıdaki örnekte, Bir Windows 64 bit işlev uygulamasında yayımlama yapılandırması gösterilmektedir.

<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
  <AzureFunctionsVersion>v4</AzureFunctionsVersion>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  <PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup>

proje dosyasının <RuntimeIdentifier> bir parçası olarak ayarlamak istemiyorsanız, bunu yayımlama hareketinin bir parçası olarak da yapılandırabilirsiniz. Örneğin, bir Windows 64 bit işlev uygulaması ile .NET CLI komutu şu şekilde olabilir:

dotnet publish --runtime win-x64

Visual Studio'da, yayımlama profilindeki Hedef Çalışma Zamanı seçeneği doğru çalışma zamanı tanımlayıcısına ayarlanmalıdır. Taşınabilir varsayılan değerine ayarlandığında ReadyToRun kullanılmaz.

Azure İşlevlerine dağıtma

İşlev kodu projenizi Azure'a dağıttığınızda, proje bir işlev uygulamasında veya Linux kapsayıcısında çalıştırılmalıdır. Kodunuzu dağıtmadan önce işlev uygulamasının ve diğer gerekli Azure kaynaklarının mevcut olması gerekir.

İşlev uygulamanızı bir Linux kapsayıcısında da dağıtabilirsiniz. Daha fazla bilgi için bkz. Kapsayıcılarla çalışma ve Azure İşlevleri.

Azure kaynakları oluşturma

Aşağıdaki yöntemlerden birini kullanarak azureda işlev uygulamanızı ve diğer gerekli kaynakları oluşturabilirsiniz:

  • Visual Studio: Visual Studio, kod yayımlama işlemi sırasında sizin için kaynaklar oluşturabilir.
  • Visual Studio Code: Visual Studio Code aboneliğinize bağlanabilir, uygulamanız için gereken kaynakları oluşturabilir ve ardından kodunuzu yayımlayabilir.
  • Azure CLI: Azure'da gerekli kaynakları oluşturmak için Azure CLI'yi kullanabilirsiniz.
  • Azure PowerShell: Azure'da gerekli kaynakları oluşturmak için Azure PowerShell'i kullanabilirsiniz.
  • Dağıtım şablonları: Gerekli kaynakların Azure'a dağıtımını otomatikleştirmek için ARM şablonlarını ve Bicep dosyalarını kullanabilirsiniz. Şablonunuzun gerekli ayarları içerdiğine emin olun.
  • Azure portalı: Azure portalında gerekli kaynakları oluşturabilirsiniz.

Uygulamanızı yayımlama

azure'da işlev uygulamanızı ve diğer gerekli kaynakları oluşturduktan sonra aşağıdaki yöntemlerden birini kullanarak kod projesini Azure'a dağıtabilirsiniz:

Daha fazla bilgi için bkz. Azure İşlevleri dağıtım teknolojileri.

Dağıtım yükü

Dağıtım yöntemlerinin çoğu zip arşivini kullanır. Zip arşivini kendiniz oluşturuyorsanız, bu bölümde açıklanan yapıyı izlemesi gerekir. Aksi takdirde, uygulamanız başlangıçta hatalarla karşılaşabilir.

Dağıtım yükü, kapsayan üst klasör olmadan bir dotnet publish komutun çıktısı ile eşleşmelidir. Zip arşivi aşağıdaki dosyalardan oluşturulmalıdır:

  • .azurefunctions/
  • extensions.json
  • functions.metadata
  • host.json
  • worker.config.json
  • Proje yürütülebilir dosyanız (konsol uygulaması)
  • Diğer destekleyici dosyalar ve dizinler bu yürütülebilir dosyayla eş

Bu dosyalar derleme işlemi tarafından oluşturulur ve doğrudan düzenlenmesi amaçlanmamıştır.

Dağıtım için zip arşivi hazırlarken, yalnızca çıkış dizininin içeriğini sıkıştırmanız gerekir, kapsayan dizinin kendisini değil. Arşiv geçerli çalışma dizinine ayıklandığında, yukarıda listelenen dosyaların hemen görünür olması gerekir.

Dağıtım gereksinimleri

İşletim sistemine bağlı olarak Azure'daki yalıtılmış çalışan modelinde .NET işlevlerini çalıştırmak için birkaç gereksinim vardır:

  • FUNCTIONS_WORKER_RUNTIME değerine dotnet-isolatedayarlanmalıdır.
  • netFrameworkVersion , istenen sürüme ayarlanmalıdır.

Önceki bölümde yer alan yöntemleri kullanarak Azure'da işlev uygulamanızı oluşturduğunuzda, bu gerekli ayarlar sizin için eklenir. Arm şablonlarını veya otomasyon için Bicep dosyalarını kullanarak bu kaynakları oluşturduğunuzda, bunları şablonda ayarladığınızdan emin olmanız gerekir.

Hata ayıklama

Visual Studio veya Visual Studio Code kullanarak yerel olarak çalışırken, .NET yalıtılmış çalışan projenizde normal şekilde hata ayıklayabilirsiniz. Ancak, beklendiği gibi çalışmayan iki hata ayıklama senaryosu vardır.

Visual Studio kullanarak Uzaktan Hata Ayıklama

Yalıtılmış çalışan işlemi uygulamanız İşlevler çalışma zamanının dışında çalıştığından, uzak hata ayıklayıcıyı ayrı bir işleme eklemeniz gerekir. Visual Studio kullanarak hata ayıklama hakkında daha fazla bilgi edinmek için bkz . Uzaktan Hata Ayıklama.

.NET Framework hedeflenirken hata ayıklama

Yalıtılmış projeniz .NET Framework 4.8'i hedef alıyorsa, geçerli önizleme kapsamı hata ayıklamayı etkinleştirmek için el ile adımlar gerektirir. Başka bir hedef çerçeve kullanılıyorsa bu adımlar gerekli değildir.

Uygulamanız ilk işlemi olarak çağrısıyla FunctionsDebugger.Enable(); başlamalıdır. Bu, bir HostBuilder başlatmadan önce yönteminde Main() oluşur. Dosyanız Program.cs şuna benzer görünmelidir:

using System;
using System.Diagnostics;
using Microsoft.Extensions.Hosting;
using Microsoft.Azure.Functions.Worker;
using NetFxWorker;

namespace MyDotnetFrameworkProject
{
    internal class Program
    {
        static void Main(string[] args)
        {
            FunctionsDebugger.Enable();

            var host = new HostBuilder()
                .ConfigureFunctionsWorkerDefaults()
                .Build();

            host.Run();
        }
    }
}

Ardından, .NET Framework hata ayıklayıcısını kullanarak işleme el ile eklemeniz gerekir. Visual Studio, yalıtılmış çalışan işlemi .NET Framework uygulamaları için bunu henüz otomatik olarak yapmaz ve "Hata Ayıklamayı Başlat" işleminden kaçınılmalıdır.

Proje dizininizde (veya derleme çıktı dizininde) şu komutu çalıştırın:

func host start --dotnet-isolated-debug

Bu işlem çalışanınızı başlatır ve işlem şu iletiyle durdurulur:

Azure Functions .NET Worker (PID: <process id>) initialized in debug mode. Waiting for debugger to attach...

Çalışan işleminizin kimliği nerededir <process id> ? Artık işleme el ile eklemek için Visual Studio'yu kullanabilirsiniz. Bu işlemle ilgili yönergeler için bkz . Çalışan işleme ekleme.

Hata ayıklayıcı eklendikten sonra işlem yürütmesi devam eder ve hata ayıklaması yapabileceksiniz.

.NET sürümlerini önizleme

Genel kullanıma sunulan bir sürümden önce bir .NET sürümü Önizleme veya Go-live durumunda yayınlanabilir. Bu durumlarla ilgili ayrıntılar için .NET Resmi Destek İlkesi'ne bakın.

Yerel İşlevler projesinden belirli bir sürümü hedeflemek mümkün olsa da, Azure'da barındırılan işlev uygulamalarında bu sürüm kullanılamayabilir. Azure İşlevleri yalnızca bu bölümde not edilen Önizleme veya Canlı yayınlarla kullanılabilir.

Azure İşlevleri şu anda aşağıdaki "Önizleme" veya "Go-live" .NET sürümleriyle kullanılabilir:

İşletim sistemi .NET önizleme sürümü
Windows .NET 9 Önizleme 61, 2
Linux .NET 9 RC21, 3

1 .NET 9'un başarıyla hedeflenmesi için projenizin çekirdek paketlerin 2.x sürümlerine başvurması gerekir. Visual Studio kullanıyorsanız, .NET 9 için sürüm 17.12 veya üzeri gerekir.

2 Önizleme süresi boyunca bazı istemcilerde Windows desteği görünmeyebilir.

3 .NET 9, Esnek Tüketim SKU'su üzerinde henüz desteklenmiyor.

Kullanabileceğiniz genel kullanıma sunulan sürümlerin listesi için bkz . Desteklenen sürümler .

Önizleme .NET SDK'sı kullanma

Azure İşlevleri .NET'in önizleme sürümüyle kullanmak için projenizi şu şekilde güncelleştirmeniz gerekir:

  1. Geliştirmenizde ilgili .NET SDK sürümünü yükleme
  2. TargetFramework Dosyanızdaki .csproj ayarı değiştirme

Azure'daki işlev uygulamanıza dağıttığınızda, çerçevenin uygulama için kullanılabilir hale getirildiğinden de emin olmanız gerekir. Önizleme döneminde, bazı araçlar ve deneyimler yeni önizleme sürümünü bir seçenek olarak ortaya çıkaramayabilir. Örneğin Azure portalında önizleme sürümünü görmüyorsanız, sürümü el ile yapılandırmak için REST API, Bicep şablonları veya Azure CLI kullanabilirsiniz.

Windows'ta barındırılan uygulamalar için aşağıdaki Azure CLI komutunu kullanın. değerini <groupName> kaynak grubunun adıyla, değerini ise işlev uygulamanızın adıyla değiştirin <appName> . değerini gibi v8.0uygun sürüm dizesiyle değiştirin<framework>.

az functionapp config set -g <groupName> -n <appName> --net-framework-version <framework>

.NET önizleme sürümlerini kullanma konusunda dikkat edilmesi gerekenler

.NET'in önizleme sürümleriyle İşlevler'i kullanırken şu noktaları göz önünde bulundurun:

  • Visual Studio'da işlevlerinizi yazarken, .NET önizleme SDK'ları ile Azure İşlevleri proje derlemeyi destekleyen Visual Studio Preview'ı kullanmanız gerekir.

  • En son İşlevler araçlarına ve şablonlarına sahip olduğunuzdan emin olun. Araçlarınızı güncelleştirmek için:

    1. Araçlar>Seçenekleri'ne gidin, Projeler ve Çözümler'in altında Azure İşlevleri seçin.
    2. İstendiği gibi Güncelleştirmeleri denetle ve güncelleştirmeleri yükle'yi seçin.
  • Önizleme süresi boyunca geliştirme ortamınız barındırılan hizmetten daha yeni bir .NET önizleme sürümüne sahip olabilir. Bu, dağıtıldığında işlev uygulamanızın başarısız olmasına neden olabilir. Bu sorunu gidermek için, içinde global.jsonkullanılacak SDK sürümünü belirtebilirsiniz.

    1. dotnet --list-sdks komutunu çalıştırın ve yerel geliştirme sırasında kullanmakta olduğunuz önizleme sürümünü not edin.
    2. dotnet new globaljson --sdk-version <SDK_VERSION> --force Komutunu çalıştırın. Burada<SDK_VERSION>, yerel olarak kullandığınız sürümdür. Örneğin, dotnet new globaljson --sdk-version dotnet-sdk-8.0.100-preview.7.23376.3 --force sistemin projenizi oluştururken .NET 8 Preview 7 SDK'sını kullanmasına neden olur.

Not

Önizleme çerçevelerinin tam zamanında yüklenmesi nedeniyle Windows üzerinde çalışan işlev uygulamaları, önceki GA sürümlerine kıyasla daha fazla soğuk başlangıç süresiyle karşılaşabilir.

Sonraki adımlar