Share via


Olay temelli arka plan işleme için Azure Web İşleri SDK'sını kullanma

Bu makalede, Azure Web İşleri SDK'sı ile çalışma hakkında yönergeler sağlanır. Web İşleri'ni hemen kullanmaya başlamak için bkz. Azure Web İşleri SDK'sını kullanmaya başlama.

Web İşleri SDK sürümleri

Sürüm 3 arasındaki temel farklar bunlardır. x ve sürüm 2. Web İşleri SDK'sının x'i :

  • Sürüm 3. x , .NET Core desteği ekler.
  • Sürüm 3'te. x, Web İşleri SDK'sı için gereken Depolama bağlama uzantısını yükleyeceksiniz. Sürüm 2'de. x, Depolama bağlamaları SDK'ya dahil edilir.
  • .NET Core için Visual Studio 2019 araçları (3.x) projeleri .NET Framework (2) için araçlardan farklıdır.x) projeleri. Daha fazla bilgi edinmek için bkz. Visual Studio kullanarak Web İşleri geliştirme ve dağıtma - Azure App Service.

Bu makaledeki çeşitli açıklamalar, her iki Web İşleri sürüm 3 için de örnekler sağlar. x ve Webjobs sürüm 2. x.

Azure İşlevleri, Web İşleri SDK'sı üzerine kurulmuştur.

  • Azure İşlevleri sürüm 2. x, Web İşleri SDK'sı sürüm 3 üzerine kurulmuştur. x.
  • Azure İşlevleri sürüm 1. x, Web İşleri SDK'sı sürüm 2 üzerine kurulmuştur. x.

Hem Azure İşlevleri hem de Web İşleri SDK'sı için kaynak kod depoları Web İşleri SDK numaralandırmasını kullanır. Bu nasıl yapılır makalesinin çeşitli bölümleri Azure İşlevleri belgelerine bağlantı sağlar.

Daha fazla bilgi için bkz. Web İşleri SDK'sını ve Azure İşlevleri karşılaştırma

Web İşleri konağı

Konak, işlevler için bir çalışma zamanı kapsayıcısıdır. Konak tetikleyicileri dinler ve işlevleri çağırır. Sürüm 3'te. x, konak bir uygulamasıdır IHost. Sürüm 2'de. x, nesnesini kullanırsınız JobHost . Kodunuzda bir konak örneği oluşturur ve davranışını özelleştirmek için kod yazarsınız.

Bu, Web İşleri SDK'sını doğrudan kullanmakla Azure İşlevleri aracılığıyla dolaylı olarak kullanmak arasında önemli bir farktır. Azure İşlevleri'de hizmet konağı denetler ve kod yazarak konağı özelleştiremezsiniz. Azure İşlevleri, host.json dosyasındaki ayarlar aracılığıyla konak davranışını özelleştirmenize olanak tanır. Bu ayarlar kod değil dizelerdir ve bu dizelerin kullanımı, yapabileceğiniz özelleştirme türlerini sınırlar.

Konak bağlantı dizeleri

Web İşleri SDK'sı, Yerel olarak veya Azure'da çalıştırdığınızda Web İşinin ortamında çalıştırdığınızda local.settings.json dosyasında Azure Depolama ve Azure Service Bus bağlantı dizelerini arar. Varsayılan olarak, Web İşleri SDK'sı adıyla AzureWebJobsStoragebir depolama bağlantı dizesi ayarı gerektirir.

Sürüm 2. SDK'nın x'i belirli bir ad gerektirmez. Sürüm 2. x , bu bağlantı dizeleri için kendi adlarınızı kullanmanıza ve bunları başka bir yerde depolamanıza olanak tanır. Koddaki adları aşağıdaki gibi kullanarak JobHostConfigurationayarlayabilirsiniz:

static void Main(string[] args)
{
    var _storageConn = ConfigurationManager
        .ConnectionStrings["MyStorageConnection"].ConnectionString;

    //// Dashboard logging is deprecated; use Application Insights.
    //var _dashboardConn = ConfigurationManager
    //    .ConnectionStrings["MyDashboardConnection"].ConnectionString;

    JobHostConfiguration config = new JobHostConfiguration();
    config.StorageConnectionString = _storageConn;
    //config.DashboardConnectionString = _dashboardConn;
    JobHost host = new JobHost(config);
    host.RunAndBlock();
}

Not

Çünkü sürüm 3. x varsayılan .NET Core yapılandırma API'lerini kullanır, bağlantı dizesi adlarını değiştirmek için API yoktur. Bkz . Visual Studio kullanarak Web İşleri geliştirme ve dağıtma

Ana bilgisayar geliştirme ayarları

Yerel geliştirmeyi daha verimli hale getirmek için ana bilgisayarı geliştirme modunda çalıştırabilirsiniz. Geliştirme modunda çalıştırdığınızda otomatik olarak değişen ayarlardan bazıları şunlardır:

Özellik Geliştirme ayarı
Tracing.ConsoleLevel TraceLevel.Verbose günlük çıktısını en üst düzeye çıkarmak için.
Queues.MaxPollingInterval Kuyruk yöntemlerinin hemen tetiklendiğinden emin olmak için düşük bir değer.
Singleton.ListenerLockPeriod Hızlı yinelemeli geliştirmeye yardımcı olmak için 15 saniye.

Geliştirme modunu etkinleştirme işlemi SDK sürümüne bağlıdır.

Sürüm 3. X

Sürüm 3. x standart ASP.NET Core API'lerini kullanır. UseEnvironment örnekte yöntemini çağırınHostBuilder. Bu örnekte olduğu gibi adlı developmentbir dize geçirin:

static async Task Main()
{
    var builder = new HostBuilder();
    builder.UseEnvironment("development");
    builder.ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices();
            });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Sürüm 2. X

