Aracılığıyla paylaş


Azure İşlevleri C# betiği (.csx) geliştirici başvurusu

Bu makale, C# betiği (.csx) kullanarak Azure İşlevleri geliştirmeye giriş niteliğindedir.

Önemli

C# betiği öncelikle C# işlevlerini oluşturmaya ve çalıştırmaya hızlı bir şekilde başlamanıza yardımcı olacak kullanışlı bir portal içi deneyim sağlamak için desteklenir. Üretim kalitesinde uygulamalar için bunun yerine C# işlevlerinizi derlenmiş bir C# sınıf kitaplığı projesi olarak yerel olarak geliştirmeniz gerekir. C# betik projesini C# sınıf kitaplığı (yalıtılmış çalışan) projesine geçirmeyi öğrenmek için bkz . C# betik uygulamasını C# projesine dönüştürme.

Azure İşlevleri, aşağıdaki yollardan biriyle C# kullanarak işlevler geliştirmenizi sağlar:

Tür Yürütme işlemi Kod uzantısı Geliştirme ortamı Başvuru
C# betiği işlem halinde .csx Portal
Temel Araçlar
Bu makale
C# sınıf kitaplığı (yalıtılmış çalışan) yalıtılmış çalışan işlemi .cs Visual Studio
Visual Studio Code
Temel Araçlar
.NET yalıtılmış çalışan işlemi işlevleri
C# sınıf kitaplığı (işlem içi) işlem halinde .cs Visual Studio
Visual Studio Code
Temel Araçlar
İşlem içi C# sınıf kitaplığı işlevleri

.csx nasıl çalışır?

Veri, yöntem bağımsız değişkenleri aracılığıyla C# işlevinize akar. Bağımsız değişken adları bir function.json dosyada belirtilir ve işlev günlükçü ve iptal belirteçleri gibi öğelere erişmek için önceden tanımlanmış adlar vardır.

.csx biçimi daha az "ortak" yazmanızı ve yalnızca bir C# işlevi yazmaya odaklanmanızı sağlar. Her şeyi bir ad alanı ve sınıf içinde sarmalamak yerine bir Run yöntem tanımlamanız gerekir. Her zamanki gibi dosyanın başına tüm derleme başvurularını ve ad alanlarını ekleyin.

Bir işlev uygulamasının .csx dosyaları, bir örnek başlatıldığında derlenir. Bu derleme adımı, C# sınıf kitaplıklarına kıyasla C# betik işlevleri için soğuk başlangıç gibi şeylerin daha uzun sürebileceği anlamına gelir. Bu derleme adımı ayrıca C# betik işlevlerinin Azure portalında düzenlenebilir olmasının nedenidir ancak C# sınıf kitaplıkları düzenlenemez.

Klasör yapısı

C# betik projesinin klasör yapısı aşağıdaki örneğe benzer:

FunctionsProject
 | - MyFirstFunction
 | | - run.csx
 | | - function.json
 | | - function.proj
 | - MySecondFunction
 | | - run.csx
 | | - function.json
 | | - function.proj
 | - host.json
 | - extensions.csproj
 | - bin

İşlev uygulamasını yapılandırmak için kullanılabilecek paylaşılan bir host.json dosyası vardır. Her işlevin kendi kod dosyası (.csx) ve bağlama yapılandırma dosyası (function.json) vardır.

İşlevler çalışma zamanının 2.x ve sonraki sürümlerinde gerekli bağlama uzantıları, klasöründeki gerçek kitaplık dosyalarıyla birlikte dosyada bin tanımlanırextensions.csproj. Yerel olarak geliştirirken bağlama uzantılarını kaydetmeniz gerekir. Azure portalında işlevler geliştirirken bu kayıt sizin için yapılır.

Bağımsız değişkenlere bağlama

Giriş veya çıkış verileri, function.json yapılandırma dosyasındaki name özelliği aracılığıyla bir C# betik işlevi parametresine bağlıdır. Aşağıdaki örnekte kuyrukla tetiklenen bir işlev için function.json dosyası ve run.csx dosyası gösterilmektedir. Özelliğin değeri olduğundan, kuyruk iletisinden veri alan parametrenin name adı myQueueItem verilmiştir.

{
    "disabled": false,
    "bindings": [
        {
            "type": "queueTrigger",
            "direction": "in",
            "name": "myQueueItem",
            "queueName": "myqueue-items",
            "connection":"MyStorageConnectionAppSetting"
        }
    ]
}
#r "Microsoft.WindowsAzure.Storage"

using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;

public static void Run(CloudQueueMessage myQueueItem, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem.AsString}");
}

Açıklama#r, bu makalenin ilerleyen bölümlerinde açıklanmıştır.

Bağlamalar için desteklenen türler

Her bağlamanın kendi desteklenen türleri vardır; örneğin, bir blob tetikleyicisi dize parametresi, POCO parametresi, CloudBlockBlob parametre veya desteklenen diğer çeşitli türlerden herhangi biriyle kullanılabilir. Blob bağlamaları için bağlama başvuru makalesi, blob tetikleyicileri için 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şvuru belgeleri.

İpucu

HTTP veya Web Kancası bağlamalarını kullanmayı planlıyorsanız, yanlış ö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.

Özel sınıflara başvurma

Özel bir Düz Eski CLR Nesnesi (POCO) sınıfı kullanmanız gerekiyorsa, sınıf tanımını aynı dosyanın içine ekleyebilir veya ayrı bir dosyaya yerleştirebilirsiniz.

Aşağıdaki örnekte POCO sınıf tanımı içeren bir run.csx örneği gösterilmektedir.

public static void Run(string myBlob, out MyClass myQueueItem)
{
    log.Verbose($"C# Blob trigger function processed: {myBlob}");
    myQueueItem = new MyClass() { Id = "myid" };
}

public class MyClass
{
    public string Id { get; set; }
}

POCO sınıfı, her özellik için tanımlanmış bir getter ve ayarlayıcıya sahip olmalıdır.

.csx kodunu yeniden kullanıyor

Run.csx dosyanızdaki diğer .csx dosyalarında tanımlanan sınıfları ve yöntemleri kullanabilirsiniz. Bunu yapmak için run.csx dosyanızdaki yönergeleri kullanın#load. Aşağıdaki örnekte adlı MyLogger günlük yordamı myLogger.csx dosyasında paylaşılır ve yönergesi #load kullanılarak run.csx dosyasına yüklenir:

Örnek run.csx:

#load "mylogger.csx"

using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"Log by run.csx: {DateTime.Now}");
    MyLogger(log, $"Log by MyLogger: {DateTime.Now}");
}

Örnek mylogger.csx:

public static void MyLogger(ILogger log, string logtext)
{
    log.LogInformation(logtext);
}

PoCO nesnesi kullanarak işlevler arasında geçirilen verileri güçlü bir şekilde yazmak istediğinizde paylaşılan bir .csx dosyası kullanmak yaygın bir desendir. Aşağıdaki basitleştirilmiş örnekte, http tetikleyicisi ve kuyruk tetikleyicisi, sipariş verilerini kesin olarak yazmak için adlı Order bir POCO nesnesini paylaşır:

HTTP tetikleyicisi için örnek run.csx:

#load "..\shared\order.csx"

using System.Net;
using Microsoft.Extensions.Logging;

public static async Task<HttpResponseMessage> Run(Order req, IAsyncCollector<Order> outputQueueItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function received an order.");
    log.LogInformation(req.ToString());
    log.LogInformation("Submitting to processing queue.");

    if (req.orderId == null)
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
    else
    {
        await outputQueueItem.AddAsync(req);
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
}

Kuyruk tetikleyicisi için örnek run.csx :

#load "..\shared\order.csx"

using System;
using Microsoft.Extensions.Logging;

public static void Run(Order myQueueItem, out Order outputQueueItem, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed order...");
    log.LogInformation(myQueueItem.ToString());

    outputQueueItem = myQueueItem;
}

Örnek order.csx:

public class Order
{
    public string orderId {get; set; }
    public string custName {get; set;}
    public string custAddress {get; set;}
    public string custEmail {get; set;}
    public string cartId {get; set; }

    public override String ToString()
    {
        return "\n{\n\torderId : " + orderId +
                  "\n\tcustName : " + custName +
                  "\n\tcustAddress : " + custAddress +
                  "\n\tcustEmail : " + custEmail +
                  "\n\tcartId : " + cartId + "\n}";
    }
}

Yönergesi ile #load göreli bir yol kullanabilirsiniz:

  • #load "mylogger.csx" işlev klasöründe bulunan bir dosyayı yükler.
  • #load "loadedfiles\mylogger.csx" işlev klasöründeki bir klasörde bulunan bir dosyayı yükler.
  • #load "..\shared\mylogger.csx", işlev klasörüyle aynı düzeydeki bir klasörde bulunan bir dosyayı, yani doğrudan wwwroot altında yükler.

yönergesi#load, .cs dosyalarıyla değil yalnızca .csx dosyalarıyla çalışır.

Yöntem dönüş değerine bağlama

function.json adını $return kullanarak bir çıkış bağlaması için yöntem dönüş değeri kullanabilirsiniz.

{
    "name": "$return",
    "type": "blob",
    "direction": "out",
    "path": "output-container/{id}"
}

Dönüş değerini kullanan C# betik kodu aşağıda verilmiştir ve ardından zaman uyumsuz bir örnek verilmiştir:

public static string Run(WorkItem input, ILogger log)
{
    string json = string.Format("{{ \"id\": \"{0}\" }}", input.Id);
    log.LogInformation($"C# script processed queue message. Item={json}");
    return json;
}
public static Task<string> Run(WorkItem input, ILogger log)
{
    string json = string.Format("{{ \"id\": \"{0}\" }}", input.Id);
    log.LogInformation($"C# script processed queue message. Item={json}");
    return Task.FromResult(json);
}

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

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ı çıktı bağlamasına herhangi bir şey geçirilmediyse veya IAsyncCollector türlerini kullanınICollector. Bu türler, yöntem tamamlandığında çıkış bağlamasına yazılan salt yazma koleksiyonlarıdır.

Bu örnek kullanarak ICollectoraynı kuyruğa birden çok kuyruk iletisi yazar:

public static void Run(ICollector<string> myQueue, ILogger log)
{
    myQueue.Add("Hello");
    myQueue.Add("World!");
}

Günlük Kaydı

Çıktıyı C# dilinde akış günlüklerinize kaydetmek için ILogger türünde bir bağımsız değişken ekleyin. adını kullanmanızı logöneririz. Azure İşlevleri kullanmaktan Console.Write kaçının.

public static void Run(string myBlob, ILogger log)
{
    log.LogInformation($"C# Blob trigger function processed: {myBlob}");
}

Not

yerine TraceWriterkullanabileceğiniz daha yeni bir günlük çerçevesi hakkında bilgi için .NET sınıf kitaplığı geliştirici kılavuzundaki ILogger belgelerine bakın.

Özel ölçüm günlüğü

Application Insights'ta LogMetric özel ölçümler oluşturmak için uzantısı ILogger yöntemini kullanabilirsiniz. Aşağıda örnek bir yöntem çağrısı verilmişti:

logger.LogMetric("TestMetric", 1234);

Bu kod, .NET için Application Insights API'sini kullanarak çağırmaya TrackMetric alternatiftir.

Zaman Uyumsuz

bir işlevi zaman uyumsuz hale getirmek için anahtar sözcüğünü async kullanın ve bir Task nesne döndürin.

public async static Task ProcessQueueMessageAsync(
        string blobName,
        Stream blobInput,
        Stream blobOutput)
{
    await blobInput.CopyToAsync(blobOutput, 4096);
}

Zaman uyumsuz işlevlerde parametreleri kullanamazsınız out . Çı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.

Aşağıdaki örnekte, yaklaşan işlev sonlandırmanın nasıl denetlenmesi gösterilmektedir.

using System;
using System.IO;
using System.Threading;

public static void Run(
    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);
    }
}

Ad alanlarını içeri aktarma

Ad alanlarını içeri aktarmanız gerekiyorsa, bunu yan tümcesiyle using her zamanki gibi yapabilirsiniz.

using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)

Aşağıdaki ad alanları otomatik olarak içeri aktarılır ve bu nedenle isteğe bağlıdır:

  • System
  • System.Collections.Generic
  • System.IO
  • System.Linq
  • System.Net.Http
  • System.Threading.Tasks
  • Microsoft.Azure.WebJobs
  • Microsoft.Azure.WebJobs.Host

Dış derlemelere başvurma

