Azure Işlevleri 'ni kullanarak C# sınıf kitaplığı işlevleri geliştirme

Bu makale, .NET sınıf kitaplıklarında C# kullanarak Azure Işlevleri geliştirmeye giriş niteliğindedir.

Önemli

Bu makale, çalışma zamanında işlem içinde çalışan .NET sınıf kitaplığı işlevlerini destekler. İşlevler ayrıca, C# işlevlerinizi işlem dışı ve çalışma zamanından yalıtılmış olarak çalıştırarak .NET 5. x ' i destekler. Daha fazla bilgi için bkz. .net yalıtılmış işlem işlevleri.

Bir C# geliştiricisi olarak, aşağıdaki makalelerden biriyle de ilgileniyor olabilirsiniz:

Başlarken Kavramlar Kılavuzlu öğrenme/örnekler

Azure Işlevleri C# ve C# betiği programlama dillerini destekler. Azure Portal c# kullanmahakkında 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 belirli .NET sürümleriyle çalışır. İşlev sürümleri hakkında daha fazla bilgi edinmek için bkz. Azure İşlevleri sürümlerine genel bakış. Sürüm desteği, işlevlerinizin işlem içinde mi yoksa işlem dışında mı (yalıtılmış) çalışmasına bağlıdır.

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

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

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

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

İşlevler v2. x konuları

En son 2. x sürümünü () hedefleyen işlev uygulamaları, ~2 .NET Core 3,1 ' de çalışacak şekilde otomatik olarak yükseltilir. .NET Core sürümleri arasındaki önemli değişiklikler nedeniyle, .NET Core 2,2 ile geliştirilen ve derlenen tüm uygulamalar güvenli bir şekilde .NET Core 3,1 sürümüne yükseltilebilir. İşlev uygulamanızı öğesine sabitleyerek Bu yükseltmeyi devre dışı bırakabilirsiniz ~2.0 . İşlevler ayrıca uyumsuz API 'Leri algılar ve ~2.0 .NET Core 3,1 ' de yanlış yürütmeyi engellemek için uygulamanızı ' a sabitleyebilir.

Not

İşlev uygulamanız sabitlenir ~2.0 ve bu sürüm hedefini olarak değiştirirseniz ~2 , işlev uygulamanız kesintiye uğramayabilir. ARM şablonları kullanarak dağıtıyorsanız, şablonlarınızın sürümünü kontrol edin. Bu durumda, sürümünüzü hedefle olarak değiştirin ~2.0 ve uyumluluk sorunlarını giderin.

Hedeflenen işlev uygulamaları ~2.0 .NET Core 2,2 ' de çalıştırılmaya devam eder. .NET Core 'un bu sürümü artık güvenlik ve diğer bakım güncelleştirmelerini almaz. Daha fazla bilgi edinmek için Bu duyuru sayfasınabakın.

İşlevlerinizi .NET Core 3,1 ile uyumlu hale getirmek için en kısa sürede çalışmanız gerekir. Bu sorunları çözdükten sonra sürümünüzü yeniden olarak değiştirin ~2 veya sürümüne yükseltin ~3 . Işlevler çalışma zamanının hedeflenen sürümlerini hakkında daha fazla bilgi edinmek için bkz. Azure işlevleri çalışma zamanı sürümlerinihedefleme.

linux üzerinde Premium veya adanmış (App Service) bir planda çalışırken, nasıl ayarlanacağını öğrenmek için site yapılandırma ayarını olarak ayarlayarak belirli bir görüntüyü hedefleyerek sürümünüzü sabitleyerek linuxFxVersion DOCKER|mcr.microsoft.com/azure-functions/dotnet:2.0.14786-appservice linuxFxVersion , Linux üzerinde el ile sürüm güncelleştirmeleribölümüne bakın.

İşlevler sınıf kitaplığı projesi

Visual Studio, Azure işlevleri proje şablonu, aşağıdaki dosyaları içeren bir C# sınıf kitaplığı projesi oluşturur:

  • host.js , yerel olarak veya Azure 'da çalışırken projedeki tüm işlevleri etkileyen yapılandırma ayarlarını depolar.
  • local.settings.js , yerel olarak çalışırken kullanılan uygulama ayarlarını ve bağlantı dizelerini depolar. Bu dosya gizli dizileri içerir ve Azure 'da işlev uygulamanıza yayımlanmaz. Bunun yerine, uygulama ayarlarını işlev uygulamanıza ekleyin.