sınıfının JobHostConfiguration geliştirme modunu etkinleştiren bir UseDevelopmentSettings yöntemi vardır. Aşağıdaki örnekte geliştirme ayarlarının nasıl kullanılacağı gösterilmektedir. Yerel olarak çalıştırıldığında döndürmek config.IsDevelopmenttrue için değeriyle Developmentadlı AzureWebJobsEnv bir yerel ortam değişkeni ayarlayın.

static void Main()
{
    config = new JobHostConfiguration();

    if (config.IsDevelopment)
    {
        config.UseDevelopmentSettings();
    }

    var host = new JobHost(config);
    host.RunAndBlock();
}

Eşzamanlı bağlantıları yönetme (sürüm 2.x)

Sürüm 3'te. x, bağlantı sınırı varsayılan olarak sonsuz bağlantılara ayarlanır. Herhangi bir nedenle bu sınırı değiştirmeniz gerekiyorsa sınıfının özelliğini WinHttpHandler kullanabilirsinizMaxConnectionsPerServer.

Sürüm 2'de. x, ServicePointManager.DefaultConnectionLimit API'sini kullanarak konakla eş zamanlı bağlantı sayısını denetlersiniz. 2'de. x, Webjobs konağınızı başlatmadan önce bu değeri varsayılan değer olan 2'den artırmanız gerekir.

aracılığıyla ServicePointManagerakış kullanarak HttpClient bir işlevden yaptığınız tüm giden HTTP istekleri. içinde DefaultConnectionLimitServicePointManager ayarlanan değere ulaştıktan sonra, istekleri göndermeden önce kuyruğa alır. kodunuzun DefaultConnectionLimit 2 olarak ayarlandığını ve kodunuzun 1.000 HTTP isteği yaptığını varsayalım. Başlangıçta, işletim sistemine yalnızca iki isteğe izin verilir. Diğer 998,onlar için yer olana kadar kuyruğa alındı. Bu, isteği yapmış gibi göründüğü halde istek hiçbir zaman işletim sistemi tarafından hedef sunucuya gönderilmediğinden zaman aşımına uğradınız HttpClient anlamına gelir. Bu nedenle, mantıklı olmayan bir davranış görebilirsiniz: Yerel HttpClient ortamınızın bir isteği tamamlaması 10 saniye sürüyor, ancak hizmetiniz her isteği 200 ms'de döndürecek.

ASP.NET uygulamalar için varsayılan değerdir Int32.MaxValueve bu, Temel veya daha yüksek bir App Service Planında çalışan Web İşleri için iyi sonuç verir. Web İşleri genellikle AlwaysOn ayarına ihtiyaç duyar ve bu ayar yalnızca Temel ve daha yüksek App Service Planları tarafından desteklenir.

Web İşleriniz Ücretsiz veya Paylaşılan App Service Planında çalışıyorsa, uygulamanız şu anda bağlantı sınırı 300 olan App Service korumalı alanıyla kısıtlanır. içinde ServicePointManagerilişkisiz bağlantı sınırı olduğunda, korumalı alan bağlantı eşiğine ulaşılması ve sitenin kapatılması daha olasıdır. Bu durumda, 50 veya 100 gibi daha düşük bir değerin ayarlanması DefaultConnectionLimit bunun gerçekleşmesini engelleyebilir ve yine de yeterli aktarım hızına izin verebilir.

Herhangi bir HTTP isteği yapılmadan önce ayarın yapılandırılması gerekir. Bu nedenle, Web İşleri ana bilgisayarı ayarı otomatik olarak ayarlamamalıdır. Konak başlatılmadan önce gerçekleşen VE beklenmeyen davranışlara yol açabilecek HTTP istekleri olabilir. En iyi yaklaşım, burada gösterildiği gibi başlatmadan önce JobHostdeğerini yönteminizde Main hemen ayarlamaktır:

static void Main(string[] args)
{
    // Set this immediately so that it's used by all requests.
    ServicePointManager.DefaultConnectionLimit = Int32.MaxValue;

    var host = new JobHost();
    host.RunAndBlock();
}

Tetikleyiciler

Web İşleri SDK'sı, Azure İşlevleri tarafından kullanılan aynı tetikleyici ve bağlama kümesini destekler. Web İşleri SDK'sında tetikleyicilerin işleve özgü olduğunu ve Web İşi dağıtım türüyle ilgili olmadığını lütfen unutmayın. SDK kullanılarak oluşturulan olayla tetiklenen işlevlere sahip Web İşleri her zaman Sürekli açık olarak sürekli bir Web İşi olarak yayımlanmalıdır.

İşlevler ortak yöntemler olmalı ve bir tetikleyici özniteliğine veya özniteliğine NoAutomaticTrigger sahip olmalıdır.

Otomatik tetikleyiciler

Otomatik tetikleyiciler bir olaya yanıt olarak bir işlevi çağırır. Azure Kuyruk depolama alanına eklenen bir ileti tarafından tetiklenen işlev örneğini düşünün. İşlev, Azure Blob depolamadan bir blob okuyarak yanıt verir:

public static void Run(
    [QueueTrigger("myqueue-items")] string myQueueItem,
    [Blob("samples-workitems/{queueTrigger}", FileAccess.Read)] Stream myBlob,
    ILogger log)
{
    log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}

özniteliği çalışma QueueTrigger zamanına içinde bir kuyruk iletisi görüntülendiğinde myqueue-itemsişlevi çağırmasını söyler. Blob özniteliği, çalışma zamanına sample-workitems kapsayıcısında bir blobu okumak için kuyruk iletisini kullanmasını söyler. Kapsayıcıdaki samples-workitems blob öğesinin adı doğrudan kuyruk tetikleyicisinden bağlama ifadesi ({queueTrigger}) olarak alınır.

Not