Çerçeve derlemeleri için yönergesini #r "AssemblyName" kullanarak başvurular ekleyin.

#r "System.Web.Http"

using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)

Aşağıdaki derlemeler Azure İşlevleri barındırma ortamı tarafından otomatik olarak eklenir:

  • mscorlib
  • System
  • System.Core
  • System.Xml
  • System.Net.Http
  • Microsoft.Azure.WebJobs
  • Microsoft.Azure.WebJobs.Host
  • Microsoft.Azure.WebJobs.Extensions
  • System.Web.Http
  • System.Net.Http.Formatting

Aşağıdaki derlemelere çalışma zamanı sürümüne göre basit adla başvurulabilir:

  • Newtonsoft.Json
  • Microsoft.WindowsAzure.Storage*

*Çalışma zamanının 4.x sürümünde kaldırıldı.

Kodda derlemelere aşağıdaki örnekte olduğu gibi başvurulur:

#r "AssemblyName"

Özel derlemelere başvurma

Özel bir derlemeye başvurmak için paylaşılan derleme veya özel derleme kullanabilirsiniz:

  • Paylaşılan derlemeler, bir işlev uygulamasındaki tüm işlevler arasında paylaşılır. Özel bir derlemeye başvurmak için, derlemeyi işlev uygulamanızın kök klasöründe (wwwroot) adlı bin bir klasöre yükleyin.

  • Özel derlemeler belirli bir işlevin bağlamının bir parçasıdır ve farklı sürümlerin dışarıdan yüklenmesini destekler. Özel derlemeler işlev dizinindeki bir bin klasöre yüklenmelidir. Gibi #r "MyAssembly.dll"dosya adını kullanarak derlemelere başvurun.

İşlev klasörünüze dosya yükleme hakkında bilgi için paket yönetimi bölümüne bakın.

İzlenen dizinler

İşlev betiği dosyasını içeren dizin, derlemelerde yapılan değişiklikler için otomatik olarak izleniyor. Diğer dizinlerdeki derleme değişikliklerini izlemek için bunları watchDirectories host.json'daki listeye ekleyin.

NuGet paketlerini kullanma

İşlev uygulamanıza hem bağlama uzantısı paketlerinin hem de diğer NuGet paketlerinin eklenmesi, İşlevler çalışma zamanının hedeflenen sürümüne bağlıdır.

Varsayılan olarak, desteklenen İşlevler uzantısı NuGet paketleri kümesi, uzantı paketleri kullanılarak C# betik işlev uygulamanızın kullanımına sunulur. Daha fazla bilgi için bkz . Uzantı paketleri.

Bir nedenle projenizde uzantı paketlerini kullanamıyorsanız, uygulamanızdaki function.json dosyalarında tanımlanan bağlamaları temel alan uzantıları yüklemek için Azure İşlevleri Core Tools'u da kullanabilirsiniz. Uzantıları kaydetmek için Core Tools kullanırken seçeneğini kullandığınızdan --csx emin olun. Daha fazla bilgi edinmek için bkz . func uzantıları yükleme.

Varsayılan olarak, Core Tools function.json dosyalarını okur ve gerekli paketleri işlev uygulamasının dosya sisteminin (wwwroot) kökündeki extensions.csproj C# sınıf kitaplığı proje dosyasına ekler. Çekirdek Araçlar dotnet.exe kullandığından, bu uzantılar dosyasına herhangi bir NuGet paket başvurusu eklemek için bunu kullanabilirsiniz. Yükleme sırasında Core Tools, gerekli kitaplıkları yüklemek için extensions.csproj'u oluşturur. Microsoft.ProjectOxford.Face sürüm 1.1.0'a başvuru ekleyen örnek bir extensions.csproj dosyası aşağıda verilmiştir:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.ProjectOxford.Face" Version="1.1.0" />
    </ItemGroup>
</Project>

Not

C# betiği (.csx) için değerine netstandard2.0ayarlamanız TargetFramework gerekir. gibi net6.0diğer hedef çerçeveler desteklenmez.

Özel bir NuGet akışı kullanmak için akışı işlev uygulaması kök klasöründeki bir Nuget.Config dosyasında belirtin. Daha fazla bilgi için bkz . NuGet davranışını yapılandırma.

Projeniz üzerinde yalnızca portalda çalışıyorsanız extensions.csproj dosyasını veya nuget.Config dosyasını doğrudan sitede el ile oluşturmanız gerekir. Daha fazla bilgi edinmek için bkz . Uzantıları el ile yükleme.

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 void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
    log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
    log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}

public static string GetEnvironmentVariable(string name)
{
    return name + ": " +
        System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}

İlkeleri yeniden deneme

İşlevler iki yerleşik yeniden deneme ilkesi destekler. Daha fazla bilgi için bkz . İlkeleri yeniden deneme.

function.json dosyasında yeniden deneme ilkesi aşağıdadır:

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}
function.json özelliği Açıklama
strateji fixedDelay adresini kullanın.
maxRetryCount Gerekli. İşlev yürütme başına izin verilen en fazla yeniden deneme sayısı. -1 süresiz olarak yeniden deneme anlamına gelir.
delayInterval Yeniden denemeler arasında kullanılan gecikme. biçiminde HH:mm:ssbir dize olarak belirtin.

Çalışma zamanında bağlama

C# ve diğer .NET dillerinde, function.json bildirim temelli bağlamaların aksine kesinlik temelli 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 function.json bir girdi eklemeyin.
  • Bir giriş parametresi Binder binder veya IBinder 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(...)))
{
    ...
}

BindingTypeAttribute bağlamanı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ü (örneğin out JObject) olamaz. Örneğin, Mobile Apps tablosu çıkış bağlaması altı çıkış türünü destekler, ancak yalnızca ICollector<T> veya IAsyncCollector<T> için Tkullanabilirsiniz.

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.

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    using (var writer = await binder.BindAsync<TextWriter>(new BlobAttribute("samples-output/path")))
    {
        writer.Write("Hello World!!");
    }
}

BlobAttribute, Depolama 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 (yaniAzureWebJobsStorage) için uygulama ayarını alır. StorageAccountAttribute öğesini ekleyerek ve öznitelik dizisini içine BindAsync<T>()geçirerek Depolama hesabı için kullanılacak özel bir uygulama ayarı belirtebilirsiniz. Binder parametresini değilIBinder, parametresini kullanın. Örneğin:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    var attributes = new Attribute[]
    {
        new BlobAttribute("samples-output/path"),
        new StorageAccountAttribute("MyStorageAccount")
    };

    using (var writer = await binder.BindAsync<TextWriter>(attributes))
    {
        writer.Write("Hello World!");
    }
}

Aşağıdaki tabloda her bağlama türü için .NET öznitelikleri ve tanımlandığı paketler listelanmaktadır.

Bağlama Öznitelik Başvuru ekleme
Azure Cosmos DB Microsoft.Azure.WebJobs.DocumentDBAttribute #r "Microsoft.Azure.WebJobs.Extensions.CosmosDB"
Event Hubs Microsoft.Azure.WebJobs.ServiceBus.EventHubAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.Jobs.ServiceBus"
Mobile Apps Microsoft.Azure.WebJobs.MobileTableAttribute #r "Microsoft.Azure.WebJobs.Extensions.MobileApps"
Notification Hubs Microsoft.Azure.WebJobs.NotificationHubAttribute #r "Microsoft.Azure.WebJobs.Extensions.NotificationHubs"
Service Bus Microsoft.Azure.WebJobs.ServiceBusAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.WebJobs.ServiceBus"
Depolama kuyruğu Microsoft.Azure.WebJobs.QueueAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Depolama blob'u Microsoft.Azure.WebJobs.BlobAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Depolama tablosu Microsoft.Azure.WebJobs.TableAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Twilio Microsoft.Azure.WebJobs.TwilioSmsAttribute #r "Microsoft.Azure.WebJobs.Extensions.Twilio"

C# betik uygulamasını C# projesine dönüştürme

C# betik işlev uygulamasını derlenmiş bir C# sınıf kitaplığı projesine dönüştürmenin en kolay yolu yeni bir projeyle başlamaktır. Ardından, her işlev için kodu ve yapılandırmayı her run.csx dosyasından ve bir işlev klasöründeki function.json dosyasından tek bir yeni .cs sınıf kitaplığı kod dosyasına geçirebilirsiniz. Örneğin, adlı HelloWorld bir C# betik işlevine sahip olduğunuzda iki dosyanız olur: HelloWorld/run.csx ve HelloWorld/function.json. Bu işlev için, yeni sınıf kitaplığı projenizde adlı HelloWorld.cs bir kod dosyası oluşturursunuz.

Portal düzenleme için C# betiği kullanıyorsanız, uygulama içeriğini yerel makinenize indirebilirsiniz. İçerik ve Visual Studio projesi yerine Site içeriği seçeneğini belirleyin. Proje oluşturmanız gerekmez ve indirmeye uygulama ayarlarını eklemeyin. Yeni bir geliştirme ortamı tanımlıyorsunuz ve bu ortamın barındırılan uygulama ortamınızla aynı izinlere sahip olmaması gerekir.

Bu yönergelerde, C# betik işlevlerinin (İşlevler konağıyla işlem içinde çalışan) yalıtılmış bir çalışan işleminde çalışan C# sınıf kitaplığı işlevlerine nasıl dönüştürüldüğü gösterilir.

  1. tercih ettiğiniz hızlı başlangıçtan İşlev uygulaması projesi oluşturma bölümünü tamamlayın:


  1. Özgün C# betik kodunuz bir dosya veya herhangi bir function.proj extensions.csproj dosya içeriyorsa, bu dosyadaki paket başvurularını kopyalayın ve İşlevler temel bağımlılıklarıyla aynı ItemGroup şekilde yeni projenin .csproj dosyasına ekleyin.

    İpucu

    Dönüştürme, bağımlılıklarınızın en son sürümlerine güncelleştirmek için iyi bir fırsat sağlar. Bunu yapmak için sonraki bir adımda ek kod değişiklikleri gerekebilir.

  2. Bölümü dışında extensionBundles özgün host.json dosyanın içeriğini yeni projenin host.json dosyasına kopyalayın (derlenmiş C# projeleri uzantı paketlerini kullanmaz ve işlevleriniz tarafından kullanılan tüm uzantılara açıkça başvuru eklemeniz gerekir). host.json dosyaları birleştirirken, çoğu uygulama sürüm 2.0 kullanarak şemanın host.json sürümlendiğini unutmayın. bölümün extensions içeriği, işlevleriniz tarafından kullanılan bağlama uzantılarının belirli sürümlerine göre farklılık gösterebilir. Belirli sürümleriniz için host.json doğru şekilde yapılandırmayı öğrenmek için tek tek uzantı başvuru makalelerine bakın.

  3. Yönerge tarafından #load başvurulan tüm paylaşılan dosyalar için, bu paylaşılan başvuruların her biri için yeni .cs bir dosya oluşturun. Paylaşılan her sınıf tanımı için yeni .cs bir dosya oluşturmak en basit işlemdir. Sınıfı olmayan statik yöntemler varsa, bu yöntemler için yeni sınıflar tanımlamanız gerekir.

  4. Özgün projenizdeki her <FUNCTION_NAME> klasör için aşağıdaki görevleri gerçekleştirin:

    1. adlı <FUNCTION_NAME>.csyeni bir dosya oluşturun ve yerine <FUNCTION_NAME> C# betik işlevinizi tanımlayan klasörün adını yazın. Tetikleyiciye özgü şablonlardan birinden aşağıdaki şekilde yeni bir işlev kodu dosyası oluşturabilirsiniz:

      func new --name <FUNCTION_NAME> komutunu kullanarak ve isteminde doğru tetikleyici şablonunu seçerek.

    2. using Dosyanızdaki run.csx deyimleri kopyalayın ve yeni dosyaya ekleyin. Herhangi bir #r yönergeye ihtiyacınız yoktur.

    3. Dosyanızdaki run.csx herhangi bir #load deyim için, paylaşılan kod için kullandığınız ad alanı için yeni using bir deyim ekleyin.

    4. Yeni dosyada, proje için kullandığınız ad alanı altında işleviniz için bir sınıf tanımlayın.

    5. veya benzeri adlı RunHandler yeni bir yöntem oluşturun. Bu yeni yöntem işlevi için yeni giriş noktası görevi görür.

    6. İşlevinizi temsil eden statik yöntemi çağıran run.csx işlevlerle birlikte yeni sınıfınıza ikinci bir yöntem olarak kopyalayın. Önceki adımda oluşturduğunuz yeni yöntemden bu statik yöntemi çağırın. Bu dolaylı adım, yükseltmeye devam ettikçe farklarda gezinmek için yararlıdır. Özgün yöntemi tam olarak aynı tutabilir ve yalnızca girişlerini yeni bağlamdan denetleyebilirsiniz. Daha sonra statik yöntem çağrısına geçirdiğiniz yeni yöntemde parametreler oluşturmanız gerekebilir. Geçişin amaçlandığı gibi çalıştığını onayladıktan sonra, bu ek dolaylılık düzeyini kaldırabilirsiniz.

    7. Dosyadaki function.json her bağlama için ilgili özniteliği yeni yönteminize ekleyin. Bağlama örneklerini hızla bulmak için bkz . Örneklere göre bağlamaları el ile ekleme.

    8. Henüz yapmadıysanız bağlamaların gerektirdiği uzantı paketlerini projenize ekleyin.

  5. uygulamanızın gerektirdiği tüm uygulama ayarlarını local.settings.json dosyasının koleksiyonunda Values yeniden oluşturun.

  6. Projenizin yerel olarak çalıştığını doğrulayın:

    Uygulamanızı komut satırından çalıştırmak için kullanın func start . Daha fazla bilgi için bkz . İşlevleri yerel olarak çalıştırma.

  7. Projenizi Azure'da yeni bir işlev uygulamasında yayımlama:

    Komutunu kullanarak Azure kaynaklarınızı oluşturun ve kod projesini Azure'a dağıtın func azure functionapp publish <APP_NAME> . Daha fazla bilgi için bkz . Proje dosyalarını dağıtma.

Örnek işlev dönüştürme

Bu bölümde tek bir işlev için geçiş örneği gösterilmektedir.

C# betiğindeki özgün işlevin iki dosyası vardır:

  • HelloWorld/function.json
  • HelloWorld/run.csx

İçeriği HelloWorld/function.json şunlardır:

{
  "bindings": [
    {
      "authLevel": "FUNCTION",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    }
  ]
}

İçeriği HelloWorld/run.csx şunlardır:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    string responseMessage = string.IsNullOrEmpty(name)
        ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                : $"Hello, {name}. This HTTP triggered function executed successfully.";

            return new OkObjectResult(responseMessage);
}