Projeyi derlediğinizde, derleme çıkış dizininde aşağıdaki örnek gibi görünen bir klasör yapısı oluşturulur:

<framework.version>
 | - bin
 | - MyFirstFunction
 | | - function.json
 | - MySecondFunction
 | | - function.json
 | - host.json

Bu dizin, Azure 'daki işlev uygulamanıza dağıtılır. işlevler çalışma zamanının 2. x sürümünde gerekli olan bağlama uzantıları projeye NuGet paketleri olarak eklenir.

Önemli

Yapı işlemi her bir işlev için dosyada bir function.js oluşturur. Dosyadaki bu function.js doğrudan düzenlenmeyecek. Bu dosyayı düzenleyerek bağlama yapılandırmasını değiştiremez veya işlevi devre dışı bırakabilirsiniz. Bir işlevi nasıl devre dışı bırakacağınızı öğrenmek için bkz. işlevleri devre dışı bırakma.

İşlev olarak tanınan Yöntemler

Bir sınıf kitaplığında, bir işlev, FunctionName Aşağıdaki örnekte gösterildiği gibi, ve bir tetikleyici özniteliği olan statik 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öntemi bir işlev giriş noktası olarak işaretler. Ad bir proje içinde benzersiz olmalıdır, bir harfle başlamalı ve yalnızca harf, sayı, _ ve - , en fazla 127 karakter içermelidir. Project şablonlar genellikle adlı bir yöntem oluşturur Run , ancak yöntem adı geçerli bir C# yöntem adı olabilir.

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, parametresindeki yöntemine geçirilir myQueueItem .

Yöntem imza parametreleri

Yöntem imzası, tetikleyici özniteliğiyle kullanılandan farklı parametreler içeriyor olabilir. Şunları dahil edebilirsiniz:

İşlev imzasında parametrelerin sırası sizin için değildir. Örneğin, tetikleme parametrelerini diğer bağlamalardan önce veya sonra koyabilirsiniz ve tetikleyici veya bağlama parametrelerinden önce veya sonra günlükçü parametresini yerleştirebilirsiniz.

Çıkış bağlamaları

Bir işlev, çıkış parametreleri kullanılarak tanımlanmış sıfır veya bir çıkış bağlaması olabilir.

Aşağıdaki örnek, adlı bir çıkış sırası bağlaması ekleyerek önceki bir adı değiştirir myQueueItemCopy . İşlevi, 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şlev çıktığında yazılır. Yalnızca 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 öznitelikleri ile hangi parametre türlerini kullanabileceğinizi açıklar.

Bağlama ifadeleri örneği

Aşağıdaki kod, bir uygulama ayarından izlenecek sıranın adını alır ve parametresindeki sıra iletisi oluşturma zamanını alır insertionTime .

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

function.jsotomatik olarak oluşturulur

Yapı işlemi, derleme klasöründeki bir işlev klasöründe bir function.js dosya oluşturur. Daha önce belirtildiği gibi, bu dosyanın doğrudan düzenlenmesi amaçlıyordu. Bu dosyayı düzenleyerek bağlama yapılandırmasını değiştiremez veya işlevi devre dışı bırakabilirsiniz.

Bu dosyanın amacı, Tüketim planındaki kararları ölçeklendirirkenkullanılacak ölçek denetleyicisine bilgi sağlamaktır. Bu nedenle, dosya yalnızca tetikleyici bilgisine sahiptir, giriş/çıkış bağlamaları değildir.

Dosyada oluşturulan function.js , configurationSource çalışma zamanına yapılandırma function.js yerine bağlama için .net öznitelikleri kullanmasını söyleyen bir özelliği içerir. Aşağıda bir örnek 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

dosya oluşturma function.js NuGet paketi Microsoft . NET . Sdk . işlevleritarafından gerçekleştirilir.