Bir web uygulaması 20 dakika etkinlik dışı kaldıktan sonra zaman aşımına neden olabilir ve yalnızca gerçek web uygulamasına yapılan istekler zamanlayıcıyı sıfırlayabilir. Uygulamanın yapılandırmasını Azure portal görüntülemek veya gelişmiş araçlar sitesine (https://<app_name>.scm.azurewebsites.net) istek göndermek zamanlayıcıyı sıfırlamaz. İşinizi barındıran web uygulamasını sürekli çalışacak, bir zamanlamaya göre çalışacak veya olay temelli tetikleyiciler kullanacak şekilde ayarladıysanız, web uygulamanızın Azure Yapılandırması sayfasında Alwayson ayarını etkinleştirin. Her zaman açık ayarı, bu tür Web İşleri'nin güvenilir bir şekilde çalıştığından emin olmak için yardımcı olur. Bu özellik yalnızca Temel, Standart ve Premium fiyatlandırma katmanlarında kullanılabilir.

El ile tetikleyiciler

Bir işlevi el ile tetikleme için özniteliğini NoAutomaticTrigger burada gösterildiği gibi kullanın:

[NoAutomaticTrigger]
public static void CreateQueueMessage(
ILogger logger,
string value,
[Queue("outputqueue")] out string message)
{
    message = value;
    logger.LogInformation("Creating queue message: ", message);
}

İşlevi el ile tetikleme işlemi SDK sürümüne bağlıdır.

Sürüm 3. X

static async Task Main(string[] args)
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddAzureStorage();
    });
    var host = builder.Build();
    using (host)
    {
        var jobHost = host.Services.GetService(typeof(IJobHost)) as JobHost;
        var inputs = new Dictionary<string, object>
        {
            { "value", "Hello world!" }
        };

        await host.StartAsync();
        await jobHost.CallAsync("CreateQueueMessage", inputs);
        await host.StopAsync();
    }
}

Sürüm 2. X

static void Main(string[] args)
{
    JobHost host = new JobHost();
    host.Call(typeof(Program).GetMethod("CreateQueueMessage"), new { value = "Hello world!" });
}

Giriş ve çıkış bağlamaları

Giriş bağlamaları, Azure'dan veya üçüncü taraf hizmetlerden gelen verileri kodunuz için kullanılabilir hale getirmek için bildirim temelli bir yol sağlar. Çıkış bağlamaları verileri güncelleştirmek için bir yol sağlar. Başlarken makalesinde her birinin bir örneği gösterilir.

Özniteliğini yöntem dönüş değerine uygulayarak çıkış bağlaması için yöntem dönüş değeri kullanabilirsiniz. Azure İşlevi dönüş değerini kullanma bölümündeki örne bakın.

Bağlama türleri

Bağlama türlerini yükleme ve yönetme işlemi, sürüm 3 kullanıp kullanmadığınıza bağlıdır. x veya sürüm 2. SDK'nın x . Belirli bir bağlama türü için yüklenecek paketi, bu bağlama türünün Azure İşlevleri başvuru makalesinin "Paketler" bölümünde bulabilirsiniz. Azure İşlevleri tarafından desteklenmeyen Dosyalar tetikleyicisi ve bağlaması (yerel dosya sistemi için) bir özel durumdur.

Sürüm 3. X

Sürüm 3'te. x, depolama bağlamaları pakete Microsoft.Azure.WebJobs.Extensions.Storage dahil edilir. AddAzureStorage Burada gösterildiği gibi yönteminde ConfigureWebJobs uzantı yöntemini çağırın:

static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices();
                b.AddAzureStorage();
            });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Diğer tetikleyici ve bağlama türlerini kullanmak için, bunları içeren NuGet paketini yükleyin ve uzantıda uygulanan uzantı yöntemini çağırın Add<binding> . Örneğin, bir Azure Cosmos DB bağlaması kullanmak istiyorsanız aşağıdaki gibi öğesini yükleyin Microsoft.Azure.WebJobs.Extensions.CosmosDB ve çağırabilirsiniz AddCosmosDB:

static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices();
                b.AddCosmosDB();
            });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Temel hizmetlerin bir parçası olan Zamanlayıcı tetikleyicisini veya Dosyalar bağlamasını kullanmak için veya AddFiles uzantı yöntemlerini çağırınAddTimers.

Sürüm 2. X

Bu tetikleyici ve bağlama türleri sürüm 2'ye dahil edilir. paketin x değeri Microsoft.Azure.WebJobs :

  • Blob depolama
  • Kuyruk depolama
  • Tablo depolama

Diğer tetikleyici ve bağlama türlerini kullanmak için, bunları içeren NuGet paketini yükleyin ve nesnesine bir Use<binding> yöntem çağırın JobHostConfiguration . Örneğin, zamanlayıcı tetikleyicisi kullanmak istiyorsanız, burada gösterildiği gibi yöntemini yükleyin Microsoft.Azure.WebJobs.Extensions ve çağırın UseTimersMain :

static void Main()
{
    config = new JobHostConfiguration();
    config.UseTimers();
    var host = new JobHost(config);
    host.RunAndBlock();
}

Dosyalar bağlamasını kullanmak için yükleyin Microsoft.Azure.WebJobs.Extensions ve öğesini çağırın UseFiles.

Executioncontext

Web İşleri, bir ExecutionContextöğesine bağlamanıza olanak tanır. Bu bağlama ile işlevinizin imzasında parametresi olarak öğesine erişebilirsiniz ExecutionContext . Örneğin, aşağıdaki kod, çağrı kimliğine erişmek için bağlam nesnesini kullanır ve bunu belirli bir işlev çağrısı tarafından oluşturulan tüm günlükleri ilişkilendirmek için kullanabilirsiniz.

public class Functions
{
    public static void ProcessQueueMessage([QueueTrigger("queue")] string message,
        ExecutionContext executionContext,
        ILogger logger)
    {
        logger.LogInformation($"{message}\n{executionContext.InvocationId}");
    }
}

bağlama ExecutionContext işlemi SDK sürümünüze bağlıdır.

Sürüm 3. X

AddExecutionContextBinding Burada gösterildiği gibi yönteminde ConfigureWebJobs uzantı yöntemini çağırın:

static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices();
                b.AddExecutionContextBinding();
            });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Sürüm 2. X