ASP.NET Core tümleştirmesi ile yalıtılmış çalışan modeline geçirildikten sonra bunlar tek HelloWorld.csbir ile değiştirilir:

using System.Net;
using Microsoft.Azure.Functions.Worker;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

namespace MyFunctionApp
{
    public class HelloWorld
    {
        private readonly ILogger _logger;

        public HelloWorld(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<HelloWorld>();
        }

        [Function("HelloWorld")]
        public async Task<IActionResult> RunHandler([HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req)
        {
            return await Run(req, _logger);
        }

        // From run.csx
        public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            string responseMessage = string.IsNullOrEmpty(name)
                ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                        : $"Hello, {name}. This HTTP triggered function executed successfully.";

            return new OkObjectResult(responseMessage);
        }
    }
}

Yapılandırmayı ve örnekleri bağlama

Bu bölüm, C# betiğinde tetikleyicileri ve bağlamaları tanımlamaya yönelik başvurular ve örnekler içerir.

Blob tetikleyicisi

Aşağıdaki tabloda, function.json dosyasında ayarladığınız C# betiğinin bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır blobTrigger. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
direction olarak ayarlanmalıdır in. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
ad İşlev kodundaki blobu temsil eden değişkenin adı.
yol İzlenecek kapsayıcı . Blob adı deseni olabilir.
bağlantı Azure Bloblarına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Aşağıdaki örnekte, bağlamayı kullanan bir function.json dosyasında ve kodunda blob tetikleyici tanımı gösterilmektedir. İşlev, kapsayıcıya bir blob eklendiğinde veya güncelleştirildiğinde samples-workitems bir günlük yazar.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "disabled": false,
    "bindings": [
        {
            "name": "myBlob",
            "type": "blobTrigger",
            "direction": "in",
            "path": "samples-workitems/{name}",
            "connection":"MyStorageAccountAppSetting"
        }
    ]
}

Blob tetikleyici yolundaki samples-workitems/{name} dize{name}, tetikleyici blobun dosya adına erişmek için işlev kodunda kullanabileceğiniz bir bağlama ifadesi oluşturur. Daha fazla bilgi için bkz . Blob adı desenleri.

bir 'e Streambağlanan C# betik kodu aşağıdadır:

public static void Run(Stream myBlob, string name, ILogger log)
{
   log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}

bir 'e CloudBlockBlobbağlanan C# betik kodu aşağıdadır:

#r "Microsoft.WindowsAzure.Storage"

using Microsoft.WindowsAzure.Storage.Blob;

public static void Run(CloudBlockBlob myBlob, string name, ILogger log)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name}\nURI:{myBlob.StorageUri}");
}

Blob girişi

Aşağıdaki tabloda, function.json dosyasında ayarladığınız C# betiğinin bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır blob.
direction olarak ayarlanmalıdır in.
ad İşlev kodundaki blobu temsil eden değişkenin adı.
yol Blob yolu.
bağlantı Azure Bloblarına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Aşağıdaki örnek, function.json dosyasındaki blob giriş ve çıkış bağlamalarını ve bağlamaları kullanan C# betik kodunu gösterir. işlevi bir metin blobunun kopyasını oluşturur. İşlev, kopyalanacak blobun adını içeren bir kuyruk iletisiyle tetikleniyor. Yeni blob {originalblobname}-Copy olarak adlandırılır.

function.json dosyasında meta veri özelliği, queueTrigger özelliklerde path blob adını belirtmek için kullanılır:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

public static void Run(string myQueueItem, string myInputBlob, out string myOutputBlob, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    myOutputBlob = myInputBlob;
}

Blob çıkışı

Aşağıdaki tabloda, function.json dosyasında ayarladığınız C# betiğinin bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır blob.
direction olarak ayarlanmalıdır out.
ad İşlev kodundaki blobu temsil eden değişkenin adı.
yol Blob yolu.
bağlantı Azure Bloblarına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Aşağıdaki örnek, function.json dosyasındaki blob giriş ve çıkış bağlamalarını ve bağlamaları kullanan C# betik kodunu gösterir. işlevi bir metin blobunun kopyasını oluşturur. İşlev, kopyalanacak blobun adını içeren bir kuyruk iletisiyle tetikleniyor. Yeni blob {originalblobname}-Copy olarak adlandırılır.

function.json dosyasında meta veri özelliği, queueTrigger özelliklerde path blob adını belirtmek için kullanılır:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

public static void Run(string myQueueItem, string myInputBlob, out string myOutputBlob, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    myOutputBlob = myInputBlob;
}

RabbitMQ tetikleyicisi

Aşağıdaki örnekte, bir function.json dosyasındaki RabbitMQ tetikleyici bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev RabbitMQ iletisini okur ve günlüğe kaydeder.

function.json dosyasındaki bağlama verileri aşağıdadır:

{​​
    "bindings": [
        {​​
            "name": "myQueueItem",
            "type": "rabbitMQTrigger",
            "direction": "in",
            "queueName": "queue",
            "connectionStringSetting": "rabbitMQConnectionAppSetting"
        }​​
    ]
}​​

C# betik kodu aşağıdadır:

using System;

public static void Run(string myQueueItem, ILogger log)
{​​
    log.LogInformation($"C# Script RabbitMQ trigger function processed: {​​myQueueItem}​​");
}​​

Kuyruk tetikleyicisi

Aşağıdaki tabloda, function.json dosyasında ayarladığınız C# betiğinin bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır queueTrigger. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
direction Yalnızca function.json dosyasında. olarak ayarlanmalıdır in. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
ad İşlev kodundaki kuyruk öğesi yükünü içeren değişkenin adı.
queueName Yoklama kuyruğunun adı.
bağlantı Azure Kuyruklarına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Aşağıdaki örnekte, function.json dosyasındaki bir kuyruk tetikleyicisi bağlaması ve bağlamayı kullanan C# betik kodu gösterilmektedir. İşlev kuyruğu yoklar myqueue-items ve bir kuyruk öğesi her işlendiğinde bir günlük yazar.

İşte function.json dosyası:

{
    "disabled": false,
    "bindings": [
        {
            "type": "queueTrigger",
            "direction": "in",
            "name": "myQueueItem",
            "queueName": "myqueue-items",
            "connection":"MyStorageConnectionAppSetting"
        }
    ]
}

C# betik kodu aşağıdadır:

#r "Microsoft.WindowsAzure.Storage"

using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;

public static void Run(CloudQueueMessage myQueueItem, 
    DateTimeOffset expirationTime, 
    DateTimeOffset insertionTime, 
    DateTimeOffset nextVisibleTime,
    string queueTrigger,
    string id,
    string popReceipt,
    int dequeueCount,
    ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem.AsString}\n" +
        $"queueTrigger={queueTrigger}\n" +
        $"expirationTime={expirationTime}\n" +
        $"insertionTime={insertionTime}\n" +
        $"nextVisibleTime={nextVisibleTime}\n" +
        $"id={id}\n" +
        $"popReceipt={popReceipt}\n" + 
        $"dequeueCount={dequeueCount}");
}

Kuyruk çıkışı

Aşağıdaki tabloda, function.json dosyasında ayarladığınız C# betiğinin bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır queue. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
direction olarak ayarlanmalıdır out. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
ad İşlev kodundaki kuyruğu temsil eden değişkenin adı. İşlev dönüş değerine başvurmak $return için olarak ayarlayın.
queueName Kuyruğun adı.
bağlantı Azure Kuyruklarına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Aşağıdaki örnekte, function.json dosyasında http tetikleyici bağlaması ve bağlamayı kullanan C# betik kodu gösterilmektedir. İşlev, alınan her HTTP isteği için CustomQueueMessage nesne yüküne sahip bir kuyruk öğesi oluşturur.

İşte function.json dosyası:

{
  "bindings": [
    {
      "type": "httpTrigger",
      "direction": "in",
      "authLevel": "function",
      "name": "input"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "$return",
      "queueName": "outqueue",
      "connection": "MyStorageConnectionAppSetting"
    }
  ]
}

Tek bir kuyruk iletisi oluşturan C# betik kodu aşağıdadır:

public class CustomQueueMessage
{
    public string PersonName { get; set; }
    public string Title { get; set; }
}

public static CustomQueueMessage Run(CustomQueueMessage input, ILogger log)
{
    return input;
}

Bir veya IAsyncCollector parametresini kullanarak ICollector aynı anda birden çok ileti gönderebilirsiniz. Biri HTTP isteği verileri ve biri sabit kodlanmış değerler içeren birden çok ileti gönderen C# betik kodu aşağıdadır:

public static void Run(
    CustomQueueMessage input, 
    ICollector<CustomQueueMessage> myQueueItems, 
    ILogger log)
{
    myQueueItems.Add(input);
    myQueueItems.Add(new CustomQueueMessage { PersonName = "You", Title = "None" });
}

Tablo girişi

Bu bölümde yalnızca uzantının Tablolar API'sinin sürümüne yönelik destek özetlenmiştir.

Aşağıdaki tabloda, function.json dosyasında ayarladığınız C# betiğinin bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır table. Bağlamayı Azure portalında oluşturduğunuzda bu özellik otomatik olarak ayarlanır.
direction olarak ayarlanmalıdır in. Bağlamayı Azure portalında oluşturduğunuzda bu özellik otomatik olarak ayarlanır.
ad İşlev kodundaki tabloyu veya varlığı temsil eden değişkenin adı.
tableName Tablonun adı.
partitionKey isteğe bağlı. Okunacak tablo varlığının bölüm anahtarı.
rowKey isteğe bağlı. Okunacak tablo varlığının satır anahtarı. veya filterile take kullanılamaz.
almak isteğe bağlı. Döndürülecek varlık sayısı üst sınırı. ile rowKeykullanılamaz.
filter isteğe bağlı. Tablodan döndürülecek varlıklar için bir OData filtre ifadesi. ile rowKeykullanılamaz.
bağlantı Tablo hizmetine nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Aşağıdaki örnekte, function.json dosyasındaki bir tablo giriş bağlaması ve bağlamayı kullanan C# betik kodu gösterilmektedir. İşlev, tek bir tablo satırını okumak için kuyruk tetikleyicisi kullanır.

