Yalıtılmış bir işlemde C# Azure İşlevleri çalıştırma kılavuzu

Bu makale, C# kullanarak veri depolamada işlemden çıkılmış olan .NET yalıtılmış işlem işlevleri geliştirmeye Azure İşlevleri. İşlem dışından çalışmanız, işlev kodunuzu çalışma zamanından Azure İşlevleri sağlar. Yalıtılmış işlem C# işlevleri hem .NET 5.0 hem de .NET 6.0 üzerinde çalıştırıldı. İşlem sırasında C# sınıf kitaplığı işlevleri .NET 5.0'da desteklenmiyor.

Başlarken Kavramlar Örnekler

Neden .NET yalıtılmış işlemi?

Daha Azure İşlevleri, yalnızca konakla aynı işlemde sınıf kitaplığı olarak çalıştırılan .NET işlevleri için sıkı bir şekilde tümleştirilmiş modu desteklemektedir. Bu mod, konak işlemi ve işlevler arasında derin tümleştirme sağlar. Örneğin, .NET sınıf kitaplığı işlevleri bağlama API'lerini ve türlerini paylaşabilir. Ancak bu tümleştirme, konak işlemi ile .NET işlevi arasında daha sıkı bir eşleştirme gerektirir. Örneğin, işlem içinde çalışan .NET işlevlerinin İşlevler çalışma zamanıyla aynı .NET sürümünde çalışması gerekir. Bu kısıtlamaların dışında çalıştırmaya olanak sağlamak için artık yalıtılmış bir işlemde çalıştırmayı seçebilirsiniz. Bu işlem yalıtımı, İşlevler çalışma zamanı tarafından yerel olarak desteklenen geçerli .NET yayınlarını (.NET 5.0 gibi) kullanan işlevler geliştirmenizi de sağlar. Yalıtılmış işlem ve işlem içinde C# sınıf kitaplığı işlevleri .NET 6.0 üzerinde çalıştırıldı. Daha fazla bilgi edinmek için bkz. Desteklenen sürümler.

Bu işlevler ayrı bir işlemde çalıştırıldıklarına göre, .NET yalıtılmış işlev uygulamaları ile .NET sınıf kitaplığı işlev uygulamaları arasında bazı özellik ve işlevler farkları vardır.

İşlemden çıkmanın avantajları

İşlem tükendi, .NET işlevleriniz aşağıdaki avantajlardan faydalanabilirsiniz:

  • Daha az çakışma: İşlevler ayrı bir işlemde çalıştırıla olduğundan, uygulamanıza kullanılan derlemeler konak işlemi tarafından kullanılan aynı derlemelerin farklı sürümüyle çakışmaz.
  • Sürecin tam denetimi: Uygulamanın başlat sürecini siz kontrol edersiniz ve kullanılan yapılandırmaları ve ara yazılımı başlatabilirsiniz.
  • Bağımlılık ekleme: İşlem üzerinde tam denetime sahip olduğunuz için, bağımlılık ekleme ve işlev uygulamanıza ara yazılım ekleme için geçerli .NET davranışlarını kullanabilirsiniz.

Desteklenen sürümler

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

Aşağıdaki tabloda, belirli bir İşlev sürümüyle kullan .NET Framework en yüksek .NET Core veya ağ üst düzeyi yer alır.

İşlevler çalışma zamanı sürümü İşlem içinde
(.NET sınıf kitaplığı)
İşlem dışında
(.NET Yalıtılmış)
İşlevler 4.x .NET 6.0 .NET 6.0
İşlevler 3.x .NET Core 3.1 .NET 5.01
İşlevler 2.x .NET Core 2.12 yok
İşlevler 1.x .NET Framework 4.8 yok

1 Derleme işlemi için .NET Core 3.1 SDK'sı da gerekir.
2 Ayrıntılar için bkz. İşlevler v2.x ile ilgili dikkat edilmesi gerekenler.

Belirli eski ikincil sürümlerin kaldırılması Azure İşlevleri yayın sürümleriyle ilgili en son haberler için, Azure App Service duyurularını izleyebilirsiniz.

.NET yalıtılmış projesi

