Aracılığıyla paylaş


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 Webjobs 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 değeri:

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

Azure İşlevleri, Web İşleri SDK'sı üzerinde oluşturulur.

  • Azure İşlevleri sürüm 2.x, Web İşleri SDK'sı sürüm 3'te yerleşiktir.x.
  • Azure İşlevleri sürüm 1.x, Web İşleri SDK'sı sürüm 2'de yerleşiktir.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ılması, yapabileceğiniz özelleştirme türlerini sınırlar.

Konak bağlantıları

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

Bağlantı adı tek bir tam değere çözümlendiğinde, çalışma zamanı değeri genellikle gizli dizi içeren bir bağlantı dizesi olarak tanımlar. bağlantı dizesi ayrıntıları, bağlandığınız hizmete bağlıdır. Ancak, bağlantı adı, kimlik tabanlı bağlantıları yapılandırmak için yararlı olan birden çok yapılandırma öğesi koleksiyonuna da başvurabilir. Ortam değişkenleri, çift alt çizgi __ile biten paylaşılan bir ön ek kullanılarak koleksiyon olarak ele alınabilir. Daha sonra bağlantı adı bu önek olarak ayarlanarak gruba başvurulabilir.

Örneğin, Azure Blob tetikleyici tanımının connection özelliği olabilir Storage1. adlı Storage1bir ortam değişkeni tarafından yapılandırılan tek bir dize değeri olmadığı sürece, adlı Storage1__blobServiceUri ortam değişkeni, bağlantının blobServiceUri özelliğini bilgilendirmek için kullanılabilir. Bağlantı özellikleri her hizmet için farklıdır. Bağlantıyı kullanan bileşenin belgelerine bakın.

Kimlik tabanlı bağlantılar

Web İşleri SDK'sında kimlik tabanlı bağlantıları kullanmak için projenizde Web İşleri paketlerinin en son sürümlerini kullandığınızdan emin olun. Ayrıca Microsoft.Azure.WebJobs.Host.Storage'a bir başvurunuz olduğundan da emin olmalısınız. Aşağıda, bu güncelleştirmeleri yaptıktan sonra proje dosyanızın nasıl görünebileceğine ilişkin bir örnek verilmiştir:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net48</TargetFramework>
    <IsWebJobProject>true</IsWebJobProject>
    <WebJobName>$(AssemblyName)</WebJobName>
    <WebJobType>Continuous</WebJobType>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.41" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage.Queues" Version="5.3.1" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Host.Storage" Version="5.0.1" />
    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.1.1" />
  </ItemGroup>

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

HostBuilder'ınız içinde Web İşleri ayarlarken, kimlik kullanmak için AddAzureStorageCoreServicesdiğer Depolama tetikleyicilerine ve bağlamalarına izin veren AzureWebJobsStorage şey bu olduğundan, öğesine bir çağrı eklediğinizden emin olun:

    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        // other configurations...
    });

Ardından, ortam değişkenlerini (veya App Service'te barındırıldığında Uygulama Ayarları' nı) ayarlayarak bağlantıyı yapılandırabilirsiniz AzureWebJobsStorage :

Ortam değişkeni Açıklama Örnek değer
AzureWebJobsStorage__blobServiceUri HTTPS şemasını kullanarak depolama hesabının blob hizmetinin veri düzlemi URI'si. <https:// storage_account_name.blob.core.windows.net>
AzureWebJobsStorage__queueServiceUri HTTPS şemasını kullanarak depolama hesabının kuyruk hizmetinin veri düzlemi URI'si. <https:// storage_account_name.queue.core.windows.net>

Yapılandırmanızı ortam değişkenleri dışında herhangi bir yolla (örneğin, ile appsettings.json) sağlarsanız, bunun yerine bağlantı ve özellikleri için yapılandırılmış yapılandırma sağlamanız gerekir:

{
    "AzureWebJobsStorage": {
        "blobServiceUri": "https://<storage_account_name>.blob.core.windows.net",
        "queueServiceUri": "https://<storage_account_name>.queue.core.windows.net"
    }
}

Blob tetikleyicilerini queueServiceUri kullanmayı planlamıyorsanız özelliğini atlayın.

Kodunuz yerel olarak çalıştırıldığında, varsayılan olarak DefaultAzureCredential için açıklanan davranışa göre geliştirici kimliğinizi kullanır.

Kodunuz Azure Uygulaması Hizmetinde barındırıldığında, yukarıda gösterilen yapılandırma varsayılan olarak kaynağın sistem tarafından atanan yönetilen kimliğine ayarlanır. Bunun yerine uygulamaya atanmış kullanıcı tarafından atanan bir kimlik kullanmak için, bağlantınız için hangi kimliğin kullanılacağını belirten ek özellikler eklemeniz gerekir. credential özelliği (AzureWebJobsStorage__credentialortam değişkeni olarak) "managedidentity" dizesine ayarlanmalıdır. clientId Özelliği (AzureWebJobsStorage__clientIdortam değişkeni olarak) kullanılacak kullanıcı tarafından atanan yönetilen kimliğin istemci kimliğine ayarlanmalıdır. Yapılandırılmış yapılandırma olarak, nesnenin tamamı şöyle olacaktır:

{
    "AzureWebJobsStorage": {
        "blobServiceUri": "https://<storage_account_name>.blob.core.windows.net",
        "queueServiceUri": "https://<storage_account_name>.queue.core.windows.net",
        "credential": "managedidentity",
        "clientId": "<user-assigned-identity-client-id>"
    }
}

için AzureWebJobsStorage kullanılan kimlikte Depolama Blobu Veri Sahibi, Depolama Kuyruğu Veri Katkıda Bulunanı ve Depolama Hesabı Katkıda Bulunanı rollerini veren rol atamaları olmalıdır. Blob tetikleyicilerini kullanmayı planlamıyorsanız hem Depolama Kuyruğu Veri Katkıda Bulunanı hem de Depolama Hesabı Katkıda Bulunanı değerlerini atabilirsiniz.

Aşağıdaki tabloda, normal işlemdeki bağlamalarda tetikleyiciler kullanılırken önerilen yerleşik roller gösterilmektedir. Uygulamanız, yazdığınız koda göre daha fazla izin gerektirebilir.

Bağlama Örnek yerleşik roller
Blob tetikleyicisi Depolama Blobu Veri Sahibi ve Depolama Kuyruğu Veri Katkıda Bulunanı
Gereksinimler AzureWebJobsStorage için de yukarıya bakın.
Blob (giriş) Depolama Blob Verileri Okuyucusu
Blob (çıkış) Depolama Blob Verileri Sahibi
Kuyruk tetikleyicisi Depolama Kuyruğu Veri Okuyucusu, Depolama Kuyruğu Veri İleti İşlemcisi
Kuyruk (çıkış) Depolama Kuyruğu Veri Katkıda Bulunanı, Depolama Kuyruğu Veri İletisi Göndereni
Service Bus tetikleyicisi1 Azure Service Bus Veri Alıcısı, Azure Service Bus Veri Sahibi
Service Bus (çıkış) Azure Service Bus Veri Göndereni

1 Service Bus konu başlıklarından tetikleme için rol atamasının Service Bus abonelik kaynağı üzerinde etkili bir kapsama sahip olması gerekir. Sadece konu dahil edilirse bir hata oluşur. Azure portal gibi bazı istemciler Service Bus abonelik kaynağını rol atama kapsamı olarak kullanıma sunmaz. Bu gibi durumlarda bunun yerine Azure CLI kullanılabilir. Daha fazla bilgi edinmek için bkz . Azure Service Bus için Azure yerleşik rolleri.

2.x sürümünde bağlantı dizeleri