Aynı paket, Işlevler çalışma zamanının hem sürüm 1. x hem de 2. x için kullanılır. Hedef Framework, bir 2. x projesinden 1. x projesini farklılaştırır. Aynı pakete sahip farklı hedef çerçeveleri gösteren . csproj dosyalarının ilgili bölümleri aşağıda verilmiştir Sdk :

<PropertyGroup>
  <TargetFramework>netcoreapp2.1</TargetFramework>
  <AzureFunctionsVersion>v2</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
  <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.8" />
</ItemGroup>

SdkPaket bağımlılıkları arasında Tetikleyiciler ve bağlamalar vardır. 1. x projesi 1. x tetikleyicilerine ve bağlamalara başvurur çünkü bu tetikleyiciler ve bağlamalar .NET Framework, ancak 2. x tetikleyicileri ve bağlamaları hedef .net Core ' u hedefler.

Sdkpaket ayrıca, windowsazure. Depolamaüzerinde Newtonsoft.Jsve dolaylı olarak değişir. Bu bağımlılıklar, projenizin, projenin hedeflediği Işlevler çalışma zamanı sürümüyle çalışan paketlerin sürümlerini kullandığından emin olun. örneğin, Newtonsoft.Json .NET Framework 4.6.1 için sürüm 11 ' e sahiptir, ancak .NET Framework 4.6.1 hedefleyen işlevler çalışma zamanı yalnızca 9.0.1 ile uyumludur Newtonsoft.Json . Bu nedenle, bu projedeki işlev kodunuzun de 9.0.1 kullanması gerekir Newtonsoft.Json .

için kaynak kodu, Microsoft.NET.Sdk.Functions GitHub depo azure - işlevleri - vs - derlemesi - sdk 'sındabulunabilir.

Yerel çalışma zamanı sürümü

Visual Studio, yerel bilgisayarınızda işlev projelerini çalıştırmak için Azure Functions Core Tools kullanır. Temel araçlar, Işlevler çalışma zamanı için bir komut satırı arabirimidir.

çekirdek araçları Windows ınstaller (msı) paketini veya npm kullanarak yüklerseniz, Visual Studio tarafından kullanılan temel araçlar sürümünü etkilemez. çalışma zamanı sürüm 1. x, Visual Studio çekirdek araçları sürümlerini %USERPROFILE%\AppData\Local\Azure.Functions.Cli ' de depolar ve burada depolanan en son sürümü kullanır. 2. x Işlevleri için, temel araçlar Azure işlevleri ve Web Işleri araçları uzantısına dahildir. Hem 1. x hem de 2. x için, bir Iş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 ikilileriolarak derleyebilirsiniz. ReadyToRun, bir Tüketim planındaçalışırken soğuk başlatmanın etkisini azaltmaya yardımcı olmak için başlangıç performansını iyileştirebilecek bir süre öncesi derleme biçimidir.

ReadyToRun, .NET 3,0 ' de kullanılabilir ve Azure işlevleri çalışma zamanının 3,0 sürümünügerektirir.

Projenizi ReadyToRun olarak derlemek için, ve öğelerini ekleyerek proje dosyanızı güncelleştirin <PublishReadyToRun> <RuntimeIdentifier> . aşağıda, Windows 32 bitlik bir işlev uygulamasına yayımlama yapılandırması verilmiştir.

<PropertyGroup>
  <TargetFramework>netcoreapp3.1</TargetFramework>
  <AzureFunctionsVersion>v3</AzureFunctionsVersion>
  <PublishReadyToRun>true</PublishReadyToRun>
  <RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>

Önemli

ReadyToRun Şu anda çapraz derlemeyi desteklemiyor. Uygulamanızı dağıtım hedefi ile aynı platformda derlemeniz gerekir. Ayrıca, işlev uygulamanızda yapılandırılan "bit genişliği" ile ilgilenyin. örneğin, Azure 'daki işlev uygulamanız 64 bitlik Windows, uygulamanızı win-x64 çalışma zamanı tanımlayıcısıolarak ile Windows derlemeniz gerekir.