.NET yalıtılmış işlev projesi, temelde desteklenen bir .NET çalışma zamanının hedefini alan bir .NET konsol uygulaması projesidir. Aşağıda, herhangi bir .NET yalıtılmış projesinde gereken temel dosyalar ve ardından gelir:

  • host.json dosyası.
  • local.settings.json dosyası.
  • Projeyi ve bağımlılıkları tanımlayan C# proje dosyası (.csproj).
  • Uygulamanın giriş noktası olan Program.cs dosyası.

Paket başvuruları

.NET projeniz, işlem dışıyken hem temel işlevleri hem de bağlama uzantılarını uygulayan benzersiz bir paket kümesi kullanır.

Çekirdek paketler

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

Uzantı paketleri

.NET yalıtılmış bir işlemde çalıştırılmış işlevler farklı bağlama türlerine sahip olduğundan, benzersiz bir bağlama uzantısı paketleri kümesi gerektirirler.

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

Başlangıç ve yapılandırma

Yalıtılmış .NET işlevlerini kullanırken, işlev uygulamanıza (genellikle Program.cs içinde) erişmeye başlayabilirsiniz. Kendi konak örneğinizi oluşturmak ve başlatma sorumluluğu size ait. Bu nedenle, uygulamanıza yönelik yapılandırma işlem hattına doğrudan erişiminiz de vardır. İşlem tükeniyorken yapılandırmaları kolayca ekleyebilir, bağımlılıklar ekleyebilir ve kendi ara yazılımınızı çalıştırabilirsiniz.

Aşağıdaki kod bir HostBuilder işlem hattı örneğini gösterir:

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(s =>
    {
        s.AddSingleton<IHttpResponderService, DefaultHttpResponderService>();
    })
    .Build();

Bu kod için using Microsoft.Extensions.DependencyInjection; gerekir.

[HostBuilder,] işlev uygulamanızı başlatmak için zaman uyumsuz olarak çalıştırarak tam olarak başlatılan [bir IHost] örneği oluşturmak ve geri dönmek için kullanılır.

await host.RunAsync();

Yapılandırma