function.json dosyası bir partitionKey ve rowKeybelirtir. rowKey değeri{queueTrigger}, satır anahtarının kuyruk ileti dizesinden geldiğini gösterir.

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "personEntity",
      "type": "table",
      "tableName": "Person",
      "partitionKey": "Test",
      "rowKey": "{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

#r "Azure.Data.Tables"
using Microsoft.Extensions.Logging;
using Azure.Data.Tables;

public static void Run(string myQueueItem, Person personEntity, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    log.LogInformation($"Name in Person entity: {personEntity.Name}");
}

public class Person : ITableEntity
{
    public string Name { get; set; }

    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }
}

Tablo çıkışı

Bu bölümde yalnızca uzantının Tablolar API'sinin sürümüne yönelik destek özetlenmiştir.

Aşağıdaki tabloda, function.json dosyasında ayarladığınız C# betiğinin bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır table. Bağlamayı Azure portalında oluşturduğunuzda bu özellik otomatik olarak ayarlanır.
direction olarak ayarlanmalıdır out. Bağlamayı Azure portalında oluşturduğunuzda bu özellik otomatik olarak ayarlanır.
ad Tablo veya varlığı temsil eden işlev kodunda kullanılan değişken adı. İşlev dönüş değerine başvurmak $return için olarak ayarlayın.
tableName Yazıldığı tablonun adı.
partitionKey Yazacak tablo varlığının bölüm anahtarı.
rowKey Yazacak tablo varlığının satır anahtarı.
bağlantı Tablo hizmetine nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Aşağıdaki örnekte, function.json dosyasındaki bir tablo çıkış bağlaması ve bağlamayı kullanan C# betik kodu gösterilmektedir. işlevi birden çok tablo varlığı yazar.

İşte function.json dosyası:

{
  "bindings": [
    {
      "name": "input",
      "type": "manualTrigger",
      "direction": "in"
    },
    {
      "tableName": "Person",
      "connection": "MyStorageConnectionAppSetting",
      "name": "tableBinding",
      "type": "table",
      "direction": "out"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

public static void Run(string input, ICollector<Person> tableBinding, ILogger log)
{
    for (int i = 1; i < 10; i++)
        {
            log.LogInformation($"Adding Person entity {i}");
            tableBinding.Add(
                new Person() { 
                    PartitionKey = "Test", 
                    RowKey = i.ToString(), 
                    Name = "Name" + i.ToString() }
                );
        }

}

public class Person
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Name { get; set; }
}

Süreölçer tetikleyicisi

Aşağıdaki tabloda, function.json dosyasında ayarladığınız C# betiğinin bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır timerTrigger. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
direction olarak ayarlanmalıdır in. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
ad İşlev kodundaki zamanlayıcı nesnesini temsil eden değişkenin adı.
schedule CRON ifadesi veya TimeSpan değeri. yalnızca TimeSpan App Service Planı üzerinde çalışan bir işlev uygulaması için kullanılabilir. Zamanlama ifadesini bir uygulama ayarına ekleyebilir ve bu özelliği şu örnekte olduğu gibi işaretlerde % sarmalanmış uygulama ayarı adı olarak ayarlayabilirsiniz: "%ScheduleAppSetting%".
runOnStartup ise true, çalışma zamanı başlatıldığında işlev çağrılır. Örneğin işlev uygulaması etkinlik dışı olması nedeniyle boşta kaldıktan sonra uyandırıldığında çalışma zamanı başlatılır. işlev değişiklikleri nedeniyle işlev uygulaması yeniden başlatıldığında ve işlev uygulamasının ölçeği genişletildiğinde. Dikkatli kullanın. runOnStartup , özellikle üretimde olarak ayarlıysa truenadiren olmalıdır.
useMonitor Zamanlamanın izlenip izlenmeyeceğini göstermek üzere true veya false olarak ayarlayın. Zamanlama izleme, işlev uygulaması örnekleri yeniden başlatıldığında bile zamanlamanın doğru bir şekilde korunmasına yardımcı olmak için zamanlama yinelemelerinde kalıcı olur. Açıkça ayarlanmazsa, varsayılan değer true 1 dakikadan büyük veya buna eşit bir yineleme aralığına sahip zamanlamalar içindir. Dakikada bir kereden fazla tetikleyen zamanlamalar için varsayılan değerdir false.

Aşağıdaki örnekte, bir function.json dosyasında zamanlayıcı tetikleyici bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, bu işlev çağrısının yanlış bir zamanlama oluşumundan kaynaklanıp kaynaklanmadığını belirten bir günlük yazar. TimerInfo nesnesi işlevine geçirilir.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "schedule": "0 */5 * * * *",
    "name": "myTimer",
    "type": "timerTrigger",
    "direction": "in"
}

C# betik kodu aşağıdadır:

public static void Run(TimerInfo myTimer, ILogger log)
{
    if (myTimer.IsPastDue)
    {
        log.LogInformation("Timer is running late!");
    }
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}" );  
}

HTTP tetikleyicisi

Aşağıdaki tabloda, function.json dosyasında ayarladığınız tetikleyici yapılandırma özellikleri açıklanmaktadır:

function.json özelliği Açıklama
type Gerekli - olarak httpTriggerayarlanmalıdır.
direction Gerekli - olarak inayarlanmalıdır.
ad Gerekli - istek veya istek gövdesi için işlev kodunda kullanılan değişken adı.
authLevel İşlevi çağırmak için istekte hangi anahtarların bulunması gerektiğini belirler. Desteklenen değerler için bkz . Yetkilendirme düzeyi.
Yöntemler İşlevin yanıt verdiği HTTP yöntemlerinin dizisi. Belirtilmezse, işlev tüm HTTP yöntemlerine yanıt verir. Bkz . HTTP uç noktasını özelleştirme.
rota İşlevinizin yanıt verdiği istek URL'lerini denetleyen rota şablonunu tanımlar. Hiçbiri sağlanmadıysa varsayılan değer olur <functionname>. Daha fazla bilgi için bkz . HTTP uç noktasını özelleştirme.
webHookType Yalnızca sürüm 1.x çalışma zamanı için desteklenir.

HTTP tetikleyicisini, belirtilen sağlayıcı için bir web kancası alıcısı olarak davranacak şekilde yapılandırılır. Desteklenen değerler için bkz . Web Kancası türü.

Aşağıdaki örnekte, bir function.json dosyasında tetikleyici bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, sorgu dizesinde veya HTTP isteğinin gövdesinde bir name parametre arar.

İşte function.json dosyası:

{
    "disabled": false,
    "bindings": [
        {
            "authLevel": "function",
            "name": "req",
            "type": "httpTrigger",
            "direction": "in",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "name": "$return",
            "type": "http",
            "direction": "out"
        }
    ]
}

C# betik kodu şu şekilde bağlanır HttpRequest:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];
    
    string requestBody = String.Empty;
    using (StreamReader streamReader =  new  StreamReader(req.Body))
    {
        requestBody = await streamReader.ReadToEndAsync();
    }
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;
    
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

yerine HttpRequestözel bir nesneye bağlayabilirsiniz. Bu nesne isteğin gövdesinden oluşturulur ve JSON olarak ayrıştırılır. Benzer şekilde, bir tür HTTP yanıt çıkış bağlamasına geçirilebilir ve bir durum koduyla 200 birlikte yanıt gövdesi olarak döndürülebilir.

using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static string Run(Person person, ILogger log)
{   
    return person.Name != null
        ? (ActionResult)new OkObjectResult($"Hello, {person.Name}")
        : new BadRequestObjectResult("Please pass an instance of Person.");
}

public class Person {
     public string Name {get; set;}
}

HTTP çıkışı

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanmaktadır.

Özellik Açıklama
type olarak ayarlanmalıdır http.
direction olarak ayarlanmalıdır out.
ad Yanıt için işlev kodunda veya $return dönüş değerini kullanmak için kullanılan değişken adı.

Event Hubs tetikleyicisi

Aşağıdaki tabloda, function.json dosyasında ayarladığınız tetikleyici yapılandırma özellikleri açıklanmaktadır:

function.json özelliği Açıklama
type olarak ayarlanmalıdır eventHubTrigger. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
direction olarak ayarlanmalıdır in. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
ad İşlev kodundaki olay öğesini temsil eden değişkenin adı.
eventHubName İşlevler 2.x ve üzeri. Olay hub'ının adı. olay hub'ı adı da bağlantı dizesi mevcut olduğunda, bu değer çalışma zamanında bu özelliği geçersiz kılar. Uygulama ayarları %eventHubName%aracılığıyla başvurulabilir. Sürüm 1.x'te bu özellik olarak adlandırılır path.
consumerGroup Hub'daki olaylara abone olmak için kullanılan tüketici grubunu ayarlayan isteğe bağlı bir özellik. Atlanırsa, $Default tüketici grubu kullanılır.
bağlantı Event Hubs'a nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.

Aşağıdaki örnekte, bir function.json dosyasında Event Hubs tetikleyici bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, Event Hubs tetikleyicisinin ileti gövdesini günlüğe kaydeder.

Aşağıdaki örneklerde , İşlevler çalışma zamanı sürüm 2.x ve sonraki sürümleri için function.json dosyasında Event Hubs bağlama verileri gösterilmektedir.

{
  "type": "eventHubTrigger",
  "name": "myEventHubMessage",
  "direction": "in",
  "eventHubName": "MyEventHub",
  "connection": "myEventHubReadConnectionAppSetting"
}

C# betik kodu aşağıdadır:

using System;

public static void Run(string myEventHubMessage, TraceWriter log)
{
    log.Info($"C# function triggered to process a message: {myEventHubMessage}");
}

İşlev kodunda olay meta verilerine erişmek için bir EventData nesnesine bağlayın. Yöntem imzasında bağlama ifadelerini kullanarak da aynı özelliklere erişebilirsiniz. Aşağıdaki örnekte aynı verileri almanın her iki yolu da gösterilmektedir:

#r "Microsoft.Azure.EventHubs"

using System.Text;
using System;
using Microsoft.ServiceBus.Messaging;
using Microsoft.Azure.EventHubs;

public void Run(EventData myEventHubMessage,
    DateTime enqueuedTimeUtc,
    Int64 sequenceNumber,
    string offset,
    TraceWriter log)
{
    log.Info($"Event: {Encoding.UTF8.GetString(myEventHubMessage.Body)}");
    log.Info($"EnqueuedTimeUtc={myEventHubMessage.SystemProperties.EnqueuedTimeUtc}");
    log.Info($"SequenceNumber={myEventHubMessage.SystemProperties.SequenceNumber}");
    log.Info($"Offset={myEventHubMessage.SystemProperties.Offset}");

    // Metadata accessed by using binding expressions
    log.Info($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.Info($"SequenceNumber={sequenceNumber}");
    log.Info($"Offset={offset}");
}

Olayları toplu olarak almak için veya dizisini yapın string EventData :

public static void Run(string[] eventHubMessages, TraceWriter log)
{
    foreach (var message in eventHubMessages)
    {
        log.Info($"C# function triggered to process a message: {message}");
    }
}

Event Hubs çıkışı

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır eventHub.
direction olarak ayarlanmalıdır out. Bağlamayı Azure portalında oluşturduğunuzda bu parametre otomatik olarak ayarlanır.
ad Olayı temsil eden işlev kodunda kullanılan değişken adı.
eventHubName İşlevler 2.x ve üzeri. Olay hub'ının adı. olay hub'ı adı da bağlantı dizesi mevcut olduğunda, bu değer çalışma zamanında bu özelliği geçersiz kılar. İşlevler 1.x'te bu özellik olarak adlandırılır path.
bağlantı Event Hubs'a nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Daha fazla bilgi için bkz . Bağlantılar.

Aşağıdaki örnekte, bir function.json dosyasında olay hub'ı tetikleyici bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. işlevi bir olay hub'ına bir ileti yazar.

Aşağıdaki örneklerde , İşlevler çalışma zamanı sürüm 2.x ve sonraki sürümleri için function.json dosyasında Event Hubs bağlama verileri gösterilmektedir.

{
    "type": "eventHub",
    "name": "outputEventHubMessage",
    "eventHubName": "myeventhub",
    "connection": "MyEventHubSendAppSetting",
    "direction": "out"
}

Bir ileti oluşturan C# betik kodu aşağıdadır:

using System;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, out string outputEventHubMessage, ILogger log)
{
    String msg = $"TimerTriggerCSharp1 executed at: {DateTime.Now}";
    log.LogInformation(msg);   
    outputEventHubMessage = msg;
}

Birden çok ileti oluşturan C# betik kodu aşağıdadır:

public static void Run(TimerInfo myTimer, ICollector<string> outputEventHubMessage, ILogger log)
{
    string message = $"Message created at: {DateTime.Now}";
    log.LogInformation(message);
    outputEventHubMessage.Add("1 " + message);
    outputEventHubMessage.Add("2 " + message);
}

Olay Kılavuzu tetikleyicisi

Aşağıdaki tabloda, function.json dosyasında ayarladığınız C# betiğinin bağlama yapılandırma özellikleri açıklanmaktadır. Özniteliğinde EventGridTrigger ayarlanacağı oluşturucu parametresi veya özelliği yok.

function.json özelliği Açıklama
type Gerekli - olarak eventGridTriggerayarlanmalıdır.
direction Gerekli - olarak inayarlanmalıdır.
ad Gerekli - olay verilerini alan parametre için işlev kodunda kullanılan değişken adı.

Aşağıdaki örnekte, function.json dosyasında tanımlanan bir Event Grid tetikleyicisi gösterilmektedir.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "eventGridEvent",
      "direction": "in"
    }
  ],
  "disabled": false
}

Bağlama parametresi kullanan EventGridEvent bir C# betik işlevi örneği aşağıda verilmiştir:

#r "Azure.Messaging.EventGrid"
using Azure.Messaging.EventGrid;
using Microsoft.Extensions.Logging;

public static void Run(EventGridEvent eventGridEvent, ILogger log)
{
    log.LogInformation(eventGridEvent.Data.ToString());
}

Bağlama parametresi kullanan JObject bir C# betik işlevi örneği aşağıda verilmiştir:

#r "Newtonsoft.Json"

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static void Run(JObject eventGridEvent, TraceWriter log)
{
    log.Info(eventGridEvent.ToString(Formatting.Indented));
}

Event Grid çıkışı

Aşağıdaki tabloda, function.json dosyasında ayarladığınız C# betiğinin bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır eventGrid.
direction olarak ayarlanmalıdır out. Bağlamayı Azure portalında oluşturduğunuzda bu parametre otomatik olarak ayarlanır.
ad Olayı temsil eden işlev kodunda kullanılan değişken adı.
topicEndpointUri Gibi MyTopicEndpointUriözel konu için URI'yi içeren bir uygulama ayarının adı.
topicKeySetting Özel konu için erişim anahtarı içeren bir uygulama ayarının adı.

Aşağıdaki örnekte, function.json dosyasındaki Event Grid çıkış bağlama verileri gösterilmektedir.

{
    "type": "eventGrid",
    "name": "outputEvent",
    "topicEndpointUri": "MyEventGridTopicUriSetting",
    "topicKeySetting": "MyEventGridTopicKeySetting",
    "direction": "out"
}

Bir olay oluşturan C# betik kodu aşağıdadır:

#r "Microsoft.Azure.EventGrid"
using System;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, out EventGridEvent outputEvent, ILogger log)
{
    outputEvent = new EventGridEvent("message-id", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0");
}

Birden çok olay oluşturan C# betik kodu aşağıdadır:

#r "Microsoft.Azure.EventGrid"
using System;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, ICollector<EventGridEvent> outputEvent, ILogger log)
{
    outputEvent.Add(new EventGridEvent("message-id-1", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0"));
    outputEvent.Add(new EventGridEvent("message-id-2", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0"));
}

Service Bus tetikleyicisi

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır serviceBusTrigger. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
direction olarak ayarlanmalıdır in. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
ad İşlev kodundaki kuyruk veya konu iletisini temsil eden değişkenin adı.
queueName İzlenecek kuyruğun adı. Bir konu için değil, yalnızca kuyruk izleniyorsa ayarlayın.
topicName İzlenecek konunun adı. Bir kuyruk için değil, yalnızca bir konu izleniyorsa ayarlayın.
subscriptionName İzlenecek aboneliğin adı. Bir kuyruk için değil, yalnızca bir konu izleniyorsa ayarlayın.
bağlantı Service Bus'a nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.
accessRights bağlantı dizesi erişim hakları. Kullanılabilir değerler ve listendeğerleridirmanage. Varsayılan değer, 'nin Yönet iznine sahip olduğunu connection gösteren değeridirmanage. Yönetme izni olmayan bir bağlantı dizesi kullanıyorsanız, "dinleme" olarak ayarlayınaccessRights. Aksi takdirde, İşlevler çalışma zamanı yönetme hakları gerektiren işlemleri gerçekleştirmeye çalışmayabilir. Service Bus SDK'sının en son sürümü işlemleri yönetmeyi desteklemediğinden, Azure İşlevleri sürüm 2.x ve üzeri sürümlerde bu özellik kullanılamaz.
isSessionsEnabled trueoturum kullanan bir kuyruğa veya aboneliğe bağlanıyorsanız. false aksi takdirde, varsayılan değerdir.
otomatik tamamlama true tetikleyicisinin işlemeden sonra otomatik olarak complete çağrısı yapması gerektiğinde veya işlev kodu el ile complete çağrısı yapacaksa.

ayarı false yalnızca C# dilinde desteklenir.

olarak ayarlanırsa true, işlev yürütmesi başarıyla tamamlanırsa tetikleyici iletiyi otomatik olarak tamamlar ve aksi takdirde iletiyi bırakır.
<br/olarak falseayarlandığında, iletiyi, oturumu veya toplu işlemi tamamlamak, bırakmak veya geçersiz hale getirmek için ServiceBusReceiver yöntemlerini çağırmaktan sorumlusunuz. Bir özel durum oluştuğunda ServiceBusReceiver (ve yöntemlerden hiçbiri çağrılmadığında), kilit kalır. Kilidin süresi dolduktan sonra, ileti artımlı olarak DeliveryCount yeniden kuyruğa alınır ve kilit otomatik olarak yenilenir.

Bu özellik yalnızca Azure İşlevleri 2.x ve üzeri sürümlerde kullanılabilir.

Aşağıdaki örnekte, function.json dosyasında service bus tetikleyici bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, ileti meta verilerini okur ve Service Bus kuyruk iletisini günlüğe kaydeder.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
"bindings": [
    {
    "queueName": "testqueue",
    "connection": "MyServiceBusConnection",
    "name": "myQueueItem",
    "type": "serviceBusTrigger",
    "direction": "in"
    }
],
"disabled": false
}

C# betik kodu aşağıdadır:

using System;

public static void Run(string myQueueItem,
    Int32 deliveryCount,
    DateTime enqueuedTimeUtc,
    string messageId,
    TraceWriter log)
{
    log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");

    log.Info($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.Info($"DeliveryCount={deliveryCount}");
    log.Info($"MessageId={messageId}");
}

Service Bus çıkışı

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır serviceBus. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
direction olarak ayarlanmalıdır out. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
ad İşlev kodundaki kuyruk veya konu iletisini temsil eden değişkenin adı. İşlev dönüş değerine başvurmak için "$return" olarak ayarlayın.
queueName Kuyruğun adı. Bir konu için değil, yalnızca kuyruk iletileri gönderiliyorsa ayarlayın.
topicName Konunun adı. Kuyruk için değil, yalnızca konu iletileri gönderiliyorsa ayarlayın.
bağlantı Service Bus'a nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar.
accessRights (yalnızca v1) bağlantı dizesi erişim hakları. Kullanılabilir değerler ve listendeğerleridirmanage. Varsayılan değer, 'nin Yönet iznine sahip olduğunu connection gösteren değeridirmanage. Yönetme izni olmayan bir bağlantı dizesi kullanıyorsanız, "dinleme" olarak ayarlayınaccessRights. Aksi takdirde, İşlevler çalışma zamanı yönetme hakları gerektiren işlemleri gerçekleştirmeye çalışmayabilir. Service Bus SDK'sının en son sürümü işlemleri yönetmeyi desteklemediğinden, Azure İşlevleri sürüm 2.x ve üzeri sürümlerde bu özellik kullanılamaz.

Aşağıdaki örnekte, bir function.json dosyasında service bus çıkış bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, her 15 saniyede bir kuyruk iletisi göndermek için zamanlayıcı tetikleyicisi kullanır.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "bindings": [
        {
            "schedule": "0/15 * * * * *",
            "name": "myTimer",
            "runsOnStartup": true,
            "type": "timerTrigger",
            "direction": "in"
        },
        {
            "name": "outputSbQueue",
            "type": "serviceBus",
            "queueName": "testqueue",
            "connection": "MyServiceBusConnection",
            "direction": "out"
        }
    ],
    "disabled": false
}

Tek bir ileti oluşturan C# betik kodu aşağıdadır:

public static void Run(TimerInfo myTimer, ILogger log, out string outputSbQueue)
{
    string message = $"Service Bus queue message created at: {DateTime.Now}";
    log.LogInformation(message); 
    outputSbQueue = message;
}

Birden çok ileti oluşturan C# betik kodu aşağıdadır:

public static async Task Run(TimerInfo myTimer, ILogger log, IAsyncCollector<string> outputSbQueue)
{
    string message = $"Service Bus queue messages created at: {DateTime.Now}";
    log.LogInformation(message); 
    await outputSbQueue.AddAsync("1 " + message);
    await outputSbQueue.AddAsync("2 " + message);
}

Azure Cosmos DB v2 tetikleyicisi

Bu bölümde yalnızca uzantının 4.x+ sürümüne yönelik destek özetlenmiştir.

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır cosmosDBTrigger.
direction olarak ayarlanmalıdır in. Bu parametre, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
ad Değişiklikleri olan belgelerin listesini temsil eden işlev kodunda kullanılan değişken adı.
bağlantı İzlenen Azure Cosmos DB hesabına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Daha fazla bilgi için bkz . Bağlantılar.
databaseName Kapsayıcının izlendiği Azure Cosmos DB veritabanının adı.
containerName İzlenen kapsayıcının adı.
leaseConnection (İsteğe bağlı) Kira kapsayıcısını barındıran Azure Cosmos DB hesabına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar kapsayıcısının adı.

Ayarlanmadığında connection , değer kullanılır. Bu parametre, portalda bağlama oluşturulduğunda otomatik olarak ayarlanır. Kira kapsayıcısı için bağlantı dizesi yazma izinlerine sahip olmalıdır.
leaseDatabaseName (İsteğe bağlı) Kiraları depolamak için kullanılan kapsayıcıyı tutan veritabanının adı. Ayarlanmadığında, ayarın databaseName değeri kullanılır.
leaseContainerName (İsteğe bağlı) Kiraları depolamak için kullanılan kapsayıcının adı. Ayarlanmadığında, değer leases kullanılır.
createLeaseContainerIfNotExists (İsteğe bağlı) olarak trueayarlandığında, kira kapsayıcısı henüz mevcut olmadığında otomatik olarak oluşturulur. Varsayılan değer şudur: false. Değerini trueolarak ayarlarsanız Microsoft Entra kimliklerini kullanırken kapsayıcı oluşturma işlemine izin verilmez ve İşleviniz başlatılamaz.
leasesContainerThroughput (İsteğe bağlı) Kira kapsayıcısı oluşturulduğunda atanacak İstek Birimi sayısını tanımlar. Bu ayar yalnızca olarak ayarlandığında truekullanılırcreateLeaseContainerIfNotExists. Bağlama portal kullanılarak oluşturulduğunda bu parametre otomatik olarak ayarlanır.
leaseContainerPrefix (İsteğe bağlı) Ayarlandığında, değer bu işlev için Kira kapsayıcısında oluşturulan kiralara ön ek olarak eklenir. Ön ek kullanmak, iki ayrı Azure İşlevleri farklı ön ekleri kullanarak aynı Kira kapsayıcısını paylaşmasına olanak tanır.
feedPollDelay (İsteğe bağlı) Tüm geçerli değişiklikler boşaltıldıktan sonra akıştaki yeni değişiklikler için bölümü yoklama arasındaki gecikme süresi (milisaniye cinsinden). Varsayılan değer 5.000 milisaniye veya 5 saniyedir.
leaseAcquireInterval (İsteğe bağlı) Ayarlandığında, bölümlerin bilinen konak örnekleri arasında eşit olarak dağıtılıp dağıtılamadığını hesaplamak için bir görevi başlatma aralığını milisaniye cinsinden tanımlar. Varsayılan değer 13000 'dir (13 saniye).
leaseExpirationInterval (İsteğe bağlı) Ayarlandığında, bölümü temsil eden bir kirada kiranın alındığı aralığı milisaniye cinsinden tanımlar. Kira bu aralık içinde yenilenmezse süresi dolmasına neden olur ve bölümün sahipliği başka bir örneğe taşınır. Varsayılan değer 60000 'dir (60 saniye).
leaseRenewInterval (İsteğe bağlı) Ayarlandığında, o anda bir örnek tarafından tutulan bölümler için tüm kiralamalar için yenileme aralığını milisaniye cinsinden tanımlar. Varsayılan değer 17000 'dir (17 saniye).
maxItemsPerInvocation (İsteğe bağlı) Ayarlandığında, bu özellik İşlev çağrısı başına alınan en fazla öğe sayısını ayarlar. İzlenen kapsayıcıdaki işlemler saklı yordamlar aracılığıyla gerçekleştiriliyorsa, değişiklik akışındaki öğeler okunurken işlem kapsamı korunur. Sonuç olarak, alınan öğe sayısı belirtilen değerden yüksek olabilir, böylece aynı işlem tarafından değiştirilen öğeler tek bir atomik toplu işlemin parçası olarak döndürülür.
startFromBeginning (İsteğe bağlı) Bu seçenek Tetikleyici'ye geçerli zamanda başlamak yerine kapsayıcının değişiklik geçmişinin başından itibaren değişiklikleri okumasını söyler. Baştan okuma yalnızca tetikleyici ilk kez başlatıldığında çalışır, sonraki çalıştırmalarda olduğu gibi denetim noktaları zaten depolanır. Bu seçeneğin true zaten oluşturulmuş kiralar olduğunda olarak ayarlanmasının hiçbir etkisi yoktur.
startFromTime (İsteğe bağlı) Değişiklik akışı okuma işleminin başlatıldığı tarih ve saati alır veya ayarlar. Önerilen biçim, GIBI 2021-02-16T14:19:29ZUTC belirleyicisi ile ISO 8601'dir. Bu yalnızca ilk tetikleyici durumunu ayarlamak için kullanılır. Tetikleyici kiralama durumuna geldikten sonra bu değerin değiştirilmesinin hiçbir etkisi olmaz.
preferredLocations (İsteğe bağlı) Azure Cosmos DB hizmetinde coğrafi olarak çoğaltılan veritabanı hesapları için tercih edilen konumları (bölgeleri) tanımlar. Değerler virgülle ayrılmış olmalıdır. Örneğin, "Doğu ABD,Orta Güney ABD,Kuzey Avrupa".

Aşağıdaki örnekte, bir function.json dosyasındaki Azure Cosmos DB tetikleyici bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, Azure Cosmos DB kayıtları eklendiğinde veya değiştirildiğinde günlük iletileri yazar.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseContainerName": "leases",
    "connection": "<connection-app-setting>",
    "databaseName": "Tasks",
    "containerName": "Items",
    "createLeaseContainerIfNotExists": true
}

C# betik kodu aşağıdadır:

    using System;
    using System.Collections.Generic;
    using Microsoft.Extensions.Logging;

    // Customize the model with your own desired properties
    public class ToDoItem
    {
        public string id { get; set; }
        public string Description { get; set; }
    }

    public static void Run(IReadOnlyList<ToDoItem> documents, ILogger log)
    {
      log.LogInformation("Documents modified " + documents.Count);
      log.LogInformation("First document Id " + documents[0].id);
    }

Azure Cosmos DB v2 girişi

Bu bölümde yalnızca uzantının 4.x+ sürümüne yönelik destek özetlenmiştir.

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type olarak ayarlanmalıdır cosmosDB.
direction olarak ayarlanmalıdır in.
ad Değişiklikleri olan belgelerin listesini temsil eden işlev kodunda kullanılan değişken adı.
bağlantı İzlenen Azure Cosmos DB hesabına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar kapsayıcısının adı. Daha fazla bilgi için bkz . Bağlantılar.
databaseName Kapsayıcının izlendiği Azure Cosmos DB veritabanının adı.
containerName İzlenen kapsayıcının adı.
partitionKey Arama için bölüm anahtarı değerini belirtir. Bağlama parametreleri içerebilir. Bölümlenmiş kapsayıcılardaki aramalar için gereklidir.
id Alınacak belgenin kimliği. Bu özellik bağlama ifadelerini destekler. hem hem sqlQuery de id özelliklerini ayarlamayın. Herhangi birini ayarlamazsanız kapsayıcının tamamı alınır.
sqlQuery Birden çok belgeyi almak için kullanılan bir Azure Cosmos DB SQL sorgusu. özelliği, şu örnekte olduğu gibi çalışma zamanı bağlamalarını destekler: SELECT * FROM c where c.departmentId = {departmentId}. hem hem sqlQuery de id özelliklerini ayarlamayın. Herhangi birini ayarlamazsanız kapsayıcının tamamı alınır.
preferredLocations (İsteğe bağlı) Azure Cosmos DB hizmetinde coğrafi olarak çoğaltılan veritabanı hesapları için tercih edilen konumları (bölgeleri) tanımlar. Değerler virgülle ayrılmış olmalıdır. Örneğin, East US,South Central US,North Europe.

Bu bölüm aşağıdaki örnekleri içerir:

HTTP tetikleyicisi örnekleri basit ToDoItem bir türe başvurur:

namespace CosmosDBSamplesV2
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

Kuyruk tetikleyicisi, dizeden kimlik arama

Aşağıdaki örnekte bir function.json dosyasındaki Azure Cosmos DB giriş bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. işlevi tek bir belgeyi okur ve belgenin metin değerini güncelleştirir.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "name": "inputDocument",
    "type": "cosmosDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "id" : "{queueTrigger}",
    "partitionKey": "{partition key value}",
    "connectionStringSetting": "MyAccount_COSMOSDB",
    "direction": "in"
}

C# betik kodu aşağıdadır:

    using System;

    // Change input document contents using Azure Cosmos DB input binding
    public static void Run(string myQueueItem, dynamic inputDocument)
    {
      inputDocument.text = "This has changed.";
    }

SqlQuery kullanarak kuyruk tetikleyicisi, birden çok belge alma

Aşağıdaki örnekte bir function.json dosyasındaki Azure Cosmos DB giriş bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, sorgu parametrelerini özelleştirmek için bir kuyruk tetikleyicisi kullanarak SQL sorgusu tarafından belirtilen birden çok belgeyi alır.

Kuyruk tetikleyicisi bir parametresi departmentIdsağlar. kuyruk iletisi { "departmentId" : "Finance" } , finans departmanı için tüm kayıtları döndürür.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "name": "documents",
    "type": "cosmosDB",
    "direction": "in",
    "databaseName": "MyDb",
    "collectionName": "MyCollection",
    "sqlQuery": "SELECT * from c where c.departmentId = {departmentId}",
    "connectionStringSetting": "CosmosDBConnection"
}

