Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Önemli
İşlem içi model desteği 10 Kasım 2026'da sona erecektir. Tam destek için uygulamalarınızı yalıtılmış çalışan modeline geçirmenizi kesinlikle öneririz.
Bu makale, .NET sınıf kitaplıklarında C# kullanarak Azure İşlevleri geliştirmeye giriş niteliğindedir. Bu sınıf kitaplıkları İşlevler çalışma zamanı ile işlem içinde çalıştırmak için kullanılır. .NET işlevleriniz, çeşitli avantajlar sunan İşlevler çalıştırma ortamından _izole edilmiş modda çalıştırılabilir. Daha fazla bilgi edinmek için yalıtılmış çalışan modeline bakın. Bu iki model arasında kapsamlı bir karşılaştırma için bkz . İşlem içi model ile yalıtılmış çalışan modeli arasındaki farklar.
Önemli
Bu makale, çalışma zamanıyla birlikte işlem halinde çalışan .NET sınıf kitaplığı işlevlerini destekler. C# işlevleriniz de işlem dışı çalışabilir ve İşlevler çalışma zamanından yalıtılabilir. yalıtılmış çalışan işlem modeli, .NET ve .NET Framework uygulamalarının LTS dışı sürümlerini İşlevler çalışma zamanının geçerli sürümlerinde çalıştırmanın tek yoludur. Daha fazla bilgi edinmek için bkz. .NET yalıtılmış çalışan işlemi işlevleri. Yalıtılmış çalışan işlem ile işlem içi .NET İşlevleri arasında kapsamlı bir karşılaştırma için bkz. İşlem içi ve yalıtılmış çalışan işlem arasındaki farklar .NET Azure İşlevleri.
C# geliştiricisi olarak aşağıdaki makalelerden biriyle de ilgilenebilirsiniz:
| Başlarken | Kavramlar | Destekli öğrenme/örnekler |
|---|---|---|
Azure İşlevleri C# ve C# betik programlama dillerini destekler. Azure portalında C# kullanma konusunda rehberlik arıyorsanız bkz. C# betiği (.csx) geliştirici başvurusu.
Desteklenen sürümler
İşlevler çalışma zamanının sürümleri .NET belirli sürümlerini destekler. İşlev sürümleri hakkında daha fazla bilgi edinmek için bkz. Azure İşlevleri çalışma zamanı sürümlerine genel bakış. Sürüm desteği, işlevlerinizin işlem içinde mi yoksa yalıtılmış çalışan işlemi mi çalıştırdığına da bağlıdır.
Not
İşlev uygulamanızda kullanılan Functions çalışma zamanı sürümünü değiştirmeyi öğrenmek için bkz Geçerli çalışma zamanı sürümünü görüntüleme ve güncelleştirme.
Aşağıdaki tabloda, İşlevler'in belirli bir sürümüyle kullanılabilecek en yüksek .NET veya .NET Framework düzeyi gösterilmektedir.
| İşlevler çalışma zamanı sürümü | Yalıtılmış çalışan modeli | İşlem içi model4 |
|---|---|---|
| İşlevler 4.x1 | .NET 105 .NET 9.0 .NET 8.0 .NET Framework 4.82 |
.NET 8.0 |
| İşlevler 1.x3 | yok | .NET Framework 4.8 |
1 .NET 6 daha önce her iki modelde de destekleniyordu ancak 12 Kasım 2024'te resmi destek süresinin sonuna ulaştı. .NET 7, daha önce yalıtılmış çalışan modelinde destekleniyordu ancak 14 Mayıs 2024'te resmi destek sonuna ulaştı.
2 Derleme işlemi ayrıca .NET SDK gerektirir.
3 Desteği, Azure İşlevleri çalışma zamanının 1.x sürümü için 14 Eylül 2026'da sona erer. Daha fazla bilgi için bu destek duyurusna bakın. Sürekli tam destek için uygulamalarınızı 4.x sürümüne geçirmeniz gerekir.
4 Süreç içi model için destek 10 Kasım 2026'da sona erer. Daha fazla bilgi için bu destek duyurusna bakın. Sürekli tam destek için uygulamalarınızı yalıtılmış çalışan modeline geçirmeniz gerekir.
5 Tüketim planında Linux üzerinde .NET 10 uygulamayı çalıştıramazsınız. Linux üzerinde çalıştırmak için bunun yerine Flex Consumption planını kullanmanız gerekir. Adım adım geçiş yönergeleri için bkz . Tüketim planı uygulamalarını Esnek Tüketim planına geçirme.
Belirli eski ikincil sürümlerin kaldırılması dahil olmak üzere Azure İşlevleri sürümleri hakkında en son haberler için Azure App Service duyurularını izleyin.
Hedef .NET 8'e güncelleştirme
İşlem içi modeli kullanan uygulamalar, bu bölümde açıklanan adımları izleyerek .NET 8'i hedefleyebilir. Ancak, bu seçeneği kullanmaya karar verirseniz, 10 Kasım 2026'da işlem içi model için destek sona ermeden önce yalıtılmış çalışan modeline geçişinizi planlamaya başlamanız gerekir.
Birçok uygulama, kod güncelleştirmeleri veya yeniden dağıtım olmadan Azure işlev uygulamasının yapılandırmasını değiştirebilir. .NET 8'i işlem içi modelle çalıştırmak için üç yapılandırma gerekir:
-
Uygulama ayarı
FUNCTIONS_WORKER_RUNTIME"dotnet" değeriyle ayarlanmalıdır. - Uygulama ayarı
FUNCTIONS_EXTENSION_VERSION"~4" değeriyle ayarlanmalıdır. - Uygulama ayarı
FUNCTIONS_INPROC_NET8_ENABLED"1" değeriyle ayarlanmalıdır. - .NET 8'e referans vermek için yığın yapılandırmasını güncelleştirmeniz gerekir.
.NET 8 desteği yine İşlevler çalışma zamanının 4.x sürümünü kullanır ve yapılandırılmış çalışma zamanı sürümünde değişiklik yapılması gerekmez.
Yerel projenizi güncelleştirmek için öncelikle yerel araçların en son sürümlerini kullandığınızdan emin olun. Ardından projenin Microsoft.NET.Sdk.Functions sürüm 4.4.0 veya sonraki sürümlerine başvurduğundan emin olun. Ardından TargetFramework öğesini "net8.0" olarak değiştirebilirsiniz. Ayrıca local.settings.json öğesini, FUNCTIONS_WORKER_RUNTIME "dotnet" ve FUNCTIONS_INPROC_NET8_ENABLED "1" olarak ayarlanmış şekilde güncelleştirmeniz gerekir.
Aşağıdaki örnek, bu değişiklikleri içeren en az project sayıda dosyadır:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.4.0" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
</Project>
Aşağıdaki örnek, bu değişiklikleri içeren en az local.settings.json sayıda dosyadır:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_INPROC_NET8_ENABLED": "1",
"FUNCTIONS_WORKER_RUNTIME": "dotnet"
}
}
Uygulamanız Microsoft.Azure.DurableTask.Netherite.AzureFunctions kullanıyorsa 1.5.3 veya sonraki bir sürümü hedeflediğinden emin olun. .NET 8'deki bir davranış değişikliği nedeniyle, paketin eski sürümlerine sahip uygulamalar belirsiz bir oluşturucu özel durumu oluşturur.
Diğer bağımlılıklarının sürüm desteğine bağlı olarak uygulamanızda başka değişiklikler yapmanız gerekebilir.
İşlevler çalışma zamanının 4.x sürümü, .NET 6 ve .NET 8 için eşdeğer işlevler sağlar. İşlem içi model, yeni .NET 8 özellikleriyle tümleşen diğer özellikleri veya güncelleştirmeleri içermez. Örneğin, çalışma zamanı anahtarlanmış hizmetleri desteklemez. En son .NET 8 özelliklerinden ve geliştirmelerinden tam olarak yararlanmak için yalıtılmış çalışan modeline geçmeniz gerekir.
Fonksiyon sınıf kitaplığı projesi
Visual Studio'da Azure İşlevleri proje şablonu aşağıdaki dosyaları içeren bir C# sınıf kitaplığı projesi oluşturur:
- host.json - yerel olarak veya Azure çalışırken projedeki tüm işlevleri etkileyen yapılandırma ayarlarını depolar.
- local.settings.json : Yerel olarak çalıştırılırken kullanılan uygulama ayarlarını ve bağlantı dizesi depolar. Bu dosya gizli diziler içerir ve Azure işlev uygulamanızda yayımlanmaz. Bunun yerine, işlev uygulamanıza uygulama ayarları ekleyin.
Projeyi oluşturduğunuzda, derleme çıktı dizininde aşağıdaki örneğe benzer bir klasör yapısı oluşturulur:
<framework.version>
| - bin
| - MyFirstFunction
| | - function.json
| - MySecondFunction
| | - function.json
| - host.json
bu dizin, Azure'da işlev uygulamanıza dağıtılan dizindir. İşlevler çalışma zamanının 2.x sürümünde gereken bağlama uzantıları projeye NuGet paketleri olarak eklenir.
Önemli
Derleme işlemi, her işlev için bir function.json dosyası oluşturur. Bu function.json dosyasının doğrudan düzenlenmesi amaçlanmamıştır. Bu dosyayı düzenleyerek bağlama yapılandırmasını değiştiremez veya işlevi devre dışı bırakamazsınız. Bir işlevi devre dışı bırakma hakkında bilgi edinmek için Bir işlevi devre dışı bırakma bölümüne bakın.
İşlev olarak tanınan yöntemler
Bir sınıf kitaplığında işlev, aşağıdaki örnekte gösterildiği gibi ve tetikleyici özniteliğine sahip FunctionName bir yöntemdir:
public static class SimpleExample
{
[FunctionName("QueueTrigger")]
public static void Run(
[QueueTrigger("myqueue-items")] string myQueueItem,
ILogger log)
{
log.LogInformation($"C# function processed: {myQueueItem}");
}
}
FunctionName özniteliği, yöntemini bir işlev giriş noktası olarak işaretler. Ad proje içinde benzersiz olmalı, harfle başlamalıdır ve yalnızca en fazla 127 karakter uzunluğunda harf, _sayı, ve -içermelidir. Project şablonları genellikle Run adlı bir yöntem oluşturur, ancak yöntem adı geçerli bir C# yöntemi adı olabilir. Yukarıdaki örnekte kullanılan statik bir yöntem gösterilmektedir, ancak işlevlerin statik olması gerekmez.
Tetikleyici özniteliği tetikleyici türünü belirtir ve giriş verilerini bir yöntem parametresine bağlar. Örnek işlev bir kuyruk iletisi tarafından tetiklenir ve kuyruk iletisi myQueueItem parametresine yöntem olarak aktarılır.
Yöntem imzası parametreleri
Yöntem imzası tetikleyici özniteliğiyle kullanılandan farklı parametreler içerebilir. Ekleyebileceğiniz diğer parametrelerden bazıları şunlardır:
- Giriş ve çıkış bağlamaları özniteliklerle süslenerek bu şekilde işaretlenir.
-
ILoggerveyaTraceWriter(yalnızca sürüm 1.x) günlüğe kaydetme parametresi. -
CancellationTokenDüzgün kapatma için bir parametre. - Tetikleyici meta verilerini almak için ifade parametrelerini bağlama.
İşlev imzasında parametrelerin sırası önemli değildir. Örneğin, tetikleyici parametrelerini diğer bağlamalardan önce veya sonra koyabilirsiniz ve günlükçü parametresini tetikleyici veya bağlama parametrelerinin önüne veya arkasına koyabilirsiniz.
Çıkış bağlamaları
Bir işlevin çıkış parametreleri kullanılarak tanımlanan sıfır veya birden çok çıkış bağlaması olabilir.
Aşağıdaki örnek, adlı myQueueItemCopybir çıkış kuyruğu bağlaması ekleyerek öncekini değiştirir. İşlev, işlevi tetikleyen iletinin içeriğini farklı bir kuyruktaki yeni bir iletiye yazar.
public static class SimpleExampleWithOutput
{
[FunctionName("CopyQueueMessage")]
public static void Run(
[QueueTrigger("myqueue-items-source")] string myQueueItem,
[Queue("myqueue-items-destination")] out string myQueueItemCopy,
ILogger log)
{
log.LogInformation($"CopyQueueMessage function processed: {myQueueItem}");
myQueueItemCopy = myQueueItem;
}
}
Çıkış bağlamalarına atanan değerler, işlevden çıkıldığında yazılır. Birden çok çıkış parametresine değer atayarak bir işlevde birden fazla çıkış bağlaması kullanabilirsiniz.
Bağlama başvuru makaleleri (örneğin Depolama kuyrukları), tetikleyici, giriş veya çıkış bağlama öznitelikleriyle hangi parametre türlerini kullanabileceğinizi açıklar.
Bağlama ifadeleri örneği
Aşağıdaki kod, bir uygulama ayarından izlenecek kuyruğun adını alır ve parametresinde insertionTime kuyruk iletisi oluşturma süresini alır.
public static class BindingExpressionsExample
{
[FunctionName("LogQueueMessage")]
public static void Run(
[QueueTrigger("%queueappsetting%")] string myQueueItem,
DateTimeOffset insertionTime,
ILogger log)
{
log.LogInformation($"Message content: {myQueueItem}");
log.LogInformation($"Created at: {insertionTime}");
}
}
Otomatik oluşturulan function.json
Derleme işlemi, derleme klasöründeki bir işlev klasöründe function.json dosyası oluşturur. Daha önce belirtildiği gibi, bu dosyanın doğrudan düzenlenmesi amaçlanmamıştır. Bu dosyayı düzenleyerek bağlama yapılandırmasını değiştiremez veya işlevi devre dışı bırakamazsınız.
Bu dosyanın amacı, Tüketim planındaki ölçeklendirme kararları için kullanılacak ölçek denetleyicisine bilgi sağlamaktır. Bu nedenle, dosya yalnızca tetikleyici bilgilerine sahiptir, giriş/çıkış bağlamalarına sahip değildir.
Oluşturulan function.json dosyası, çalışma zamanına configurationSource yapılandırması yerine bağlamalar için .NET özniteliklerini kullanmasını bildiren bir özelliği içerir. Bir örnek aşağıda verilmiştir:
{
"generatedBy": "Microsoft.NET.Sdk.Functions-1.0.0.0",
"configurationSource": "attributes",
"bindings": [
{
"type": "queueTrigger",
"queueName": "%input-queue-name%",
"name": "myQueueItem"
}
],
"disabled": false,
"scriptFile": "..\\bin\\FunctionApp1.dll",
"entryPoint": "FunctionApp1.QueueTrigger.Run"
}
Microsoft.NET. Sdk.Functions
function.json dosya oluşturma işlemi NuGet paketi Microsoft.NET tarafından gerçekleştirilir. Sdk.Functions.
Aşağıdaki örnekte, dosyaların aynı .csproj paketin Sdk farklı hedef çerçevelerine sahip ilgili bölümleri gösterilmektedir:
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.5.0" />
</ItemGroup>
Önemli
Core Tools'un 4.0.6517 sürümünden başlayarak, işlem içi model projelerinin Microsoft.NET.Sdk.Functions 4.5.0 veya daha yeni bir sürümüne başvurması gerekir. Önceki bir sürüm kullanılırsa, func start komut hata döndürür.
Sdk Paket bağımlılıkları arasında tetikleyiciler ve bağlamalar bulunur. 1.x projesi 1.x tetikleyicilerine ve bağlamalarına başvurur çünkü bu tetikleyiciler ve bağlamalar .NET Framework'i hedeflerken, 4.x tetikleyicileri ve bağlamaları .NET Core'ı hedefler.
Paket Sdk ayrıca Newtonsoft.Json'a ve dolaylı olarak WindowsAzure.Storage'a da bağlıdır. Bu bağımlılıklar, projenizin hedeflediği çalışma zamanı sürümüyle uyumlu paket sürümlerinin kullanılmasını sağlar. Örneğin, Newtonsoft.Json .NET Framework 4.6.1 için sürüm 11'e sahiptir, ancak .NET Framework 4.6.1'i hedefleyen İşlevler çalışma zamanı yalnızca Newtonsoft.Json 9.0.1 ile uyumludur. Bu nedenle bu projedeki işlev kodunuzun da 9.0.1 kullanması Newtonsoft.Json gerekir.
Microsoft.NET.Sdk.Functions kaynak kodu azure-functions-vs-build-sdk GitHub deposunda kullanılabilir.
Yerel çalışma zamanı sürümü
Visual Studio, yerel bilgisayarınızda İşlevler projelerini çalıştırmak için Azure İşlevleri Core Tools kullanır. Çekirdek Araçlar, İşlevler çalışma zamanı için bir komut satırı arabirimidir.
Core Tools'u Windows yükleyicisi (MSI) paketini veya npm kullanarak yüklerseniz, Visual Studio tarafından kullanılan Core Tools sürümünü etkilemez. İşlevler çalışma zamanı sürüm 1.x için, Visual Studio Core Tools sürümlerini %USERPROFILE%\AppData\Local\Azure içinde depolar. Functions.Cli ve burada depolanan en son sürümü kullanır. İşlevler 4.x için, Temel Araçlar Azure İşlevleri ve Web İşleri Araçları uzantısına dahil edilir. İşlevler 1.x için, bir İşlevler projesi çalıştırdığınızda konsol çıkışında hangi sürümün kullanıldığını görebilirsiniz:
[3/1/2018 9:59:53 AM] Starting Host (HostId=contoso2-1518597420, Version=2.0.11353.0, ProcessId=22020, Debug=False, Attempt=0, FunctionsExtensionVersion=)
ReadyToRun
İşlev uygulamanızı ReadyToRun ikili dosyası şeklinde derleyebilirsiniz. ReadyToRun, bir Tüketim planında çalışırken soğuk başlatmanın etkisini azaltmaya yardımcı olacak şekilde başlangıç performansını iyileştirebilen bir önceden derleme biçimidir.
ReadyToRun, .NET 6 ve sonraki sürümlerde kullanılabilir ve Azure İşlevleri çalışma zamanının version 4.0 gerektirir.
Projenizi ReadyToRun olarak derlemek için proje dosyanıza <PublishReadyToRun> ve <RuntimeIdentifier> öğelerini ekleyerek güncelleştirin. Aşağıdaki örnek, Windows 32 bit işlev uygulamasına yayımlama yapılandırmasıdır.
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<PublishReadyToRun>true</PublishReadyToRun>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>
Önemli
.NET 6'dan başlayarak Bileşik ReadyToRun derlemesi desteği eklendi. ReadyToRun Platformlar arası ve mimari kısıtlamalarına göz atın.
Uygulamanızı komut satırından ReadyToRun ile de oluşturabilirsiniz. Daha fazla bilgi için içindeki -p:PublishReadyToRun=trueseçeneğine dotnet publish bakın.
Bağlamalar için desteklenen türler
Her bağlamanın kendi desteklenen türleri vardır; örneğin, bir blob tetikleyici özniteliği bir dize parametresine, POCO parametresine, CloudBlockBlob parametreye veya desteklenen diğer çeşitli türlerden herhangi birine uygulanabilir.
Blob bağlamaları için bağlama başvuru makalesinde desteklenen tüm parametre türleri listelenir. Daha fazla bilgi için bkz . Tetikleyiciler ve bağlamalar ve her bağlama türü için bağlama başvuru belgeleri.
İpucu
HTTP veya Web Kancası bağlayıcılarını kullanmayı planlıyorsanız, hatalı örnek oluşturmanın neden olabileceği bağlantı noktası tükenmesini önlemeyi planlayın HttpClient. Daha fazla bilgi için bkz. Azure İşlevleri'da bağlantıları yönetme.
Yöntem dönüş değerine bağlama
Yöntem dönüş değerine öznitelik uygulayarak bu dönüş değerini bir çıkış bağlaması için kullanabilirsiniz. Örnekler için bkz . Tetikleyiciler ve bağlamalar.
Başarılı bir işlev yürütmesi, çıkış bağlamasına geçirilecek bir dönüş değeriyle her zaman sonuçlanıyorsa, yalnızca o zaman dönüş değerini kullanın. Aksi takdirde, aşağıdaki bölümde gösterildiği gibi ICollector veya IAsyncCollector kullanın.
Birden çok çıkış değeri yazma
Çıkış bağlamasına birden çok değer yazmak için, veya başarılı bir işlev çağrısı sonucunda çıkış bağlamasına herhangi bir şeyin geçmesi gerekmiyorsa ICollector veya IAsyncCollector türlerini kullanın. Bu türler, sadece yazılabilir koleksiyonlar olup, yöntem tamamlandığında çıktı bağlamasına yazılırlar.
Bu örnek, ICollector kullanarak aynı kuyruğa birden fazla kuyruk iletisi yazar.
public static class ICollectorExample
{
[FunctionName("CopyQueueMessageICollector")]
public static void Run(
[QueueTrigger("myqueue-items-source-3")] string myQueueItem,
[Queue("myqueue-items-destination")] ICollector<string> myDestinationQueue,
ILogger log)
{
log.LogInformation($"C# function processed: {myQueueItem}");
myDestinationQueue.Add($"Copy 1: {myQueueItem}");
myDestinationQueue.Add($"Copy 2: {myQueueItem}");
}
}
Asenkron
bir işlevi zaman uyumsuz hale getirmek için anahtar sözcüğünü async kullanın ve bir Task nesne döndürin.
public static class AsyncExample
{
[FunctionName("BlobCopy")]
public static async Task RunAsync(
[BlobTrigger("sample-images/{blobName}")] Stream blobInput,
[Blob("sample-images-copies/{blobName}", FileAccess.Write)] Stream blobOutput,
CancellationToken token,
ILogger log)
{
log.LogInformation($"BlobCopy function processed.");
await blobInput.CopyToAsync(blobOutput, 4096, token);
}
}
Zaman uyumsuz işlevlerde out parametrelerini kullanamazsınız. Çıkış bağlamaları için bunun yerine işlev dönüş değerini veya toplayıcı nesnesini kullanın.
İptal belirteçleri
İşlev bir CancellationToken parametresini kabul edebilir ve bu parametre, işletim sisteminin işlev sonlandırılacakken kodunuzu bildirmesini sağlar. İşlevin verileri tutarsız bir durumda bırakabilecek şekilde beklenmedik şekilde sonlandırılmadığından emin olmak için bu bildirimi kullanabilirsiniz.
İletileri toplu olarak işleyen bir işleviniz olduğunda bu durumu göz önünde bulundurun. Aşağıdaki Azure Service Bus tetiklenen işlev, belirli bir işlev çağırması tarafından işlenecek gelen iletilerin toplu işlemini temsil eden ServiceBusReceivedMessage nesneleri dizisini işler:
using Azure.Messaging.ServiceBus;
using System.Threading;
namespace ServiceBusCancellationToken
{
public static class servicebus
{
[FunctionName("servicebus")]
public static void Run([ServiceBusTrigger("csharpguitar", Connection = "SB_CONN")]
ServiceBusReceivedMessage[] messages, CancellationToken cancellationToken, ILogger log)
{
try
{
foreach (var message in messages)
{
if (cancellationToken.IsCancellationRequested)
{
log.LogInformation("A cancellation token was received. Taking precautionary actions.");
//Take precautions like noting how far along you are with processing the batch
log.LogInformation("Precautionary activities --complete--.");
break;
}
else
{
//business logic as usual
log.LogInformation($"Message: {message} was processed.");
}
}
}
catch (Exception ex)
{
log.LogInformation($"Something unexpected happened: {ex.Message}");
}
}
}
}
Loglama
İşlev kodunuzda, Application Insights'ta iz olarak görünen kayıtlara çıktı yazabilirsiniz. Günlüklere yazmanın önerilen yolu, genellikle olarak adlandırılan bir parametre eklemektir. İşlevler çalışma zamanının 1.x sürümü, TraceWriterApplication Insights'a da yazar, ancak yapılandırılmış günlüğü desteklemez. Application Insights bu verileri yakalamadığı için, günlüklerinizi yazmak için Console.Write kullanmayın.
ILogger
İşlev tanımınıza yapılandırılmış günlüğü destekleyen bir ILogger parametresi ekleyin.
Bir ILogger nesnesiyle, günlükleri oluşturmak için ILogger'da uzantı yöntemlerini çağırırsınız Log<level>. Aşağıdaki kod Information kategorisine ait Function.<YOUR_FUNCTION_NAME>.User. günlüklerini yazar:
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger logger)
{
logger.LogInformation("Request for item with key={itemKey}.", id);
İşlevlerin ILoggernasıl uyguladığı hakkında daha fazla bilgi edinmek için bkz . Telemetri verilerini toplama. < c0 /> ile öneklenmiş kategoriler, bir ILogger<T> kullanmayı seçerseniz, kategori adı yerine T'e dayanabilir.
Yapılandırılmış günlüğe kaydetme
Yer tutucuların adları değil sırası, günlük iletisinde hangi parametrelerin kullanılacağını belirler. Aşağıdaki koda sahip olduğunuzu varsayalım:
string partitionKey = "partitionKey";
string rowKey = "rowKey";
logger.LogInformation("partitionKey={partitionKey}, rowKey={rowKey}", partitionKey, rowKey);
Aynı ileti dizesini tutar ve parametrelerin sırasını tersine çevirirseniz, sonuçta elde edilen ileti metninde değerler yanlış yerlerde olur.
Yer tutucular, yapılandırılmış kayıt tutma gerçekleştirebilmeniz için bu şekilde işlenir. Application Insights, parametre adı-değer çiftlerini ve ileti dizesini depolar. Sonuç, mesaj parametrelerinin sorgulama yapabileceğiniz alanlara dönüşmesidir.
Eğer loglayıcı metot çağrınız önceki örneğe benziyorsa, alan customDimensions.prop__rowKey sorgulaması yapabilirsiniz. Çalışma zamanının prop__ eklediği alanlar ile işlev kodunuzun eklediği alanlar arasında çakışma olmadığından emin olmak için ön ek eklenir.
alanına customDimensions.prop__{OriginalFormat}başvurarak özgün ileti dizesini de sorgulayabilirsiniz.
Verilerin örnek JSON gösterimi aşağıda verilmişti customDimensions :
{
"customDimensions": {
"prop__{OriginalFormat}":"C# Queue trigger function processed: {message}",
"Category":"Function",
"LogLevel":"Information",
"prop__message":"c9519cbf-b1e6-4b9b-bf24-cb7d10b1bb89"
}
}
Özel telemetri kaydetme
Önemli
OpenTelemetry, C# işlem içi işlev uygulamaları için desteklenmez. Yalıtılmış çalışan modeli için, özel telemetri için önerilen yaklaşım olan OpenTelemetry ihracatçısını kullanın. Bu bölümde gösterilen klasik Application Insights SDK'sı eskidir ve yeni özellik güncelleştirmelerini almaz.
İşlevlerinizden Application Insights'a özel telemetri verileri göndermek için kullanabileceğiniz Application Insights SDK'sının İşlevlere özgü bir sürümü vardır: Microsoft.Azure. WebJobs.Logging.ApplicationInsights. Bu paketi yüklemek için komut isteminden aşağıdaki komutu kullanın:
dotnet add package Microsoft.Azure.WebJobs.Logging.ApplicationInsights --version <VERSION>
Bu komutta, <VERSION>'ın yüklü sürümünüzü destekleyen bir paketin sürümüyle değiştirin.
Aşağıdaki C# örnekleri özel telemetri API'sini kullanır. Örnek, .NET sınıf kitaplığına yöneliktir, ancak Application Insights kodu C# betiği için aynıdır.
Çalışma zamanının 2.x ve sonraki sürümleri, telemetri verilerini geçerli işlemle otomatik olarak ilişkilendirmek için Application Insights'taki daha yeni özellikleri kullanır. İşlem, Id, ParentId veya Name alanlarını el ile ayarlamanıza gerek yok.
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;
using System.Linq;
namespace functionapp0915
{
public class HttpTrigger2
{
private readonly TelemetryClient telemetryClient;
/// Using dependency injection will guarantee that you use the same configuration for telemetry collected automatically and manually.
public HttpTrigger2(TelemetryConfiguration telemetryConfiguration)
{
this.telemetryClient = new TelemetryClient(telemetryConfiguration);
}
[FunctionName("HttpTrigger2")]
public Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
HttpRequest req, ExecutionContext context, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
DateTime start = DateTime.UtcNow;
// Parse query parameter
string name = req.Query
.FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
.Value;
// Write an event to the customEvents table.
var evt = new EventTelemetry("Function called");
evt.Context.User.Id = name;
this.telemetryClient.TrackEvent(evt);
// Generate a custom metric, in this case let's use ContentLength.
this.telemetryClient.GetMetric("contentLength").TrackValue(req.ContentLength);
// Log a custom dependency in the dependencies table.
var dependency = new DependencyTelemetry
{
Name = "GET api/planets/1/",
Target = "swapi.co",
Data = "https://swapi.co/api/planets/1/",
Timestamp = start,
Duration = DateTime.UtcNow - start,
Success = true
};
dependency.Context.User.Id = name;
this.telemetryClient.TrackDependency(dependency);
return Task.FromResult<IActionResult>(new OkResult());
}
}
}
Bu örnekte, özel ölçüm verileri customMetrics tablosuna gönderilmeden önce sunucu tarafından birleştirilir. Daha fazla bilgi edinmek için Application Insights'taki GetMetric belgelerine bakın.
Yerel olarak çalışırken, Application Insights anahtarıyla APPINSIGHTS_INSTRUMENTATIONKEY ayarını local.settings.json dosyasına eklemeniz gerekir.
İşlev çağrısı için yinelenen istekler gördüğünüzde TrackRequest veya StartOperation<RequestTelemetry> çağrısı yapmayın. İşlevler çalışma zamanı istekleri otomatik olarak izler.
ayarlamayın telemetryClient.Context.Operation.Id. Bu genel ayar, birçok işlev aynı anda çalışırken yanlış bağıntıya neden olur. Bunun yerine yeni bir telemetri örneği (DependencyTelemetry, EventTelemetry) oluşturun ve özelliğini Context değiştirin. Ardından telemetri örneğini (Track, TelemetryClient, TrackDependency()) üzerindeki TrackEvent() ilgili TrackMetric() yönteme geçirin. Bu yöntem, telemetrinin geçerli işlev çağrısı için doğru bağıntı ayrıntılarına sahip olmasını sağlar.
İşlevleri test etme
Aşağıdaki makalelerde test amacıyla işlem içi C# sınıf kitaplığı işlevinin yerel olarak nasıl çalıştırılacakları gösterilmektedir:
Ortam değişkenleri
Ortam değişkeni veya uygulama ayarı değeri almak için, aşağıdaki kod örneğinde gösterildiği gibi kullanın System.Environment.GetEnvironmentVariable:
public static class EnvironmentVariablesExample
{
[FunctionName("GetEnvironmentVariables")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}
private static string GetEnvironmentVariable(string name)
{
return name + ": " +
System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}
}
Uygulama ayarları hem yerel olarak geliştirirken hem de Azure'de çalıştırılırken ortam değişkenlerinden okunabilir. Yerel olarak geliştirme yaparken, uygulama ayarları Values koleksiyondan local.settings.json dosyasından gelir. Her iki ortamda da, yerel ve Azure'da, GetEnvironmentVariable("<app setting name>") belirtilmiş uygulama ayarının değerini alır. Örneğin, yerel olarak çalıştırdığınızda, local.settings.json dosyanızda { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } } varsa, "Sitem Adı" döndürülür.
System.Configuration.ConfigurationManager.AppSettings özelliği, uygulama ayarı değerlerini almak için alternatif bir API'dir, ancak burada gösterildiği gibi kullanmanızı GetEnvironmentVariable öneririz.
Çalışma zamanında bağlama
C# ve diğer .NET dillerinde, niteliklerdeki deklaratif bağlamaların aksine, bir imperatif bağlama deseni kullanabilirsiniz. Kesinlik temelli bağlama, bağlama parametrelerinin tasarım zamanından ziyade çalışma zamanında hesaplanması gerektiğinde yararlıdır. Bu desenle, işlev kodunuzda desteklenen giriş ve çıkış bağlamalarını anında bağlayabilirsiniz.
Kesinlik temelli bağlamayı aşağıdaki gibi tanımlayın:
İstediğiniz kesinlik temelli bağlamalar için işlev imzasında bir öznitelik eklemeyin.
Giriş parametresini
Binder binderveyaIBinder bindergeçirin.Veri bağlamayı gerçekleştirmek için aşağıdaki C# desenini kullanın.
using (var output = await binder.BindAsync<T>(new BindingTypeAttribute(...))) { ... }BindingTypeAttributebağlamanızı tanımlayan .NET özniteliğidir veTbu bağlama türü tarafından desteklenen bir giriş veya çıkış türüdür.Tbiroutparametre türü (örneğinout JObject) olamaz. Örneğin, Mobile Apps tablosu çıkış bağlaması altı çıkış türünü destekler, ancak kesin bağlama ile yalnızca veya < kullanabilirsiniz.
Tek öznitelik örneği
Aşağıdaki örnek kod, çalışma zamanında tanımlanan blob yolu ile bir Depolama blobu çıkış bağlaması oluşturur ve ardından bloba bir dize yazar.
public static class IBinderExample
{
[FunctionName("CreateBlobUsingBinder")]
public static void Run(
[QueueTrigger("myqueue-items-source-4")] string myQueueItem,
IBinder binder,
ILogger log)
{
log.LogInformation($"CreateBlobUsingBinder function processed: {myQueueItem}");
using (var writer = binder.Bind<TextWriter>(new BlobAttribute(
$"samples-output/{myQueueItem}", FileAccess.Write)))
{
writer.Write("Hello World!");
};
}
}
BlobAttributeStorage blobu giriş veya çıkış bağlamasını tanımlar ve TextWriter desteklenen bir çıkış bağlama türüdür.
Birden çok öznitelik örneği
Yukarıdaki örnek, işlev uygulamasının ana Depolama hesabı bağlantı dizesi (AzureWebJobsStorage) için uygulama ayarını alır.
StorageAccountAttribute ekleyerek ve öznitelik dizisini BindAsync<T>() geçirerek Depolama hesabı için kullanılacak özel bir uygulama ayarı belirtebilirsiniz.
Binder parametresini kullanmayın, IBinder parametresini kullanın. Örneğin:
public static class IBinderExampleMultipleAttributes
{
[FunctionName("CreateBlobInDifferentStorageAccount")]
public async static Task RunAsync(
[QueueTrigger("myqueue-items-source-binder2")] string myQueueItem,
Binder binder,
ILogger log)
{
log.LogInformation($"CreateBlobInDifferentStorageAccount function processed: {myQueueItem}");
var attributes = new Attribute[]
{
new BlobAttribute($"samples-output/{myQueueItem}", FileAccess.Write),
new StorageAccountAttribute("MyStorageAccount")
};
using (var writer = await binder.BindAsync<TextWriter>(attributes))
{
await writer.WriteAsync("Hello World!!");
}
}
}
Tetikleyiciler ve bağlamalar
Bu tabloda, Azure İşlevleri çalışma zamanının ana sürümlerinde desteklenen bağlamalar gösterilmektedir:
| Tür | 4.x1 | 1.x2 | Tetikleyici | Girdi | Çıktı |
|---|---|---|---|---|---|
| Blob Depolama | ✔ | ✔ | ✔ | ✔ | ✔ |
| Azure Cosmos DB | ✔ | ✔ | ✔ | ✔ | ✔ |
| Azure Veri Gezgini | ✔ | ✔ | ✔ | ||
| Azure SQL | ✔ | ✔ | ✔ | ✔ | |
| Dapr4 | ✔ | ✔ | ✔ | ✔ | |
| Event Grid | ✔ | ✔ | ✔ | ✔ | |
| Event Hubs | ✔ | ✔ | ✔ | ✔ | |
| HTTP ve web kancaları | ✔ | ✔ | ✔ | ✔ | |
| IoT Hub | ✔ | ✔ | ✔ | ||
| Kafka3 | ✔ | ✔ | ✔ | ||
| Mobile Apps | ✔ | ✔ | ✔ | ||
| Model Bağlam Protokolü | ✔ | ✔ | |||
| Notification Hubs | ✔ | ✔ | |||
| Kuyruk Depolama | ✔ | ✔ | ✔ | ✔ | |
| Redis | ✔ | ✔ | ✔ | ✔ | |
| RabbitMQ3 | ✔ | ✔ | ✔ | ||
| SendGrid | ✔ | ✔ | ✔ | ||
| Service Bus | ✔ | ✔ | ✔ | ✔ | |
| Azure SignalR Hizmeti | ✔ | ✔ | ✔ | ✔ | |
| Tablo Saklama | ✔ | ✔ | ✔ | ✔ | |
| Zamanlayıcı | ✔ | ✔ | ✔ | ||
| Twilio | ✔ | ✔ | ✔ |
- HTTP ve zamanlayıcı dışındaki tüm bağlamaları kaydedin. Bkz. Register Azure İşlevleri bağlama uzantıları. İşlevler çalışma zamanının 1.x sürümü kullanılırken bu adım gerekli değildir.
- Support, Azure İşlevleri çalışma zamanının 1.x sürümü için 14 Eylül 2026 tarihinde sona erer. Tam destek için uygulamalarınızı sürüm 4.x'e geçirin.
- Tetikleyiciler Tüketim planında desteklenmez. Bu bağlama türü , çalışma zamanı temelli tetikleyiciler gerektirir.
- Bu bağlama türü yalnızca Kubernetes, Azure IoT Edge ve diğer şirket içinde barındırılan modlarda desteklenir.