ConfigureFunctionsWorkerDefaults yöntemi, işlev uygulamasının işlem dışında çalışması için gereken ayarları eklemek için kullanılır ve bu ayar aşağıdaki işlevleri içerir:

  • Varsayılan dönüştürücü kümesi.
  • Varsayılan [JsonSerializerOptions'ı özellik] adlarda büyük/sonlarını yoksaymak için ayarlayın.
  • Günlük kaydı Azure İşlevleri tümleştirin.
  • Çı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 ayarlayabilirsiniz. İşlev uygulamanıza gereken yapılandırmaları 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.

Bu yapılandırmalar, ayrı bir işlemde çalışan işlev uygulamanıza uygulanır. İşlevler ana bilgisayarı veya tetikleyici ve bağlama yapılandırmasında değişiklik yapmak için host.json dosyasını kullanmaya devam edersiniz.

Bağımlılık ekleme

Bağımlılık ekleme, .NET sınıf kitaplıklarına kıyasla basitleştirilmiştir. Hizmetleri kaydetmek için bir başlangıç sınıfı oluşturmak yerine, konak oluşturucuda [ConfigureServices'i] çağırmanız ve [IServiceCollection'da] uzantı yöntemlerini kullanarak belirli hizmetleri eklemeniz gerekir.

Aşağıdaki örnek tek bir hizmet bağımlılığını içerir:

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

Bu kod için using Microsoft.Extensions.DependencyInjection; gerekir. Daha fazla bilgi edinmek için bkz.ASP.NET Core.

Ara yazılım

.NET yalıtılmış ayrıca, dosyalarda var olanlara benzer bir model kullanarak ara yazılım ASP.NET. Bu model, çağrı işlem hattına ve işlevler yürütülmeden önce ve sonra mantık ekleme olanağı sağlar.

ConfigureFunctionsWorkerDefaults uzantı yönteminin, aşağıdaki örnekte gördüğünüz gibi kendi ara yazılımınızı kaydetmenize olanak sağlayan bir aşırı yüklemesi vardır.

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(workerApplication =>
    {
        // Register our custom middleware with the worker
        workerApplication.UseMiddleware<MyCustomMiddleware>();
    })
    .Build();

İşlev uygulamanıza ö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.

Yürütme bağlamı

.NET yalıtılmış işlevi [yöntemlerinize bir FunctionContext] nesnesi iletir. Bu nesne GetLogger yöntemini çağırarak ve bir dize serek günlüklere yazmak için bir ILogger örneği alamanıza olanak categoryName sağlar. Daha fazla bilgi edinmek için bkz. Günlüğe kaydetme.

Bağlamalar

Bağlamalar yöntemlerde, parametrelerde ve dönüş türlerinde öznitelikler kullanılarak tanımlanır. İşlev yöntemi, aşağıdaki örnekte gösterildiği gibi bir giriş parametresine özniteliği ve tetikleyici Function özniteliği uygulanmış bir yöntemdir:

[Function("QueueFunction")]
[QueueOutput("output-queue")]
public static string[] Run([QueueTrigger("input-queue")] Book 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 tetiklenir ve kuyruk iletisi parametresinde yöntemine myQueueItem geçirildi.

özniteliği, Function yöntemi işlev giriş noktası olarak işaretler. Ad bir proje içinde benzersiz olmalı, bir harfle başlamalıdır ve en fazla _ 127 karakter uzunluğunda harf, sayı ve , - ve içermelidir. Project genellikle adlı bir yöntem oluşturur Run ancak yöntem adı herhangi bir geçerli C# yöntem adı olabilir.

.NET yalıtılmış projeleri ayrı bir çalışan işlemi içinde çalıştırıldıkları için, bağlamalar , ve gibi zengin bağlama ICollector<T> IAsyncCollector<T> sınıflarının avantajına sahip CloudBlockBlob değildir. DocumentClient ve BrokeredMessagegibi temel hizmet SDK'larından [] devralınan türler için doğrudan destek de yoktur. Bunun yerine bağlamalar dizeleri, dizileri ve düz eski sınıf nesneleri (POCOs) gibi serileştirilebilir türleri kullanır.

HTTP tetikleyicileri için, istek ve yanıt verilerine erişmek için HttpRequestData ve HttpResponseData kullan gerekir. Bunun nedeni, işlem sırasında özgün HTTP isteğine ve yanıt nesnelerine erişiminizin olmadığını gösterir.

İşlem tamamlandıktan sonra tetikleyicileri ve bağlamaları kullanmaya ilgili başvuru örneklerinin eksiksiz bir kümesi için bağlama uzantıları başvuru örneğine bakın.

Giriş bağlamaları

Bir işlevin bir işleve veri geçebilecek sıfır veya daha fazla giriş bağlaması olabilir. Tetikleyiciler gibi giriş bağlamaları da giriş parametresine bağlama özniteliği uygulanarak tanımlanır. İşlev yürütülü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ğlamaya yazmak için, bağlı hizmete nasıl yaz gerektiğini tanımlanan işlev yöntemine bir çıkış bağlaması özniteliği uygulamanız gerekir. yöntemi tarafından döndürülen değer çıkış bağlamaya yazılır. Örneğin, aşağıdaki örnek çıkış bağlaması kullanarak adlı bir ileti myqueue-output kuyruğuna bir dize değeri yazar:

[Function("QueueFunction")]
[QueueOutput("output-queue")]
public static string[] Run([QueueTrigger("input-queue")] Book myQueueItem,

    FunctionContext context)
{
    // Use a string array to return more than one message.
    string[] messages = {
        $"Book name = {myQueueItem.Name}",
        $"Book ID = {myQueueItem.Id}"};
    var logger = context.GetLogger("QueueFunction");
    logger.LogInformation($"{messages[0]},{messages[1]}");

    // Queue Output messages
    return messages;
}

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

Çıkış bağlaması için yazılan veriler her zaman işlevin dönüş değeridir. Birden fazla çıkış bağlaması yazmanız gerekirse, özel bir dönüş türü oluşturmanız gerekir. Bu dönüş türünün, sınıfın bir veya daha fazla özelliğine çıkış bağlama özniteliği uygulanmış olması gerekir. Bir HTTP tetikleyicisinde yer alan aşağıdaki örnek, hem HTTP yanıtına hem de kuyruk çıkış bağlamaya yazar:

public static class MultiOutput
{
    [Function("MultiOutput")]
    public static MyOutputType Run([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req,
        FunctionContext context)
    {
        var response = req.CreateResponse(HttpStatusCode.OK);
        response.WriteString("Success!");

        string myQueueOutput = "some output";

        return new MyOutputType()
        {
            Name = myQueueOutput,
            HttpResponse = response
        };
    }
}

public class MyOutputType
{
    [QueueOutput("myQueue")]
    public string Name { get; set; }

    public HttpResponseData HttpResponse { get; set; }
}

HTTP tetikleyicisi yanıtı her zaman çıkış olarak kabul edilir, bu nedenle dönüş değeri özniteliği gerekli değildir.

HTTP tetikleyicisi

HTTP tetikleyicileri, gelen HTTP isteği iletiyi işleve geçirilen [bir HttpRequestData] nesnesine çevirir. Bu nesne , , , ve isteğe bağlı bir ileti Headers Cookies dahil olmak üzere Identities URL istekten veri Body sağlar. Bu nesne, isteğin kendisini değil HTTP isteği nesnesinin bir gösterimidir.

Benzer şekilde işlev, ileti , ve isteğe bağlı olarak bir ileti de dahil olmak üzere HTTP yanıtını oluşturmak için kullanılan verileri sağlayan bir HttpResponseData StatusCode Headers nesnesi Body döndürür.

Aşağıdaki kod bir HTTP tetikleyicisidir

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

    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Date", "Mon, 18 Jul 2016 16:06:00 GMT");
    response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    
    response.WriteString("Welcome to .NET 5!!");

    return response;
}

Günlüğe Kaydetme

Yalıtılmış .NET'te, işlevinize geçirilen functionContext nesnesinden elde edilen [bir ILogger] örneğini kullanarak günlüklere yazabilirsiniz. [GetLogger yöntemini] çağırarak, günlüklerin yazıldığı kategorinin adı olan bir dize değeri iletir. 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.

Aşağıdaki örnekte [ILogger'ı] nasıl edinir ve bir işlevin içine günlükler yazabilir:

var logger = executionContext.GetLogger("HttpFunction");
logger.LogInformation("message logged");

veya gibi çeşitli günlük düzeyleri yazmak için çeşitli ILogger yöntemlerini LogWarning LogError kullanın. Günlük düzeyleri hakkında daha fazla bilgi edinmek için izleme makalesine bakın.

Bağımlılık eklemesi kullanırken bir ILogger da sağlanır.

.NET sınıf kitaplığı işlevleri arasındaki farklar

Bu bölümde işlem sırasında çalışan .NET sınıf kitaplığı işlevlerine kıyasla işlem dışında çalışan işlevsel ve davranış farklılıklarının geçerli durumu açıklandı:

Özellik/davranış İşlem içinde İşlem dışında
.NET sürümleri .NET Core 3.1
.NET 6.0
.NET 5.0
.NET 6.0
Çekirdek paketler Microsoft .NET.Sdk.Functions Microsoft.Azure.Functions.Worker
Microsoft.Azure.Functions.Worker.Sdk
Uzantı paketlerini bağlama Microsoft.Azure.WebJobs.Extensions.* Microsoft.Azure.Functions.Worker.Extensions.* altında
Günlüğe Kaydetme [İşleve geçirilen ILogger] [FunctionContext'den] alınan ILogger
İptal belirteçleri Desteklenir Desteklenmez
Çıkış bağlamaları Out parametreleri Dönüş değerleri
Çıkış bağlaması türleri IAsyncCollector, DocumentClient, BrokeredMessageve istemciye özgü diğer türler Basit türler, JSON serileştirilebilir türler ve diziler.
Birden çok çıkış bağlaması Desteklenir Desteklenir
HTTP tetikleyicisi HttpRequest / ObjectResult HttpRequestData / HttpResponseData
Dayanıklı İşlevler Desteklenir Desteklenmez
Bağlayıcı bağlamalar Desteklenir Desteklenmez
function.json yapıt Oluşturulan Oluşturulmadı
Yapılandırma host.json host.json ve özel başlatma
Bağımlılık ekleme Desteklenir Desteklenir
Ara yazılım Desteklenmez Desteklenir
Soğuk başlangıç süreleri Tipik Tam zamanında başlatma nedeniyle daha uzun. Olası gecikmeleri azaltmak için Windows Linux'ta çalıştırın.
ReadyToRun Desteklenen TBD

Sonraki adımlar