Daha Microsoft.Azure.WebJobs.Extensions önce bahsedilen paket, yöntemini çağırarak UseCore kaydedebileceğiniz özel bir bağlama türü de sağlar. Bu bağlama, işlev imzanızda aşağıdaki gibi etkinleştirilmiş bir ExecutionContext parametre tanımlamanızı sağlar:

class Program
{
    static void Main()
    {
        config = new JobHostConfiguration();
        config.UseCore();
        var host = new JobHost(config);
        host.RunAndBlock();
    }
}

Bağlama yapılandırması

Bazı tetikleyicilerin ve bağlamaların davranışını yapılandırabilirsiniz. Bunları yapılandırma işlemi SDK sürümüne bağlıdır.

  • Sürüm 3. x: yöntemi içinde ConfigureWebJobsçağrıldığında yapılandırmayı Add<Binding> ayarlayın.
  • Sürüm 2. x: öğesine geçirdiğiniz bir yapılandırma nesnesindeki özellikleri ayarlayarak yapılandırmayı JobHostayarlayın.

Bağlamaya özgü bu ayarlar, Azure İşlevleri'daki host.json proje dosyasındaki ayarlarla eşdeğerdir.

Aşağıdaki bağlamaları yapılandırabilirsiniz:

Azure Cosmos DB tetikleyici yapılandırması (sürüm 3).x)

Bu örnekte Azure Cosmos DB tetikleyicisinin nasıl yapılandırılır gösterilmektedir:

static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddCosmosDB(a =>
        {
            a.ConnectionMode = ConnectionMode.Gateway;
            a.Protocol = Protocol.Https;
            a.LeaseOptions.LeasePrefix = "prefix1";

        });
    });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Daha fazla bilgi için Azure Cosmos DB bağlama makalesine bakın.

Event Hubs tetikleyici yapılandırması (sürüm 3.x)

Bu örnekte Event Hubs tetikleyicisinin nasıl yapılandırılır gösterilmektedir:

static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddEventHubs(a =>
        {
            a.BatchCheckpointFrequency = 5;
            a.EventProcessorOptions.MaxBatchSize = 256;
            a.EventProcessorOptions.PrefetchCount = 512;
        });
    });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Daha fazla bilgi için Event Hubs bağlama makalesine bakın.

Kuyruk depolama tetikleyici yapılandırması

Aşağıdaki örneklerde Kuyruk depolama tetikleyicisinin nasıl yapılandırılır gösterilmektedir.

Sürüm 3. X

static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddAzureStorage(a => {
            a.BatchSize = 8;
            a.NewBatchThreshold = 4;
            a.MaxDequeueCount = 4;
            a.MaxPollingInterval = TimeSpan.FromSeconds(15);
        });
    });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Daha fazla bilgi için Kuyruk depolama bağlama makalesine bakın.

Sürüm 2. X

static void Main(string[] args)
{
    JobHostConfiguration config = new JobHostConfiguration();
    config.Queues.BatchSize = 8;
    config.Queues.NewBatchThreshold = 4;
    config.Queues.MaxDequeueCount = 4;
    config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(15);
    JobHost host = new JobHost(config);
    host.RunAndBlock();
}

Daha fazla bilgi için host.json v1.x başvurusuna bakın.

SendGrid bağlama yapılandırması (sürüm 3.x)

Bu örnekte SendGrid çıkış bağlamasının nasıl yapılandırılır gösterilmektedir:

static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddSendGrid(a =>
        {
            a.FromAddress.Email = "samples@functions.com";
            a.FromAddress.Name = "Azure Functions";
        });
    });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Daha fazla bilgi için SendGrid bağlama makalesine bakın.

Service Bus tetikleyici yapılandırması (sürüm 3.x)

Bu örnekte Service Bus tetikleyicisinin nasıl yapılandırılır gösterilmektedir:

static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddServiceBus(sbOptions =>
        {
            sbOptions.MessageHandlerOptions.AutoComplete = true;
            sbOptions.MessageHandlerOptions.MaxConcurrentCalls = 16;
        });
    });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Diğer ayrıntılar için Service Bus bağlama makalesine bakın.

Diğer bağlamalar için yapılandırma

Bazı tetikleyici ve bağlama türleri kendi özel yapılandırma türlerini tanımlar. Örneğin, Dosya tetikleyicisi, aşağıdaki örneklerde olduğu gibi izlenecek kök yolu belirtmenize olanak tanır.

Sürüm 3. X

static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddFiles(a => a.RootPath = @"c:\data\import");
    });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Sürüm 2. X

static void Main()
{
    config = new JobHostConfiguration();
    var filesConfig = new FilesConfiguration
    {
        RootPath = @"c:\data\import"
    };
    config.UseFiles(filesConfig);
    var host = new JobHost(config);
    host.RunAndBlock();
}

Bağlama ifadeleri

Öznitelik oluşturucu parametrelerinde, çeşitli kaynaklardan gelen değerleri çözümleyen ifadeler kullanabilirsiniz. Örneğin, aşağıdaki kodda özniteliğinin BlobTrigger yolu adlı filenamebir ifade oluşturur. Çıkış bağlaması için kullanıldığında, filename tetikleyen blobun adına çözümler.

public static void CreateThumbnail(
    [BlobTrigger("sample-images/{filename}")] Stream image,
    [Blob("sample-images-sm/{filename}", FileAccess.Write)] Stream imageSmall,
    string filename,
    ILogger logger)
{
    logger.Info($"Blob trigger processing: {filename}");
    // ...
}

İfadeleri bağlama hakkında daha fazla bilgi için Azure İşlevleri belgelerindeki Bağlama ifadeleri ve desenleri bölümüne bakın.

Özel bağlama ifadeleri

Bazen kodda sabit kodlama yerine kuyruk adı, blob adı veya kapsayıcı ya da tablo adı belirtmek isteyebilirsiniz. Örneğin, yapılandırma dosyasında veya ortam değişkeninde özniteliğin QueueTrigger kuyruk adını belirtmek isteyebilirsiniz.