C# betik kodu aşağıdadır:

    public static void Run(QueuePayload myQueueItem, IEnumerable<dynamic> documents)
    {
        foreach (var doc in documents)
        {
            // operate on each document
        }
    }

    public class QueuePayload
    {
        public string departmentId { get; set; }
    }

HTTP tetikleyicisi, sorgu dizesinden kimlik arama

Aşağıdaki örnekte, tek bir belgeyi alan bir C# betik işlevi gösterilmektedir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için sorgu dizesi kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan belge ToDoItem almak için kullanılır.

İşte function.json dosyası:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "Id": "{Query.id}",
      "PartitionKey" : "{Query.partitionKeyValue}"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
         log.LogInformation($"ToDo item not found");
    }
    else
    {
        log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

HTTP tetikleyicisi, rota verilerinden kimlik arama

Aşağıdaki örnekte, tek bir belgeyi alan bir C# betik işlevi gösterilmektedir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için yol verilerini kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan belge ToDoItem almak için kullanılır.

İşte function.json dosyası:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ],
      "route":"todoitems/{partitionKeyValue}/{id}"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "id": "{id}",
      "partitionKey": "{partitionKeyValue}"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
         log.LogInformation($"ToDo item not found");
    }
    else
    {
        log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

SQLQuery kullanarak HTTP tetikleyicisi, birden çok belge alma

Aşağıdaki örnekte belgelerin listesini alan bir C# betik işlevi gösterilmektedir. İşlev bir HTTP isteği tarafından tetikleniyor. Sorgu öznitelik özelliğinde SqlQuery belirtilir.

İşte function.json dosyası:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItems",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "sqlQuery": "SELECT top 2 * FROM c order by c._ts desc"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, IEnumerable<ToDoItem> toDoItems, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    foreach (ToDoItem toDoItem in toDoItems)
    {
        log.LogInformation(toDoItem.Description);
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

DOCUMENTClient kullanarak HTTP tetikleyicisi, birden çok belge alma

Aşağıdaki örnekte belgelerin listesini alan bir C# betik işlevi gösterilmektedir. İşlev bir HTTP isteği tarafından tetikleniyor. Kod, belge listesini okumak için Azure Cosmos DB bağlaması tarafından sağlanan bir örneği kullanır DocumentClient . Örnek DocumentClient , yazma işlemleri için de kullanılabilir.

İşte function.json dosyası:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "client",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "inout"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

#r "Microsoft.Azure.Documents.Client"

using System.Net;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Microsoft.Extensions.Logging;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, DocumentClient client, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    Uri collectionUri = UriFactory.CreateDocumentCollectionUri("ToDoItems", "Items");
    string searchterm = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "searchterm", true) == 0)
        .Value;

    if (searchterm == null)
    {
        return req.CreateResponse(HttpStatusCode.NotFound);
    }

    log.LogInformation($"Searching for word: {searchterm} using Uri: {collectionUri.ToString()}");
    IDocumentQuery<ToDoItem> query = client.CreateDocumentQuery<ToDoItem>(collectionUri)
        .Where(p => p.Description.Contains(searchterm))
        .AsDocumentQuery();

    while (query.HasMoreResults)
    {
        foreach (ToDoItem result in await query.ExecuteNextAsync())
        {
            log.LogInformation(result.Description);
        }
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Azure Cosmos DB v2 çıkışı

Bu bölümde yalnızca uzantının 4.x+ sürümüne yönelik destek özetlenmiştir.

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
bağlantı İzlenen Azure Cosmos DB hesabına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Daha fazla bilgi için bkz . Bağlantılar.
databaseName Kapsayıcının izlendiği Azure Cosmos DB veritabanının adı.
containerName İzlenen kapsayıcının adı.
createIfNotExists Kapsayıcının mevcut olmadığında oluşturulup oluşturulmadığını gösteren boole değeri. Varsayılan değer false'tur çünkü yeni kapsayıcılar ayrılmış aktarım hızıyla oluşturulur ve bunun maliyet etkileri vardır. Daha fazla bilgi için bkz. fiyatlandırma sayfası.
partitionKey True createIfNotExists olduğunda, oluşturulan kapsayıcı için bölüm anahtarı yolunu tanımlar. Bağlama parametreleri içerebilir.
containerThroughput True createIfNotExists olduğunda, oluşturulan kapsayıcının aktarım hızını tanımlar.
preferredLocations (İsteğe bağlı) Azure Cosmos DB hizmetinde coğrafi olarak çoğaltılan veritabanı hesapları için tercih edilen konumları (bölgeleri) tanımlar. Değerler virgülle ayrılmış olmalıdır. Örneğin, East US,South Central US,North Europe.

Bu bölüm aşağıdaki örnekleri içerir:

Kuyruk tetikleyicisi, bir belge yazma

Aşağıdaki örnekte, bir function.json dosyasındaki Azure Cosmos DB çıkış bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, aşağıdaki biçimde JSON alan bir kuyruk için kuyruk giriş bağlaması kullanır:

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

İşlev, her kayıt için aşağıdaki biçimde Azure Cosmos DB belgeleri oluşturur:

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "name": "employeeDocument",
    "type": "cosmosDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "createIfNotExists": true,
    "connectionStringSetting": "MyAccount_COSMOSDB",
    "direction": "out"
}

C# betik kodu aşağıdadır:

    #r "Newtonsoft.Json"

    using Microsoft.Azure.WebJobs.Host;
    using Newtonsoft.Json.Linq;
    using Microsoft.Extensions.Logging;

    public static void Run(string myQueueItem, out object employeeDocument, ILogger log)
    {
      log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

      dynamic employee = JObject.Parse(myQueueItem);

      employeeDocument = new {
        id = employee.name + "-" + employee.employeeId,
        name = employee.name,
        employeeId = employee.employeeId,
        address = employee.address
      };
    }

Kuyruk tetikleyicisi, IAsyncCollector kullanarak belge yazma