Sürüm 2.SDK'nın x'i belirli bir ad gerektirmez. Sürüm 2.x, bu bağlantı dizesi için kendi adlarınızı kullanmanıza olanak tanır 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

Konak geliştirme ayarları

Yerel geliştirmeyi daha verimli hale getirmek için konağı 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şime 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 Çekirdek API'lerini kullanır. UseEnvironment örnekte yöntemini çağırınHostBuilder. Şu ö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ı, JobHostConfiguration geliştirme modunu etkinleştiren bir UseDevelopmentSettings yönteme sahiptir. Aşağıdaki örnekte geliştirme ayarlarının nasıl kullanılacağı gösterilmektedir. Yerel olarak çalıştığında dönüş true yapmak config.IsDevelopment 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ılardır. 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ırmalısınız.

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 istek iletilir. Diğer 998' ler, onlara yer olana kadar kuyruğa alındı. Başka bir deyişle, isteği yapmış gibi göründüğü için zaman aşımına uğradınız HttpClient , ancak istek işletim sistemi tarafından hedef sunucuya hiç gönderilmedi. Bu nedenle, mantıklı olmayan bir davranış görebilirsiniz: Yerel HttpClient bir isteğin tamamlanması 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 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şlamadan ö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 JobHostyönteminizde Main değeri 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 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 Bir Web İşi olarak yayımlanmalıdır ve Always on etkindir.

İş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 bir işlev örneğini göz önünde bulundurun. İş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. özniteliği, Blob çalışma zamanına sample-workitems kapsayıcısında bir blob okumak için kuyruk iletisini kullanmasını söyler. Kapsayıcıdaki samples-workitems blob öğesinin adı doğrudan kuyruk tetikleyicisinden bağlama ifadesi ( olarak){queueTrigger} 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ında 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, zamanlamaya göre çalışacak veya olay temelli tetikleyiciler kullanacak şekilde ayarlarsanız web uygulamanızın Azure Yapılandırması sayfasında Her zaman açık ayarını etkinleştirin. Always on 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 burada gösterildiği gibi özniteliğini kullanın NoAutomaticTrigger :