Yapılandırma sırasında özel bir ad çözümleyici geçirerek bunu yapabilirsiniz. Tetikleyici veya bağlama özniteliği oluşturucu parametrelerine yer tutucular eklersiniz ve çözümleyici kodunuz bu yer tutucuların yerine kullanılacak gerçek değerleri sağlar. Yer tutucuları, burada gösterildiği gibi yüzde (%) işaretleri ile çevreleyerek tanımlarsınız:

public static void WriteLog([QueueTrigger("%logqueue%")] string logMessage)
{
    Console.WriteLine(logMessage);
}

Bu kod, test ortamında adlı logqueuetest ve üretim ortamında adlı logqueueprod bir kuyruk kullanmanıza olanak tanır. Sabit kodlanmış kuyruk adı yerine koleksiyondaki appSettings bir girdinin adını belirtirsiniz.

Özel bir çözümleyici sağlamazsanız geçerli olacak varsayılan bir çözümleyici vardır. Varsayılan değer, uygulama ayarlarından veya ortam değişkenlerinden değerleri alır.

.NET Core 3.1'den başlayarak, ConfigurationManager kullandığınız System.Configuration.ConfigurationManager NuGet paketini gerektirir. Örnek için aşağıdaki using deyim gerekir:

using System.Configuration;

Sınıfınız NameResolver , burada gösterildiği gibi uygulama ayarlarından kuyruk adını alır:

public class CustomNameResolver : INameResolver
{
    public string Resolve(string name)
    {
        return ConfigurationManager.AppSettings[name].ToString();
    }
}

Sürüm 3. X

Bağımlılık ekleme kullanarak çözümleyiciyi yapılandırabilirsiniz. Bu örnekler aşağıdaki using deyimi gerektirir:

using Microsoft.Extensions.DependencyInjection;

Çözümleyiciyi, bu örnekte olduğu gibi üzerinde HostBuilderuzantı yöntemini çağırarak ConfigureServices eklersiniz:

static async Task Main(string[] args)
{
    var builder = new HostBuilder();
    var resolver = new CustomNameResolver();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
    });
    builder.ConfigureServices(s => s.AddSingleton<INameResolver>(resolver));
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Sürüm 2. X

Sınıfınızı NameResolver burada gösterildiği gibi nesnesine JobHost geçirin:

 static void Main(string[] args)
{
    JobHostConfiguration config = new JobHostConfiguration();
    config.NameResolver = new CustomNameResolver();
    JobHost host = new JobHost(config);
    host.RunAndBlock();
}

Azure İşlevleri, örnekte gösterildiği gibi uygulama ayarlarından değerleri almak için uygularINameResolver. Web İşleri SDK'sını doğrudan kullandığınızda, tercih ettiğiniz kaynaktan yer tutucu değiştirme değerlerini alan özel bir uygulama yazabilirsiniz.

Çalışma zamanında bağlama

, Blobveya Tablegibi Queuebir bağlama özniteliğini kullanmadan önce işlevinizde bazı çalışmalar yapmanız gerekiyorsa arabirimini IBinder kullanabilirsiniz.

Aşağıdaki örnek bir giriş kuyruğu iletisi alır ve çıkış kuyruğunda aynı içeriğe sahip yeni bir ileti oluşturur. Çıkış kuyruğu adı işlevin gövdesindeki koda göre ayarlanır.

public static void CreateQueueMessage(
    [QueueTrigger("inputqueue")] string queueMessage,
    IBinder binder)
{
    string outputQueueName = "outputqueue" + DateTime.Now.Month.ToString();
    QueueAttribute queueAttribute = new QueueAttribute(outputQueueName);
    CloudQueue outputQueue = binder.Bind<CloudQueue>(queueAttribute);
    outputQueue.AddMessageAsync(new CloudQueueMessage(queueMessage));
}

Daha fazla bilgi için Azure İşlevleri belgelerindeki Çalışma zamanında bağlama bölümüne bakın.

Bağlama başvuru bilgileri

Azure İşlevleri belgelerinde her bağlama türü hakkında başvuru bilgileri sağlanır. Her bağlama başvurusu makalesinde aşağıdaki bilgileri bulabilirsiniz. (Bu örnek Depolama kuyruğuna dayanır.)

  • Paketler. Web İşleri SDK projesinde bağlama desteğini dahil etmek için yüklemeniz gereken paket.
  • Örnekler. Kod örnekleri. C# sınıf kitaplığı örneği Web İşleri SDK'sı için geçerlidir. Özniteliğini atla FunctionName .
  • Öznitelikler. Bağlama türü için kullanılacak öznitelikler.
  • Yapılandırma. Öznitelik özelliklerinin ve oluşturucu parametrelerinin açıklamaları.
  • Kullanım. Bağlanabileceğiniz türler ve bağlamanın nasıl çalıştığı hakkında bilgi. Örneğin: yoklama algoritması, zehir kuyruğu işleme.

Not

HTTP, Web Kancaları ve Event Grid bağlamaları yalnızca Azure İşlevleri tarafından desteklenir, Web İşleri SDK'sı tarafından desteklenmez.

Azure İşlevleri çalışma zamanında desteklenen bağlamaların tam listesi için bkz. Desteklenen bağlamalar.

Disable, Timeout ve Singleton öznitelikleri

Bu özniteliklerle işlev tetiklemesini denetleyebilir, işlevleri iptal edebilir ve bir işlevin yalnızca bir örneğinin çalıştığından emin olabilirsiniz.

Özniteliği devre dışı bırakma

özniteliği, bir işlevin Disable tetiklenip tetiklenemeyeceğini denetlemenize olanak tanır.

Aşağıdaki örnekte, uygulama ayarı Disable_TestJob veya True değerine 1 sahipse (büyük/küçük harfe duyarsız), işlev çalışmaz. Bu durumda, çalışma zamanı 'Functions.TestJob' işlevi devre dışı bırakılmış bir günlük iletisi oluşturur.

[Disable("Disable_TestJob")]
public static void TestJob([QueueTrigger("testqueue2")] string message)
{
    Console.WriteLine("Function with Disable attribute executed!");
}