Birden çok belge oluşturmak için, desteklenen türlerden birine veya IAsyncCollector<T> nereye T bağlanabilirsinizICollector<T>.

Bu örnek basit ToDoItem bir türe başvurur:

namespace CosmosDBSamplesV2
{
    public class ToDoItem
    {
        public string id { get; set; }
        public string Description { get; set; }
    }
}

İşte function.json dosyası:

{
  "bindings": [
    {
      "name": "toDoItemsIn",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "todoqueueforwritemulti",
      "connectionStringSetting": "AzureWebJobsStorage"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItemsOut",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "out"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

using System;
using Microsoft.Extensions.Logging;

public static async Task Run(ToDoItem[] toDoItemsIn, IAsyncCollector<ToDoItem> toDoItemsOut, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

    foreach (ToDoItem toDoItem in toDoItemsIn)
    {
        log.LogInformation($"Description={toDoItem.Description}");
        await toDoItemsOut.AddAsync(toDoItem);
    }
}

Azure Cosmos DB v1 tetikleyicisi

Aşağıdaki örnekte, bir function.json dosyasındaki Azure Cosmos DB tetikleyici bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, Azure Cosmos DB kayıtları değiştirildiğinde günlük iletileri yazar.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseCollectionName": "leases",
    "connectionStringSetting": "<connection-app-setting>",
    "databaseName": "Tasks",
    "collectionName": "Items",
    "createLeaseCollectionIfNotExists": true
}

C# betik kodu aşağıdadır:

    #r "Microsoft.Azure.Documents.Client"
    
    using System;
    using Microsoft.Azure.Documents;
    using System.Collections.Generic;
    

    public static void Run(IReadOnlyList<Document> documents, TraceWriter log)
    {
        log.Info("Documents modified " + documents.Count);
        log.Info("First document Id " + documents[0].Id);
    }

Azure Cosmos DB v1 girişi

Bu bölüm aşağıdaki örnekleri içerir:

HTTP tetikleyicisi örnekleri basit ToDoItem bir türe başvurur:

namespace CosmosDBSamplesV1
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

Kuyruk tetikleyicisi, dizeden kimlik arama

Aşağıdaki örnekte, bir function.json dosyasındaki Azure Cosmos DB giriş bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. işlevi tek bir belgeyi okur ve belgenin metin değerini güncelleştirir.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "name": "inputDocument",
    "type": "documentDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "id" : "{queueTrigger}",
    "partitionKey": "{partition key value}",
    "connection": "MyAccount_COSMOSDB",
    "direction": "in"
}

C# betik kodu aşağıdadır:

    using System;

    // Change input document contents using Azure Cosmos DB input binding
    public static void Run(string myQueueItem, dynamic inputDocument)
    {
        inputDocument.text = "This has changed.";
    }

SqlQuery kullanarak kuyruk tetikleyicisi, birden çok belge alma

Aşağıdaki örnekte, bir function.json dosyasındaki Azure Cosmos DB giriş bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, sorgu parametrelerini özelleştirmek için bir kuyruk tetikleyicisi kullanarak SQL sorgusu tarafından belirtilen birden çok belgeyi alır.

Kuyruk tetikleyicisi bir parametresi departmentIdsağlar. kuyruk iletisi { "departmentId" : "Finance" } , finans departmanı için tüm kayıtları döndürür.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "name": "documents",
    "type": "documentdb",
    "direction": "in",
    "databaseName": "MyDb",
    "collectionName": "MyCollection",
    "sqlQuery": "SELECT * from c where c.departmentId = {departmentId}",
    "connection": "CosmosDBConnection"
}

C# betik kodu aşağıdadır:

    public static void Run(QueuePayload myQueueItem, IEnumerable<dynamic> documents)
    {
        foreach (var doc in documents)
        {
            // operate on each document
        }
    }

    public class QueuePayload
    {
        public string departmentId { get; set; }
    }

HTTP tetikleyicisi, sorgu dizesinden kimlik arama

Aşağıdaki örnekte, tek bir belgeyi alan bir C# betik işlevi gösterilmektedir. İşlev, bir sorgu dizesi kullanarak aranacak kimliği belirten bir HTTP isteği tarafından tetiklenir. Bu kimlik, belirtilen veritabanından ve koleksiyondan belge ToDoItem almak için kullanılır.

İşte function.json dosyası:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "Id": "{Query.id}"
    }
  ],
  "disabled": true
}

C# betik kodu aşağıdadır:

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
        log.Info($"ToDo item not found");
    }
    else
    {
        log.Info($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

HTTP tetikleyicisi, rota verilerinden kimlik arama

Aşağıdaki örnekte, tek bir belgeyi alan bir C# betik işlevi gösterilmektedir. İşlev, arama kimliğini belirtmek için yol verilerini kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik, belirtilen veritabanından ve koleksiyondan belge ToDoItem almak için kullanılır.

İşte function.json dosyası:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ],
      "route":"todoitems/{id}"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "Id": "{id}"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
        log.Info($"ToDo item not found");
    }
    else
    {
        log.Info($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

SQLQuery kullanarak HTTP tetikleyicisi, birden çok belge alma

Aşağıdaki örnekte belgelerin listesini alan bir C# betik işlevi gösterilmektedir. İşlev bir HTTP isteği tarafından tetikleniyor. Sorgu öznitelik özelliğinde SqlQuery belirtilir.

İşte function.json dosyası:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItems",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "sqlQuery": "SELECT top 2 * FROM c order by c._ts desc"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, IEnumerable<ToDoItem> toDoItems, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    foreach (ToDoItem toDoItem in toDoItems)
    {
        log.Info(toDoItem.Description);
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

DOCUMENTClient kullanarak HTTP tetikleyicisi, birden çok belge alma

Aşağıdaki örnekte belgelerin listesini alan bir C# betik işlevi gösterilmektedir. İşlev bir HTTP isteği tarafından tetikleniyor. Kod, belge listesini okumak için Azure Cosmos DB bağlaması tarafından sağlanan bir örneği kullanır DocumentClient . Örnek DocumentClient , yazma işlemleri için de kullanılabilir.

İşte function.json dosyası:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "client",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "inout"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

#r "Microsoft.Azure.Documents.Client"

using System.Net;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, DocumentClient client, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    Uri collectionUri = UriFactory.CreateDocumentCollectionUri("ToDoItems", "Items");
    string searchterm = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "searchterm", true) == 0)
        .Value;

    if (searchterm == null)
    {
        return req.CreateResponse(HttpStatusCode.NotFound);
    }

    log.Info($"Searching for word: {searchterm} using Uri: {collectionUri.ToString()}");
    IDocumentQuery<ToDoItem> query = client.CreateDocumentQuery<ToDoItem>(collectionUri)
        .Where(p => p.Description.Contains(searchterm))
        .AsDocumentQuery();

    while (query.HasMoreResults)
    {
        foreach (ToDoItem result in await query.ExecuteNextAsync())
        {
            log.Info(result.Description);
        }
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Azure Cosmos DB v1 çıkışı

Bu bölüm aşağıdaki örnekleri içerir:

  • Kuyruk tetikleyicisi, bir belge yazma
  • Kuyruk tetikleyicisi, kullanarak belge yazma IAsyncCollector

Kuyruk tetikleyicisi, bir belge yazma

Aşağıdaki örnekte, bir function.json dosyasındaki Azure Cosmos DB çıkış bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, aşağıdaki biçimde JSON alan bir kuyruk için kuyruk giriş bağlaması kullanır:

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

İşlev, her kayıt için aşağıdaki biçimde Azure Cosmos DB belgeleri oluşturur:

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "name": "employeeDocument",
    "type": "documentDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "createIfNotExists": true,
    "connection": "MyAccount_COSMOSDB",
    "direction": "out"
}

C# betik kodu aşağıdadır:

    #r "Newtonsoft.Json"

    using Microsoft.Azure.WebJobs.Host;
    using Newtonsoft.Json.Linq;

    public static void Run(string myQueueItem, out object employeeDocument, TraceWriter log)
    {
        log.Info($"C# Queue trigger function processed: {myQueueItem}");

        dynamic employee = JObject.Parse(myQueueItem);

        employeeDocument = new {
            id = employee.name + "-" + employee.employeeId,
            name = employee.name,
            employeeId = employee.employeeId,
            address = employee.address
        };
    }

Kuyruk tetikleyicisi, IAsyncCollector kullanarak belge yazma

Birden çok belge oluşturmak için, desteklenen türlerden birine veya IAsyncCollector<T> nereye T bağlanabilirsinizICollector<T>.

Bu örnek basit ToDoItem bir türe başvurur:

namespace CosmosDBSamplesV1
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

İşte function.json dosyası:

{
  "bindings": [
    {
      "name": "toDoItemsIn",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "todoqueueforwritemulti",
      "connection": "AzureWebJobsStorage"
    },
    {
      "type": "documentDB",
      "name": "toDoItemsOut",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "out"
    }
  ],
  "disabled": false
}

C# betik kodu aşağıdadır:

using System;

public static async Task Run(ToDoItem[] toDoItemsIn, IAsyncCollector<ToDoItem> toDoItemsOut, TraceWriter log)
{
    log.Info($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

    foreach (ToDoItem toDoItem in toDoItemsIn)
    {
        log.Info($"Description={toDoItem.Description}");
        await toDoItemsOut.AddAsync(toDoItem);
    }
}

Azure SQL tetikleyicisi

GitHub deposunda Azure SQL tetikleyicisi için daha fazla örnek mevcuttur.

Örnek bir ToDoItem sınıfa ve buna karşılık gelen bir veritabanı tablosuna başvurur:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

Değişiklik izleme , veritabanında ve tabloda etkinleştirilir:

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

SQL tetikleyicisi, her biri SqlChange iki özelliğe sahip nesnelerin bir listesine bağlanırIReadOnlyList<SqlChange<T>>:

  • Öğe: Değiştirilen öğe. Öğenin türü, sınıfında görüldüğü gibi tablo şemasını ToDoItem izlemelidir.
  • İşlem: sabit tablosundan SqlChangeOperation bir değer. Olası değerler: Insert, Update ve Delete.

Aşağıdaki örnekte, function.json dosyasındaki bir SQL tetikleyicisi ve tabloda değişiklikler ToDo olduğunda çağrılan bir C# betik işlevi gösterilmektedir:

Function.json dosyasındaki verileri bağlama aşağıdadır:

{
    "name": "todoChanges",
    "type": "sqlTrigger",
    "direction": "in",
    "tableName": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

C# betik işlevi aşağıdadır:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static void Run(IReadOnlyList<SqlChange<ToDoItem>> todoChanges, ILogger log)
{
    log.LogInformation($"C# SQL trigger function processed a request.");

    foreach (SqlChange<ToDoItem> change in todoChanges)
    {
        ToDoItem toDoItem = change.Item;
        log.LogInformation($"Change operation: {change.Operation}");
        log.LogInformation($"Id: {toDoItem.Id}, Title: {toDoItem.title}, Url: {toDoItem.url}, Completed: {toDoItem.completed}");
    }
}

Azure SQL girişi

GitHub deposunda Azure SQL giriş bağlaması için daha fazla örnek mevcuttur.

Bu bölüm aşağıdaki örnekleri içerir:

Örnekler bir ToDoItem sınıfa ve buna karşılık gelen bir veritabanı tablosuna başvurur:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

HTTP tetikleyicisi, sorgu dizesinden kimliğine göre satır alma

Aşağıdaki örnekte, bir function.json dosyasındaki Azure SQL giriş bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, kimliği belirtmek için sorgu dizesi kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik, belirtilen sorguya sahip bir ToDoItem kaydı almak için kullanılır.

Not

HTTP sorgu dizesi parametresi büyük/küçük harfe duyarlıdır.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "in",
    "commandText": "select [Id], [order], [title], [url], [completed] from dbo.ToDo where Id = @Id",
    "commandType": "Text",
    "parameters": "@Id = {Query.id}",
    "connectionStringSetting": "SqlConnectionString"
}

C# betik kodu aşağıdadır:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Collections.Generic;

public static IActionResult Run(HttpRequest req, ILogger log, IEnumerable<ToDoItem> todoItem)
{
    return new OkObjectResult(todoItem);
}

HTTP tetikleyicisi, satırları silme

Aşağıdaki örnekte, function.json dosyasındaki bir Azure SQL giriş bağlaması ve HTTP isteği sorgu parametresinden giriş içeren bir saklı yordam yürütmek için bağlamayı kullanan bir C# betik işlevi gösterilmektedir. Bu örnekte saklı yordam, parametrenin değerine bağlı olarak tek bir kaydı veya tüm kayıtları siler.

Saklı yordam dbo.DeleteToDo SQL veritabanında oluşturulmalıdır.

CREATE PROCEDURE [dbo].[DeleteToDo]
    @Id NVARCHAR(100)
AS
    DECLARE @UID UNIQUEIDENTIFIER = TRY_CAST(@ID AS UNIQUEIDENTIFIER)
    IF @UId IS NOT NULL AND @Id != ''
    BEGIN
        DELETE FROM dbo.ToDo WHERE Id = @UID
    END
    ELSE
    BEGIN
        DELETE FROM dbo.ToDo WHERE @ID = ''
    END

    SELECT [Id], [order], [title], [url], [completed] FROM dbo.ToDo
GO

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItems",
    "type": "sql",
    "direction": "in",
    "commandText": "DeleteToDo",
    "commandType": "StoredProcedure",
    "parameters": "@Id = {Query.id}",
    "connectionStringSetting": "SqlConnectionString"
}
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace AzureSQL.ToDo
{
    public static class DeleteToDo
    {
        // delete all items or a specific item from querystring
        // returns remaining items
        // uses input binding with a stored procedure DeleteToDo to delete items and return remaining items
        [FunctionName("DeleteToDo")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "DeleteFunction")] HttpRequest req,
            ILogger log,
            [Sql(commandText: "DeleteToDo", commandType: System.Data.CommandType.StoredProcedure, 
                parameters: "@Id={Query.id}", connectionStringSetting: "SqlConnectionString")] 
                IEnumerable<ToDoItem> toDoItems)
        {
            return new OkObjectResult(toDoItems);
        }
    }
}