[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 bir çıkış bağlaması için yöntem dönüş değeri kullanabilirsiniz. Azure İşlevi dönüş değerini kullanma bölümüne 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 değeri. 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. Özel durum, Azure İşlevleri tarafından desteklenmeyen Dosyalar tetikleyicisi ve bağlamasıdır (yerel dosya sistemi için).

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

Zamanlayıcı tetikleyicisini veya temel hizmetlerin parçası olan 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 dahildir.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 UseTimers Main :

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 çağırın UseFiles.

ExecutionContext

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

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ştirilen 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: 'a geçirdiğiniz bir yapılandırma nesnesindeki özellikleri ayarlayarak yapılandırmayı JobHostayarlayın.

Bağlamaya özgü bu ayarlar, Azure İşlevleri 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 bkz . host.json v1.x başvurusu.

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

Daha fazla ayrıntı 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ğerlere çö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, bir 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şaretleriyle ç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ış bir kuyruk adı yerine koleksiyondaki appSettings bir girdinin adını belirtirsiniz.

Özel bir çözümleyici sağlamazsanız etkin olan varsayılan bir çözümleyici vardır. Varsayılan değer uygulama ayarlarından veya ortam değişkenlerinden 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 kuyruk adını uygulama ayarlarından 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, şu örnekte olduğu gibi uzantısı HostBuilderyö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ğer almak için uygularINameResolver. Web İşleri SDK'sını doğrudan kullandığınızda, tercih ettiğiniz kaynaktan yer tutucu değiştirme değerleri alan özel bir uygulama yazabilirsiniz.

Çalışma zamanında bağlama

, Blobveya Tablegibi Queuebir bağlama özniteliği 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 belgelerinde Ç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ği eklemek 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ı, zehirli kuyruk işleme.

Not

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

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, Disable bir işlevin 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ında uygulama ayarı değerlerini değiştirdiğinizde Web İşi yeniden başlatarak yeni ayarı alı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 tamamlanmazsa bir işlevin iptal edilmesine neden olur. Aşağıdaki örnekte işlev, Timeout özniteliği olmadan bir gün boyunca çalışacaktı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 özel durum oluşturarak işlev çağrısı sonlandırılır. Varsayılan "throwOnError" değeri "false" değeridir. Timeout özniteliği kullanıldığında, varsayılan davranış işlev kodunu döndürene veya özel durum oluşturana kadar çağrını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ı birden çok örneğe ölçeklendirildiğ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 tekli kilit uygulayın. JobHost başlatıldığında dinleyici kilitleri alınır. Ölçeklendirilen üç örneğin tümü aynı anda başlatılırsa, örneklerden 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 düzeyde paralellik sağlayabilir. Ö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ölgesini içeren 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 kiralama 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 örneği AddItem RemoveItem ç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ın altındaki Azure blob kiralamalarını kullanır. Singleton tarafından kullanılan kira blobları, depolama hesabındaki kapsayıcıda azure-webjobs-host 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 örnekte 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çlerinin nasıl işleneceğini öğrenmek 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 örnekte 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şmak üzere 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 birden fazla işlev örneğini çalıştırmazsınız.

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 filtrelerine 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ükle ilişkilendirilmiş Category ve Levelvardır. LogLevel bir numaralandırmadır ve tamsayı kodu göreli önem derecesini gösterir:

GünlükDüzeyi Kod
İzleme 0
Hata Ayıklama 1
Bilgiler 2
Uyarı 3
Hata 4
Kritik 5
Hiçbiri 6

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

Sürüm 3.x

Sürüm 3.SDK'nın x'i .NET Core'da yerleşik olarak bulunan filtrelemeye dayanır. sınıfı belirli LogCategories 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 de tanımlar. Bu, günlük çıkışında ince ayar yapmanızı sağlar. Tanımlanan kategorilerde eşleşme bulunmazsa, iletinin filtrelenip filtrelenmeyeceğine karar verirken filtre değere geri Default döner.

LogCategories aşağıdaki using deyimini gerektirir:

using Microsoft.Azure.WebJobs.Logging; 

Aşağıdaki örnek, varsayılan olarak tüm günlükleri Warning düzeyinde 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, veya eşleşmeleri Debug Host.Triggers.Queue Host.Triggers.Blobiçin Host.Triggers kaydedilen düzeyin olduğu anlamına gelir. Bu, her birini eklemenize gerek kalmadan daha geniş kategorileri denetlemenize olanak tanır.

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 ErrorWarningInformationtüm iletilerin Informationgünlüğe kaydedildiği, ancak veya Critical Trace düzeylerindeki iletilerin Debug filtrelendiği anlamına gelen ilk değerine sahip bir Default özelliğine sahiptir.

LogCategories Sürüm 3'te olduğu gibi.x özelliği, CategoryLevels 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, iletinin Default filtrelenip filtrelenmeyeceğine karar verirken değere geri döner.

Aşağıdaki örnek, varsayılan olarak tüm günlükleri Warning düzeyinde 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, her birini eklemenize gerek kalmadan daha geniş kategorileri denetlemenize olanak tanır.

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 temizlemeniz TelemetryClient gerekmez. .NET Core bağımlılık ekleme sistemi, kayıtlı ApplicationInsightsLoggerProvideröğesini otomatik olarak atarak temizlenir 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 istiyorsanız, kendi ITelemetryClientFactoryöğesini sağlayabilirsiniz ve konak sınıfınızı kullanarak bir TelemetryClientoluşturur. Ö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şleneceğini gösteren kod parçacıkları sağlanmıştır. Tam örnekler için bkz . azure-webjobs-sdk-samples.