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 AzureWebJobsStorage
bir 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 JobHostConfiguration
ayarlayabilirsiniz:
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ı development
bir 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.IsDevelopment
true
için değeriyle Development
adlı 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 ServicePointManager
akış kullanarak HttpClient
bir işlevden yaptığınız tüm giden HTTP istekleri. içinde DefaultConnectionLimit
ServicePointManager
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.MaxValue
ve 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 ServicePointManager
iliş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 JobHost
değ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-items
iş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 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 öğ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ı
JobHost
ayarlayı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 tetikleyicisi
- Event Hubs tetikleyicisi
- Kuyruk depolama tetikleyicisi
- SendGrid bağlaması
- Service Bus tetikleyicisi
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ı filename
bir 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 HostBuilder
uzantı 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
, Blob
veya Table
gibi Queue
bir 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.FunctionTimeout
genel 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ğini1
olarak ayarlayın. - ServiceBusTrigger.
ServiceBusConfiguration.MessageOptions.MaxConcurrentCalls
seçeneğini1
olarak ayarlayın. - FileTrigger.
FileProcessor.MaxDegreeOfParallelism
seçeneğini1
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.Function
kilit 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 AddItem
RemoveItem
ö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 Level
vardı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 LogLevel
bir öğ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 Results
gibi 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.Queue
Host.Triggers.Blob
iç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 Error
Information
Warning
tüm iletilerin günlüğe kaydedildiği, ancak veya Trace
Critical
düzeylerindeki tüm iletilerin Debug
filtrelendiği anlamına gelen ilk değerine Information
sahip 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.Blob
ile 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 ITelemetryClientFactory
bir 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 ITelemetryClientFactory
sağlayabilirsiniz; konak, oluşturmak TelemetryClient
için sınıfınızı kullanır. Örneğin, bu kod özelliğini ServerTelemetryChannel
değ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.