C# betik kodu aşağıdadır:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Collections.Generic;

public static IActionResult Run(HttpRequest req, ILogger log, IEnumerable<ToDoItem> todoItems)
{
    return new OkObjectResult(todoItems);
}

Azure SQL çıkışı

GitHub deposunda Azure SQL çıkış bağlaması için daha fazla örnek mevcuttur.

Bu bölüm aşağıdaki örnekleri içerir:

Örnekler bir ToDoItem sınıfa ve buna karşılık gelen bir veritabanı tablosuna başvurur:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

HTTP tetikleyicisi, tabloya kayıt yazma

Aşağıdaki örnekte, bir function.json dosyasındaki SQL çıkış bağlaması ve HTTP POST isteğinde JSON gövdesi olarak sağlanan verileri kullanarak bir tabloya kayıt ekleyen bir C# betik işlevi gösterilmektedir.

Function.json dosyasındaki verileri bağlama aşağıdadır:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

Aşağıda örnek C# betik kodu verilmiştir:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static IActionResult Run(HttpRequest req, ILogger log, out ToDoItem todoItem)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = new StreamReader(req.Body).ReadToEnd();
    todoItem = JsonConvert.DeserializeObject<ToDoItem>(requestBody);

    return new OkObjectResult(todoItem);
}

HTTP tetikleyicisi, iki tabloya yazma

Aşağıdaki örnekte, bir function.json dosyasında sql çıkış bağlaması ve bir HTTP POST isteğinde JSON gövdesi ve birden çok çıkış bağlaması olarak sağlanan verileri kullanarak iki farklı tablodaki (dbo.ToDo ve dbo.RequestLog) bir veritabanına kayıt ekleyen bir C# betik işlevi gösterilmektedir.

İkinci tablo olan dbo.RequestLog, aşağıdaki tanıma karşılık gelir:

CREATE TABLE dbo.RequestLog (
    Id int identity(1,1) primary key,
    RequestTimeStamp datetime2 not null,
    ItemCount int not null
)

Function.json dosyasındaki verileri bağlama aşağıdadır:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
},
{
    "name": "requestLog",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.RequestLog",
    "connectionStringSetting": "SqlConnectionString"
}

Aşağıda örnek C# betik kodu verilmiştir:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static IActionResult Run(HttpRequest req, ILogger log, out ToDoItem todoItem, out RequestLog requestLog)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = new StreamReader(req.Body).ReadToEnd();
    todoItem = JsonConvert.DeserializeObject<ToDoItem>(requestBody);

    requestLog = new RequestLog();
    requestLog.RequestTimeStamp = DateTime.Now;
    requestLog.ItemCount = 1;

    return new OkObjectResult(todoItem);
}

public class RequestLog {
    public DateTime RequestTimeStamp { get; set; }
    public int ItemCount { get; set; }
}

RabbitMQ çıkışı

Aşağıdaki örnekte, function.json dosyasında bir RabbitMQ çıkış bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. İşlev, bir HTTP tetikleyicisinden iletide okur ve bunu RabbitMQ kuyruğuna gönderir.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "bindings": [
        {
            "type": "httpTrigger",
            "direction": "in",
            "authLevel": "function",
            "name": "input",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "type": "rabbitMQ",
            "name": "outputMessage",
            "queueName": "outputQueue",
            "connectionStringSetting": "rabbitMQConnectionAppSetting",
            "direction": "out"
        }
    ]
}

C# betik kodu aşağıdadır:

using System;
using Microsoft.Extensions.Logging;

public static void Run(string input, out string outputMessage, ILogger log)
{
    log.LogInformation(input);
    outputMessage = input;
}

SendGrid çıkışı

Aşağıdaki örnekte, bir function.json dosyasında sendGrid çıkış bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir.

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "bindings": [
        {
          "type": "queueTrigger",
          "name": "mymsg",
          "queueName": "myqueue",
          "connection": "AzureWebJobsStorage",
          "direction": "in"
        },
        {
          "type": "sendGrid",
          "name": "$return",
          "direction": "out",
          "apiKey": "SendGridAPIKeyAsAppSetting",
          "from": "{FromEmail}",
          "to": "{ToEmail}"
        }
    ]
}

C# betik kodu aşağıdadır:

#r "SendGrid"

using System;
using SendGrid.Helpers.Mail;
using Microsoft.Azure.WebJobs.Host;

public static SendGridMessage Run(Message mymsg, ILogger log)
{
    SendGridMessage message = new SendGridMessage()
    {
        Subject = $"{mymsg.Subject}"
    };
    
    message.AddContent("text/plain", $"{mymsg.Content}");

    return message;
}
public class Message
{
    public string ToEmail { get; set; }
    public string FromEmail { get; set; }
    public string Subject { get; set; }
    public string Content { get; set; }
}

SignalR tetikleyicisi

function.json dosyasındaki verileri bağlama örneği aşağıda verilmişti:

{
    "type": "signalRTrigger",
    "name": "invocation",
    "hubName": "SignalRTest",
    "category": "messages",
    "event": "SendMessage",
    "parameterNames": [
        "message"
    ],
    "direction": "in"
}

Kod şu şekildedir:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using System;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using Microsoft.Extensions.Logging;

public static void Run(InvocationContext invocation, string message, ILogger logger)
{
    logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
}

SignalR girişi

Aşağıdaki örnekte, bir function.json dosyasında SignalR bağlantı bilgileri giriş bağlaması ve bağlantı bilgilerini döndürmek için bağlamayı kullanan bir C# Betiği işlevi gösterilmektedir.

function.json dosyasındaki bağlama verileri aşağıdadır:

Örnek function.json:

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "chat",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

C# Betik kodu şu şekildedir:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static SignalRConnectionInfo Run(HttpRequest req, SignalRConnectionInfo connectionInfo)
{
    return connectionInfo;
}

Bağlama özelliğini bir bağlama ifadesi kullanarak üst bilgiden değere ayarlayabilirsinizuserId: {headers.x-ms-client-principal-id} veya {headers.x-ms-client-principal-name}.

Örnek function.json:

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "chat",
    "userId": "{headers.x-ms-client-principal-id}",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

C# Betik kodu şu şekildedir:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static SignalRConnectionInfo Run(HttpRequest req, SignalRConnectionInfo connectionInfo)
{
    // connectionInfo contains an access key token with a name identifier
    // claim set to the authenticated user
    return connectionInfo;
}

SignalR çıkışı

function.json dosyasındaki bağlama verileri aşağıdadır:

Örnek function.json:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

C# Betik kodu şu şekildedir:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

SignalR iletisinde kullanıcı kimliğini ayarlayarak yalnızca bir kullanıcıya kimliği doğrulanmış bağlantılara ileti gönderebilirsiniz.

Örnek function.json:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

C# betik kodu aşağıdadır:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            // the message will only be sent to this user ID
            UserId = "userId1",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

SignalR iletisindeki grup adını ayarlayarak yalnızca gruba eklenmiş bağlantılara ileti gönderebilirsiniz.

Örnek function.json:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

C# Betik kodu şu şekildedir:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            // the message will be sent to the group with this name
            GroupName = "myGroup",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

SignalR Hizmeti, kullanıcıların veya bağlantıların gruplara eklenmesine izin verir. Daha sonra iletiler bir gruba gönderilebilir. Grupları yönetmek için çıkış bağlamasını SignalR kullanabilirsiniz.

Aşağıdaki örnek bir gruba kullanıcı ekler.

Örnek function.json

{
    "type": "signalR",
    "name": "signalRGroupActions",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "hubName": "chat",
    "direction": "out"
}

Run.csx

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Add
        });
}

Aşağıdaki örnek, bir kullanıcıyı gruptan kaldırır.

Örnek function.json

{
    "type": "signalR",
    "name": "signalRGroupActions",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "hubName": "chat",
    "direction": "out"
}

Run.csx

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Remove
        });
}

Twilio çıkışı

Aşağıdaki örnekte, bir function.json dosyasındaki Twilio çıkış bağlaması ve bağlamayı kullanan bir C# betik işlevi gösterilmektedir. işlevi, kısa mesaj göndermek için bir out parametre kullanır.

function.json dosyasındaki bağlama verileri aşağıdadır:

Örnek function.json:

{
  "type": "twilioSms",
  "name": "message",
  "accountSidSetting": "TwilioAccountSid",
  "authTokenSetting": "TwilioAuthToken",
  "from": "+1425XXXXXXX",
  "direction": "out",
  "body": "Azure Functions Testing"
}

C# betik kodu aşağıdadır:

#r "Newtonsoft.Json"
#r "Twilio"
#r "Microsoft.Azure.WebJobs.Extensions.Twilio"

using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

public static void Run(string myQueueItem, out CreateMessageOptions message,  ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

    // In this example the queue item is a JSON string representing an order that contains the name of a
    // customer and a mobile number to send text updates to.
    dynamic order = JsonConvert.DeserializeObject(myQueueItem);
    string msg = "Hello " + order.name + ", thank you for your order.";

    // You must initialize the CreateMessageOptions variable with the "To" phone number.
    message = new CreateMessageOptions(new PhoneNumber("+1704XXXXXXX"));

    // A dynamic message can be set instead of the body in the output binding. In this example, we use
    // the order information to personalize a text message.
    message.Body = msg;
}

Zaman uyumsuz kodda out parametrelerini kullanamazsınız. Zaman uyumsuz bir C# betik kodu örneği aşağıda verilmiştir:

#r "Newtonsoft.Json"
#r "Twilio"
#r "Microsoft.Azure.WebJobs.Extensions.Twilio"

using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

public static async Task Run(string myQueueItem, IAsyncCollector<CreateMessageOptions> message,  ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

    // In this example the queue item is a JSON string representing an order that contains the name of a
    // customer and a mobile number to send text updates to.
    dynamic order = JsonConvert.DeserializeObject(myQueueItem);
    string msg = "Hello " + order.name + ", thank you for your order.";

    // You must initialize the CreateMessageOptions variable with the "To" phone number.
    CreateMessageOptions smsText = new CreateMessageOptions(new PhoneNumber("+1704XXXXXXX"));

    // A dynamic message can be set instead of the body in the output binding. In this example, we use
    // the order information to personalize a text message.
    smsText.Body = msg;

    await message.AddAsync(smsText);
}

Isınma tetikleyicisi

Aşağıdaki örnekte, function.json dosyasındaki bir ısınma tetikleyicisi ve uygulamanıza eklendiğinde her yeni örnekte çalışan bir C# betik işlevi gösterilmektedir.

İşlevler çalışma zamanının 1.x sürümü için desteklenmez.

İşte function.json dosyası:

{
    "bindings": [
        {
            "type": "warmupTrigger",
            "direction": "in",
            "name": "warmupContext"
        }
    ]
}
public static void Run(WarmupContext warmupContext, ILogger log)
{
    log.LogInformation("Function App instance is warm.");  
}

Sonraki adımlar