Uygulamanızı komut satırından ReadyToRun ile de oluşturabilirsiniz. Daha fazla bilgi için, -p:PublishReadyToRun=true içindeki seçeneğine bakın dotnet publish .

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, bir POCO parametresine, CloudBlockBlob parametreye veya desteklenen başka birkaç türden birine uygulanabilir. BLOB bağlamaları için bağlama başvuru makalesi , desteklenen tüm parametre türlerini listeler. Daha fazla bilgi için, bkz. Tetikleyiciler ve bağlamalar ve her bağlama türü için bağlama başvurusu belgeleri.

İpucu

HTTP veya Web kancası bağlamalarını kullanmayı planlıyorsanız, yanlış örneklemesinin neden olduğu bir bağlantı noktası tükenmesi olmaması için plan yapın HttpClient . Daha fazla bilgi için bkz. Azure işlevlerinde bağlantıları yönetme.

Metot dönüş değerine bağlama

Özniteliği yöntem dönüş değerine uygulayarak bir çıkış bağlaması için bir yöntem dönüş değeri kullanabilirsiniz. Örnekler için bkz. Tetikleyiciler ve bağlamalar.

Dönüş değerini yalnızca başarılı bir işlev yürütmesi her zaman çıkış bağlamasına geçirilecek bir dönüş değeri ile sonuçlanırsa kullanın. Aksi takdirde, ICollector IAsyncCollector aşağıdaki bölümde gösterildiği gibi, veya kullanın.

Birden çok çıkış değeri yazma

Bir çıkış bağlamasına birden çok değer yazmak için veya başarılı bir işlev çağrılması çıkış bağlamasına geçirilecek herhangi bir şeye neden olmazsa, ICollector veya IAsyncCollector türlerini kullanın. Bu türler, yöntem tamamlandığında çıkış bağlamaya yazılan salt yazılır koleksiyonlardır.

Bu örnek, kullanarak birden çok kuyruk iletisini aynı kuyruğa yazar ICollector :

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

Zaman Uyumsuz

Bir işlevi zaman uyumsuzyapmak için async anahtar sözcüğünü kullanın ve bir Task nesne döndürün.

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

outZaman uyumsuz işlevlerde parametreleri kullanamazsınız. Çıktı bağlamaları için, bunun yerine işlev dönüş değeri veya toplayıcı nesnesi kullanın.

İptal belirteçleri

Bir işlev bir CancellationToken parametresini kabul edebilir ve bu, işlev sonlandırıldıktan sonra işletim sisteminin kodunuza bildirmesini sağlar. Bu bildirimi, işlevin verileri tutarsız bir durumda bırakmak için beklenmedik bir şekilde sonlandığından emin olmak için kullanabilirsiniz.

Aşağıdaki örnek, yaklaşan işlev sonlandırmasının nasıl kontrol alınacağını gösterir.

public static class CancellationTokenExample
{
    public static void Run(
        [QueueTrigger("inputqueue")] string inputText,
        TextWriter logger,
        CancellationToken token)
    {
        for (int i = 0; i < 100; i++)
        {
            if (token.IsCancellationRequested)
            {
                logger.WriteLine("Function was cancelled at iteration {0}", i);
                break;
            }
            Thread.Sleep(5000);
            logger.WriteLine("Normal processing for queue message={0}", inputText);
        }
    }
}

Günlüğe Kaydetme

işlev kodunuzda, Application Insights izleme olarak görünen günlüklere çıkış yazabilirsiniz. Günlüklere yazmak için önerilen yol, genellikle adlı ILoggertüründe bir parametre içerir log . TraceWriteraynı zamanda Application Insights yazan, ancak yapısal günlüğü desteklemeyen işlevler çalışma zamanının sürüm 1. x. Console.Writebu veriler Application Insights tarafından yakalandığından günlüklerinizi yazmak için kullanmayın.

ILogger

İşlev tanımınızda, yapılandırılmış günlüğe kaydetmeyidestekleyen bir ILogger parametresi ekleyin.