Azure portal uygulama ayarı değerlerini değiştirdiğinizde, Web İşi yeni ayarı almak için yeniden başlatılır.

Özniteliği parametre, yöntem veya sınıf düzeyinde bildirilebilir. Ayar adı bağlama ifadeleri de içerebilir.

Zaman aşımı özniteliği

özniteliği, Timeout belirtilen süre içinde bitmeyen bir işlevin iptal edilmesine neden olur. Aşağıdaki örnekte işlev, Timeout özniteliği olmadan bir gün boyunca çalıştırılır. Zaman aşımı işlevin 15 saniye sonra iptal edilmesine neden olur. Timeout özniteliğinin "throwOnError" parametresi "true" olarak ayarlandığında, zaman aşımı aralığı aşıldığında web işleri SDK'sı tarafından bir özel durum oluşturarak işlev çağrısı sonlandırılır. Varsayılan "throwOnError" değeri "false" şeklindedir. Zaman Aşımı özniteliği kullanıldığında varsayılan davranış, işlev kodu dönene veya özel durum oluşturana kadar çağırmanın süresiz olarak çalışmasına izin verirken iptal belirtecini ayarlayarak işlev çağrısını iptal etmektir.

[Timeout("00:00:15")]
public static async Task TimeoutJob(
    [QueueTrigger("testqueue2")] string message,
    CancellationToken token,
    TextWriter log)
{
    await log.WriteLineAsync("Job starting");
    await Task.Delay(TimeSpan.FromDays(1), token);
    await log.WriteLineAsync("Job completed");
}

Zaman Aşımı özniteliğini sınıf veya yöntem düzeyinde uygulayabilir ve kullanarak JobHostConfiguration.FunctionTimeoutgenel bir zaman aşımı belirtebilirsiniz. Sınıf düzeyi veya yöntem düzeyi zaman aşımları genel zaman aşımlarını geçersiz kılar.

Singleton özniteliği

Singleton özniteliği, konak web uygulamasının birden çok örneği olsa bile bir işlevin yalnızca bir örneğinin çalışmasını sağlar. Singleton özniteliği, bir örneğin çalıştığından emin olmak için dağıtılmış kilitlemeyi kullanır.

Bu örnekte, herhangi bir zamanda işlevin ProcessImage yalnızca tek bir örneği çalıştırılır:

[Singleton]
public static async Task ProcessImage([BlobTrigger("images")] Stream image)
{
     // Process the image.
}

SingletonMode.Listener

Bazı tetikleyiciler eşzamanlılık yönetimi için yerleşik desteğe sahiptir:

  • QueueTrigger. JobHostConfiguration.Queues.BatchSize seçeneğini 1 olarak ayarlayın.
  • ServiceBusTrigger. ServiceBusConfiguration.MessageOptions.MaxConcurrentCalls seçeneğini 1 olarak ayarlayın.
  • FileTrigger. FileProcessor.MaxDegreeOfParallelism seçeneğini 1 olarak ayarlayın.