Bir ILogger nesnesi ile, Log<level> günlük oluşturmak Için ILogger üzerinde uzantı yöntemleri çağırın. Aşağıdaki kod şu Information kategoriye sahip günlüklere yazar Function.<YOUR_FUNCTION_NAME>.User. :

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger logger)
{
    logger.LogInformation("Request for item with key={itemKey}.", id);

Işlevlerin nasıl uyguladığı hakkında daha fazla bilgi edinmek için ILogger bkz. telemetri verilerini toplama. Ön Ekli kategoriler Function bir örnek kullandığınızı varsayar ILogger . Bunun yerine bir kullanmayı tercih ederseniz ILogger<T> Kategori adı temel alabilir T .

Yapılandırılmış günlüğe kaydetme

Adları değil, yer tutucular sırası, günlük iletisinde kullanılan parametreleri 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ı ters tutarsanız, sonuçta elde edilen ileti metninde yanlış yerlerde değerler olacaktır.

Yer tutucular bu şekilde işlenir, böylece yapılandırılmış günlüğe kaydetme yapabilirsiniz. Application Insights, ad-değer çiftlerini ve ileti dizesini depolayan parametre. Sonuç olarak, ileti bağımsız değişkenlerinin sorgulayabilmeniz için alanlar haline gelir.

Günlükçü yöntemi çağrın bir önceki örneğe benzei durumunda, alanı sorgulayabilirsiniz customDimensions.prop__rowKey . prop__Çalışma zamanı eklemeleri ve işlev kodunuzun eklediği alanlar arasında çakışma olmadığından emin olmak için ön ek eklenir.

Ayrıca, alanına başvurarak özgün ileti dizesinde sorgulama yapabilirsiniz customDimensions.prop__{OriginalFormat} .

Aşağıda, verilerin JSON örnek bir gösterimi verilmiştir customDimensions :

{
  "customDimensions": {
    "prop__{OriginalFormat}":"C# Queue trigger function processed: {message}",
    "Category":"Function",
    "LogLevel":"Information",
    "prop__message":"c9519cbf-b1e6-4b9b-bf24-cb7d10b1bb89"
  }
}

Özel telemetri günlüğe kaydet

Application Insights SDK 'nın işlevlerinizden özel telemetri verilerini Application Insights: Microsoft. Azure. webjobs. Logging. applicationınsights'a göndermek için kullanabileceğiniz işlevlere özgü bir sürümü vardır. Bu paketi yüklemek için komut isteminde aşağıdaki komutu kullanın:

dotnet add package Microsoft.Azure.WebJobs.Logging.ApplicationInsights --version <VERSION>

Bu komutta, ' nin <VERSION> yüklü Microsoft. Azure. WebJobssürümünüzü destekleyen bir sürümü ile değiştirin.

Aşağıdaki C# örnekleri özel TELEMETRI API'sini kullanır. örnek bir .net sınıf kitaplığı içindir, ancak Application Insights kodu C# betiği için aynıdır.

çalışma zamanının sürüm 2. x ve sonraki sürümleri, geçerli işlemle telemetriyi otomatik olarak ilişkilendirmek için Application Insights yeni özellikleri kullanır. İşlem Id , veya alanlarını el ile ayarlamanız gerekmez ParentId Name .

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, Customölçümler tablosuna gönderilmeden önce ana bilgisayar tarafından toplanır. daha fazla bilgi edinmek için Application Insights içindeki getmetric belgelerine bakın.

yerel olarak çalışırken, APPINSIGHTS_INSTRUMENTATIONKEY Application Insights anahtarı ile ayarını local.settings.js dosyasına eklemeniz gerekir.

TrackRequest StartOperation<RequestTelemetry> Bir işlev çağrısı için yinelenen istekler göreceğiniz için veya çağrısı yapmayın. Işlevler çalışma zamanı istekleri otomatik olarak izler.

Ayarlanmadı telemetryClient.Context.Operation.Id . Aynı anda çok sayıda işlev çalışırken bu genel ayar yanlış bağıntı oluşmasına neden olur. Bunun yerine, yeni bir telemetri örneği ( DependencyTelemetry , EventTelemetry ) oluşturun ve Context özelliğini değiştirin. Ardından Telemetri örneğini Track TelemetryClient ( TrackDependency() , TrackEvent() ,) üzerinde ilgili yönteme geçirin TrackMetric() . Bu yöntem, telemetrinin geçerli işlev çağırma için doğru bağıntı ayrıntılarına sahip olmasını sağlar.

Ortam değişkenleri

Bir ortam değişkeni veya bir uygulama ayarı değeri almak için, System.Environment.GetEnvironmentVariable Aşağıdaki kod örneğinde gösterildiği gibi kullanın:

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 hem de Azure 'da çalışırken ortam değişkenlerinden okunabilir. Yerel olarak geliştirme yaparken, uygulama ayarları Values dosyadaki local.settings.js koleksiyonundan gelir. Yerel ve Azure her iki ortamda da GetEnvironmentVariable("<app setting name>") adlandırılmış uygulama ayarının değerini alır. Örneğin, yerel olarak çalışırken, dosyasında local.settings.js içeriyorsa "Sitem adı" döndürülür { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } } .

System.Configuration.ConfigurationManager. AppSettings özelliği, uygulama ayarı değerlerini almaya yönelik ALTERNATIF bir API 'dir, ancak GetEnvironmentVariable burada gösterildiği gibi kullanmanızı öneririz.

Çalışma zamanında bağlama

C# ve diğer .NET dillerinde, öznitelikler içindeki bildirime dayalı bağlamalardan farklı olarak, zorunlu bir bağlama deseninin kullanılmasını sağlayabilirsiniz. Bağlama parametrelerinin tasarım zamanı yerine çalışma zamanında hesaplanması gerektiğinde, kesinlik temelli bağlama kullanışlıdır. Bu düzende, işlev kodunuzda, desteklenen giriş ve çıkış bağlamalarına bağlanabilirsiniz.

Zorunlu bir bağlamayı aşağıdaki gibi tanımlayın:

  • İstediğiniz kesinlik bağlamalarınız için işlev imzasına bir öznitelik eklemeyin.

  • Bir giriş parametresi veya olarak Binder binder geçirin IBinder binder .

  • Veri bağlamayı gerçekleştirmek için aşağıdaki C# stilini kullanın.

    using (var output = await binder.BindAsync<T>(new BindingTypeAttribute(...)))
    {
        ...
    }
    

    BindingTypeAttribute , bağlamalarınızı tanımlayan .NET özniteliğidir ve T Bu bağlama türü tarafından desteklenen bir giriş veya çıkış türüdür. T bir out parametre türü (gibi out JObject ) olamaz. Örneğin, Mobile Apps tablo çıkış bağlaması altı çıkış türünüdestekler, ancak yalnızca ICollector <T> veya ıasynccollector <T> öğesini kesinlik ile kullanabilirsiniz.

Tek öznitelik örneği

Aşağıdaki örnek kod, Depolama zamanda tanımlanan blob yolu ile bir blob çı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!");
        };
    }
}

BlobAttribute, blob Depolama veya çıkış bağlamasını tanımlar ve TextWriter desteklenen bir çıkış bağlama türü olur.

Birden çok öznitelik örneği

Yukarıdaki örnek, işlev uygulamasının ana uygulama hesabı Depolama (yani ) için uygulama ayarını AzureWebJobsStorage alır. StorageAccountAttribute ekleyerek ve öznitelik dizisini içine Depolama hesabı için kullanmak üzere özel bir uygulama ayarı BindAsync<T>() belirtebilirsiniz. değil, Binder parametresini IBinder kullanın. Örnek:

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, çalışma zamanının ana sürümlerinde desteklenen bağlamalar Azure İşlevleri gösterir:

Tür 1.x 2.x ve daha yüksek1 Tetikleyici Girdi Çıktı
Blob depolama
Azure Cosmos DB
Azure SQL (önizleme)
Dapr3
Event Grid
Event Hubs
HTTP & web kancaları
IoT Hub’ı
Kafka2
Mobile Apps
Notification Hubs
Kuyruk depolama
RabbitMQ2
SendGrid
Service Bus
SignalR
Tablo depolama
Zamanlayıcı
Twilio

1 Sürüm 2.x çalışma zamanından başlayarak HTTP ve Zamanlayıcı dışındaki tüm bağlamaların kayıtlı olması gerekir. Bkz. Bağlama uzantılarını kaydetme.

2 Tetikleyiciler Tüketim planında desteklenmiyor. Çalışma zamanı odaklı tetikleyiciler gerektirir.

3 Yalnızca Kubernetes, IoT Edge ve diğer kendi kendine barındırılan modlarda destekler.

Sonraki adımlar