İşlevinizin tek bir örnekte tekil olarak çalıştığından emin olmak için bu ayarları kullanabilirsiniz. Web uygulamasının ölçeği birden çok örneğe genişletildiğinde işlevin yalnızca tek bir örneğinin çalıştığından emin olmak için, işleve ([Singleton(Mode = SingletonMode.Listener)] dinleyici düzeyinde bir tekil kilit uygulayın. JobHost başlatıldığında dinleyici kilitleri alınır. Ölçeklendirilen üç örneğin tümü aynı anda başlarsa, örneklerin yalnızca biri kilidi alır ve yalnızca bir dinleyici başlatılır.

Not

SingletonMode.Function'ın nasıl çalıştığı hakkında daha fazla bilgi edinmek için bu GitHub Deposu'na bakın.

Kapsam değerleri

Tekil bir kapsam ifadesi/değeri belirtebilirsiniz. İfade/değer, işlevin belirli bir kapsamdaki tüm yürütmelerinin seri hale getirilmesini sağlar. Bu şekilde daha ayrıntılı kilitleme uygulamak, gereksinimlerinize göre dikte edilen diğer çağrıları seri hale getirirken işleviniz için bir miktar paralellik düzeyine olanak tanıyabilir. Örneğin, aşağıdaki kodda kapsam ifadesi gelen iletinin Region değerine bağlanır. Kuyruk Doğu, Doğu ve Batı bölgelerinde üç ileti içerdiğinde, Doğu bölgesine sahip iletiler seri olarak çalıştırılır. Batı bölgesine sahip ileti, Doğu bölgesindekilerle paralel olarak çalıştırılır.

[Singleton("{Region}")]
public static async Task ProcessWorkItem([QueueTrigger("workitems")] WorkItem workItem)
{
     // Process the work item.
}

public class WorkItem
{
     public int ID { get; set; }
     public string Region { get; set; }
     public int Category { get; set; }
     public string Description { get; set; }
}

SingletonScope.Host

Bir kilidin varsayılan kapsamı , SingletonScope.Functionkilit kapsamının (blob kira yolu) tam işlev adına bağlı olduğu anlamına gelir. İşlevler arasında kilitlemek için, aynı anda çalıştırmak istemediğiniz tüm işlevlerde aynı olan bir kapsam kimliği adı belirtin SingletonScope.Host ve kullanın. Aşağıdaki örnekte, bir kerede yalnızca bir veya AddItemRemoveItem örneği çalıştırılır:

[Singleton("ItemsLock", SingletonScope.Host)]
public static void AddItem([QueueTrigger("add-item")] string message)
{
     // Perform the add operation.
}

[Singleton("ItemsLock", SingletonScope.Host)]
public static void RemoveItem([QueueTrigger("remove-item")] string message)
{
     // Perform the remove operation.
}

Kira bloblarını görüntüleme

Web İşleri SDK'sı, dağıtılmış kilitleme uygulamak için kapaklar altındaki Azure blob kiralamalarını kullanır. Singleton tarafından kullanılan kira blobları depolama hesabındaki azure-webjobs-host kapsayıcıda AzureWebJobsStorage "kilitler" yolunun altında bulunabilir. Örneğin, daha önce gösterilen ilk ProcessImage örneğin kira blobu yolu olabilir locks/061851c758f04938a4426aa9ab3869c0/WebJobs.Functions.ProcessImage. Tüm yollar JobHost Kimliğini içerir, bu durumda 061851c758f04938a4426aa9ab3869c0.

Zaman uyumsuz işlevler

Zaman uyumsuz işlevleri kodla hakkında bilgi için Azure İşlevleri belgelerine bakın.

İptal belirteçleri

İptal belirteçlerini işleme hakkında bilgi için iptal belirteçleri ve düzgün kapatma ile ilgili Azure İşlevleri belgelerine bakın.

Birden çok örnek

Web uygulamanız birden çok örnekte çalışıyorsa, tetikleyicileri ve çağrı işlevlerini dinleyen her örnek üzerinde sürekli bir Web İşi çalışır. Çeşitli tetikleyici bağlamaları, örneklerin ölçeğini daha fazla örneğe genişletmenin daha fazla yükü işlemenize olanak sağlaması için çalışmaları işbirliğine dayalı olarak verimli bir şekilde paylaşacak şekilde tasarlanmıştır.

Bazı tetikleyiciler çift işlemeye neden olabilir ancak kuyruk ve blob depolama tetikleyicileri otomatik olarak bir işlevin bir kuyruk iletisini veya blobunu birden çok kez işlemesini engeller. Daha fazla bilgi için Azure İşlevleri belgelerindeki Aynı giriş için tasarlama bölümüne bakın.

Zamanlayıcı tetikleyicisi otomatik olarak zamanlayıcının yalnızca bir örneğinin çalışmasını sağlar, böylece belirli bir zamanlanmış zamanda çalışan birden fazla işlev örneği elde etmezsiniz.

Konak web uygulamasının birden çok örneği olsa bile bir işlevin yalnızca bir örneğinin çalıştığından emin olmak istiyorsanız özniteliğini Singleton kullanabilirsiniz.

Filtreler

İşlev Filtreleri (önizleme), Web İşleri yürütme işlem hattını kendi mantığınızla özelleştirmek için bir yol sağlar. Filtreler, ASP.NET Core filtrelere benzer. Bunları, işlevlerinize veya sınıflarınıza uygulanan bildirim temelli öznitelikler olarak uygulayabilirsiniz. Daha fazla bilgi için bkz . İşlev Filtreleri.

Günlüğe kaydetme ve izleme

ASP.NET için geliştirilen günlüğe kaydetme çerçevesini öneririz. Kullanmaya başlama makalesinde nasıl kullanılacağı gösterilmektedir.

Günlük filtreleme

Bir ILogger örnek tarafından oluşturulan her günlüğün ilişkili Category ve Levelvardır. LogLevel bir sabit listesidir ve tamsayı kodu göreli önem derecesini gösterir:

LogLevel Kod
İzleme 0
Hata Ayıklama 1
Bilgi 2
Uyarı 3
Hata 4
Kritik 5
Hiçbiri 6

Her kategoriyi belirli LogLevelbir öğesine göre bağımsız olarak filtreleyebilirsiniz. Örneğin, blob tetikleyicisi işleme için tüm günlükleri, diğer her şey için yalnızca Error ve daha yüksek bir değer görmek isteyebilirsiniz.

Sürüm 3. X

Sürüm 3. SDK'nın x'i .NET Core'da yerleşik olarak bulunan filtrelemeye dayanır. LogCategories sınıfı belirli işlevler, tetikleyiciler veya kullanıcılar için kategoriler tanımlamanızı sağlar. Ayrıca ve Resultsgibi Startup belirli konak durumlarının filtrelerini tanımlar. Bu, günlük çıkışında ince ayar yapmanızı sağlar. Tanımlanan kategorilerde eşleşme bulunmazsa, filtre, iletiye Default filtre uygulama kararını verirken değere geri döner.

LogCategories aşağıdaki using deyimini gerektirir:

using Microsoft.Azure.WebJobs.Logging; 

Aşağıdaki örnek, varsayılan olarak düzeyindeki tüm günlükleri Warning filtreleyen bir filtre oluşturur. Function ve results kategorileri (sürüm 2 ile eşdeğerdirHost.Results).x) düzeyinde filtrelenirError. Filtre, geçerli kategoriyi örnekteki LogCategories tüm kayıtlı düzeylerle karşılaştırır ve en uzun eşleşmeyi seçer. Bu, düzeyin Debug veya eşleşmeleri Host.Triggers.QueueHost.Triggers.Blobiçin Host.Triggers kaydedildiğini gösterir. Bu sayede her birini eklemenize gerek kalmadan daha geniş kategorileri denetleyebilirsiniz.

static async Task Main(string[] args)
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
    });
    builder.ConfigureLogging(logging =>
            {
                logging.SetMinimumLevel(LogLevel.Warning);
                logging.AddFilter("Function", LogLevel.Error);
                logging.AddFilter(LogCategories.CreateFunctionCategory("MySpecificFunctionName"),
                    LogLevel.Debug);
                logging.AddFilter(LogCategories.Results, LogLevel.Error);
                logging.AddFilter("Host.Triggers", LogLevel.Debug);
            });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

Sürüm 2. X

Sürüm 2'de. x sdk'sı, filtrelemeyi denetlemek için sınıfını LogCategoryFilter kullanırsınız. , LogCategoryFilter veya düzeylerindeki ErrorInformationWarningtüm iletilerin günlüğe kaydedildiği, ancak veya TraceCritical düzeylerindeki tüm iletilerin Debug filtrelendiği anlamına gelen ilk değerine Informationsahip bir özelliğine sahiptir.Default

LogCategories Sürüm 3'te olduğu gibi.x özelliğiCategoryLevels, günlük çıkışında ince ayar yapabilmeniz için belirli kategoriler için günlük düzeylerini belirtmenize olanak tanır. Sözlükte CategoryLevels eşleşme bulunmazsa, filtre, iletiyi filtreleyip filtrelememeye karar verirken değere geri döner Default .

Aşağıdaki örnek, varsayılan olarak düzeyindeki tüm günlükleri Warning filtreleyen bir filtre oluşturur. Function ve Host.Results kategorileri düzeyinde filtrelenirError. geçerli LogCategoryFilter kategoriyi tüm kayıtlı CategoryLevels kategorilerle karşılaştırır ve en uzun eşleşmeyi seçer. Debug Bu nedenle için Host.Triggers kaydedilen düzey veya Host.Triggers.Blobile eşleşecektirHost.Triggers.Queue. Bu sayede her birini eklemenize gerek kalmadan daha geniş kategorileri denetleyebilirsiniz.

var filter = new LogCategoryFilter();
filter.DefaultLevel = LogLevel.Warning;
filter.CategoryLevels[LogCategories.Function] = LogLevel.Error;
filter.CategoryLevels[LogCategories.Results] = LogLevel.Error;
filter.CategoryLevels["Host.Triggers"] = LogLevel.Debug;

config.LoggerFactory = new LoggerFactory()
    .AddApplicationInsights(instrumentationKey, filter.Filter)
    .AddConsole(filter.Filter);

Application Insights için özel telemetri

Application Insights için özel telemetri uygulama işlemi SDK sürümüne bağlıdır. Application Insights'ı yapılandırmayı öğrenmek için bkz. Application Insights günlüğü ekleme.

Sürüm 3. X

Çünkü sürüm 3. Web İşleri SDK'sının x'i .NET Core genel konağına dayanır, artık özel bir telemetri fabrikası sağlanmadı. Ancak, bağımlılık ekleme kullanarak işlem hattına özel telemetri ekleyebilirsiniz. Bu bölümdeki örnekler aşağıdaki using deyimleri gerektirir:

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.Channel;

Aşağıdaki özel uygulaması, ITelemetryInitializer varsayılan TelemetryConfigurationöğesine kendi ITelemetry uygulamanızı eklemenize olanak tanır.

internal class CustomTelemetryInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        // Do something with telemetry.
    }
}

Özel ITelemetryInitializer öğenizi işlem hattına eklemek için oluşturucuyu çağırınConfigureServices.

static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
    });
    builder.ConfigureLogging((context, b) =>
    {
        // Add logging providers.
        b.AddConsole();

        // If this key exists in any config, use it to enable Application Insights.
        string appInsightsKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
        if (!string.IsNullOrEmpty(appInsightsKey))
        {
            // This uses the options callback to explicitly set the instrumentation key.
            b.AddApplicationInsights(o => o.InstrumentationKey = appInsightsKey);
        }
    });
    builder.ConfigureServices(services =>
        {
            services.AddSingleton<ITelemetryInitializer, CustomTelemetryInitializer>();
        });
    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

TelemetryConfiguration oluşturulduğunda, tüm kayıtlı türleri ITelemetryInitializer dahil edilir. Daha fazla bilgi edinmek için bkz. Özel olaylar ve ölçümler için Application Insights API'si.

Sürüm 3'te. x, artık ana bilgisayar durduğunda öğesini TelemetryClient boşaltmanız gerekmez. .NET Core bağımlılık ekleme sistemi, kayıtlı ApplicationInsightsLoggerProvideröğesini otomatik olarak atarak boşaltır TelemetryClient.

Sürüm 2. X

Sürüm 2'de. x, Web İşleri SDK'sı TelemetryClient için Application Insights sağlayıcısı tarafından dahili olarak oluşturulan kullanır ServerTelemetryChannel. Application Insights uç noktası kullanılamadığında veya gelen istekleri azalttığında, bu kanal istekleri web uygulamasının dosya sistemine kaydeder ve daha sonra yeniden gönderir.

, TelemetryClient uygulayan ITelemetryClientFactorybir sınıf tarafından oluşturulur. Varsayılan olarak, bu değeridir DefaultTelemetryClientFactory.

Application Insights işlem hattının herhangi bir bölümünü değiştirmek isterseniz, kendi ITelemetryClientFactorysağlayabilirsiniz; konak, oluşturmak TelemetryClientiçin sınıfınızı kullanır. Örneğin, bu kod özelliğini ServerTelemetryChanneldeğiştirmek için geçersiz kılarDefaultTelemetryClientFactory:

private class CustomTelemetryClientFactory : DefaultTelemetryClientFactory
{
    public CustomTelemetryClientFactory(string instrumentationKey, Func<string, LogLevel, bool> filter)
        : base(instrumentationKey, new SamplingPercentageEstimatorSettings(), filter)
    {
    }

    protected override ITelemetryChannel CreateTelemetryChannel()
    {
        ServerTelemetryChannel channel = new ServerTelemetryChannel();

        // Change the default from 30 seconds to 15 seconds.
        channel.MaxTelemetryBufferDelay = TimeSpan.FromSeconds(15);

        return channel;
    }
}

SamplingPercentageEstimatorSettings nesnesi uyarlamalı örneklemeyi yapılandırıyor. Bu, belirli yüksek hacimli senaryolarda Applications Insights'ın seçilen telemetri verilerinin bir alt kümesini sunucuya gönderdiği anlamına gelir.

Telemetri fabrikasını oluşturduktan sonra Application Insights günlük sağlayıcısına geçirirsiniz:

var clientFactory = new CustomTelemetryClientFactory(instrumentationKey, filter.Filter);

config.LoggerFactory = new LoggerFactory()
    .AddApplicationInsights(clientFactory);

Sonraki adımlar

Bu makalede, Web İşleri SDK'sı ile çalışmaya yönelik yaygın senaryoların nasıl işlendiğini gösteren kod parçacıkları sağlanmıştır. Tam örnekler için bkz. azure-webjobs-sdk-samples.