Naslaginformatie voor Azure Functions C#-script (.csx) voor ontwikkelaars

Dit artikel is een inleiding tot het ontwikkelen van Azure Functions met behulp van C#-script (.csx).

Belangrijk

C#-script wordt voornamelijk ondersteund om een handige in-portal-ervaring te bieden waarmee u snel aan de slag kunt met het maken en uitvoeren van C#-functies. Voor apps van productiekwaliteit moet u in plaats daarvan uw C#-functies lokaal ontwikkelen als een gecompileerd C#-klassebibliotheekproject. Als u wilt weten hoe u een C#-scriptproject migreert naar een C#-klassebibliotheekproject (geïsoleerde werkrol), raadpleegt u Een C#-script-app converteren naar een C#-project.

Met Azure Functions kunt u functies ontwikkelen met behulp van C# op een van de volgende manieren:

Type Uitvoeringsproces Code-extensie Ontwikkelomgeving Verwijzing
C#-script in-process .Csx Portal
Core Tools
Dit artikel
C#-klassebibliotheek (geïsoleerde werkrol) geïsoleerd werkproces .cs Visual Studio
Visual Studio Code
Core Tools
.NET geïsoleerde werkprocesfuncties
C#-klassebibliotheek (in proces) in-process .cs Visual Studio
Visual Studio Code
Core Tools
C#-klassenbibliotheekfuncties in proces

Hoe .csx werkt

Gegevens stromen via methodeargumenten naar uw C#-functie. Argumentnamen worden opgegeven in een function.json bestand en er zijn vooraf gedefinieerde namen voor toegang tot zaken zoals de functielogger en annuleringstokens.

Met de .csx-indeling kunt u minder 'standaard' schrijven en zich richten op het schrijven van alleen een C#-functie. In plaats van alles in een naamruimte en klasse te verpakken, definieert u gewoon een Run methode. Neem eventuele assemblyverwijzingen en naamruimten aan het begin van het bestand op zoals gebruikelijk.

De .csx-bestanden van een functie-app worden gecompileerd wanneer een exemplaar wordt geïnitialiseerd. Deze compilatiestap betekent dat het mogelijk langer duurt voor C#-scriptfuncties in vergelijking met C#-klassebibliotheken. Deze compilatiestap is ook waarom C#-scriptfuncties kunnen worden bewerkt in Azure Portal, terwijl C#-klassebibliotheken dat niet zijn.

Mapstructuur

De mapstructuur voor een C#-scriptproject ziet eruit als in het volgende voorbeeld:

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

Er is een gedeeld host.json-bestand dat kan worden gebruikt om de functie-app te configureren. Elke functie heeft een eigen codebestand (.csx) en bindingsconfiguratiebestand (function.json).

De bindingsextensies die vereist zijn in versie 2.x en latere versies van de Functions-runtime, worden gedefinieerd in het extensions.csproj bestand, met de werkelijke bibliotheekbestanden in de bin map. Wanneer u lokaal ontwikkelt, moet u bindingsextensies registreren. Wanneer u functies in Azure Portal ontwikkelt, wordt deze registratie voor u uitgevoerd.

Binding met argumenten

Invoer- of uitvoergegevens zijn gebonden aan een C#-scriptfunctieparameter via de name eigenschap in het configurationbestand function.json . In het volgende voorbeeld ziet u een function.json-bestand en run.csx-bestand voor een door wachtrij geactiveerde functie. De parameter die gegevens van het wachtrijbericht ontvangt, krijgt een naam myQueueItem omdat dit de waarde van de name eigenschap is.

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

De #r instructie wordt verderop in dit artikel uitgelegd.

Ondersteunde typen voor bindingen

Elke binding heeft zijn eigen ondersteunde typen; Een blobtrigger kan bijvoorbeeld worden gebruikt met een tekenreeksparameter, een POCO-parameter, een CloudBlockBlob parameter of een van de verschillende andere ondersteunde typen. Het referentieartikel voor bindingen voor blobbindingen bevat alle ondersteunde parametertypen voor blobtriggers. Zie Triggers en bindingen en de referentiedocumenten voor bindingen voor elk bindingstype voor meer informatie.

Tip

Als u van plan bent om de HTTP- of WebHook-bindingen te gebruiken, plan dan om uitputting van de poort te voorkomen. Dat kan worden veroorzaakt door onjuiste instantie-instellingen van HttpClient. Raadpleeg Verbindingen beheren in Azure Functions voor meer informatie.

Verwijzen naar aangepaste klassen

Als u een aangepaste POCO-klasse (Plain Old CLR Object) wilt gebruiken, kunt u de klassedefinitie opnemen in hetzelfde bestand of in een afzonderlijk bestand plaatsen.

In het volgende voorbeeld ziet u een run.csx-voorbeeld met een POCO-klassedefinitie.

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

Een POCO-klasse moet een getter en setter hebben gedefinieerd voor elke eigenschap.

.csx-code opnieuw gebruiken

U kunt klassen en methoden gebruiken die zijn gedefinieerd in andere .csx-bestanden in uw run.csx-bestand . #load Gebruik hiervoor instructies in uw run.csx-bestand. In het volgende voorbeeld wordt een logboekroutine met de naam MyLogger gedeeld in myLogger.csx en geladen in run.csx met behulp van de #load instructie:

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

Voorbeeld van mylogger.csx:

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

Het gebruik van een gedeeld .csx-bestand is een veelvoorkomend patroon wanneer u de gegevens die worden doorgegeven tussen functies sterk wilt typen met behulp van een POCO-object. In het volgende vereenvoudigde voorbeeld delen een HTTP-trigger en wachtrijtrigger een POCO-object met de naam Order om de ordergegevens sterk te typen:

Voorbeeld run.csx voor HTTP-trigger:

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

Voorbeeld run.csx voor wachtrijtrigger:

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

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

U kunt een relatief pad gebruiken met de #load instructie:

  • #load "mylogger.csx" laadt een bestand in de functiemap.
  • #load "loadedfiles\mylogger.csx" laadt een bestand in een map in de functiemap.
  • #load "..\shared\mylogger.csx" laadt een bestand in een map op hetzelfde niveau als de functiemap, dat wil gezegd, rechtstreeks onder wwwroot.

De #load richtlijn werkt alleen met .csx-bestanden , niet met .cs-bestanden .

Binding naar methode retourwaarde

U kunt een retourwaarde voor een methode gebruiken voor een uitvoerbinding met behulp van de naam $return in function.json.

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

Hier volgt de C#-scriptcode met behulp van de retourwaarde, gevolgd door een asynchroon voorbeeld:

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

Gebruik de retourwaarde alleen als een geslaagde functie-uitvoering altijd resulteert in een retourwaarde die moet worden doorgegeven aan de uitvoerbinding. ICollector Gebruik anders ofIAsyncCollector, zoals wordt weergegeven in de volgende sectie.

Meerdere uitvoerwaarden schrijven

Als u meerdere waarden wilt schrijven naar een uitvoerbinding, of als een geslaagde functieaanroep mogelijk niets tot gevolg heeft dat aan de uitvoerbinding wordt doorgegeven, gebruikt u de of IAsyncCollector typenICollector. Deze typen zijn alleen-schrijven verzamelingen die naar de uitvoerbinding worden geschreven wanneer de methode is voltooid.

In dit voorbeeld worden meerdere wachtrijberichten in dezelfde wachtrij geschreven met behulp van ICollector:

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

Logboekregistratie

Als u uitvoer wilt vastleggen in uw streaminglogboeken in C#, neemt u een argument van het type ILogger op. U wordt aangeraden deze logeen naam te geven. Vermijd het gebruik Console.Write in Azure Functions.

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

Notitie

Zie de ILogger-documentatie in de ontwikkelaarshandleiding voor .NET-klassenbibliotheek voor informatie over een nieuwer framework voor logboekregistratie dat u kunt gebruiken in plaats vanTraceWriter.

Logboekregistratie van aangepaste metrische gegevens

U kunt de LogMetric extensiemethode gebruiken ILogger om aangepaste metrische gegevens te maken in Application Insights. Hier volgt een voorbeeldmethode-aanroep:

logger.LogMetric("TestMetric", 1234);

Deze code is een alternatief voor het aanroepen TrackMetric met behulp van de Application Insights-API voor .NET.

Async

Als u een functie asynchroon wilt maken, gebruikt u het async trefwoord en retourneert u een Task object.

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

U kunt geen parameters in asynchrone functies gebruiken out . Voor uitvoerbindingen gebruikt u in plaats daarvan de retourwaarde van de functie of een collectorobject.

Annuleringstokens

Een functie kan een CancellationToken-parameter accepteren, waardoor het besturingssysteem uw code kan melden wanneer de functie op het punt staat te worden beëindigd. U kunt deze melding gebruiken om ervoor te zorgen dat de functie niet onverwacht wordt beëindigd op een manier die gegevens in een inconsistente status laat.

In het volgende voorbeeld ziet u hoe u kunt controleren of de functie wordt beëindigd.

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

Naamruimten importeren

Als u naamruimten wilt importeren, kunt u dit doen zoals gebruikelijk, met de using component.

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

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

De volgende naamruimten worden automatisch geïmporteerd en zijn daarom optioneel:

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

Verwijzen naar externe assembly's

Voeg voor frameworkassembly's verwijzingen toe met behulp van de #r "AssemblyName" richtlijn.

#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)

De volgende assembly's worden automatisch toegevoegd door de Azure Functions-hostingomgeving:

  • 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

Naar de volgende assembly's kan worden verwezen met een eenvoudige naam, op runtimeversie:

  • Newtonsoft.Json
  • Microsoft.WindowsAzure.Storage*

*Verwijderd in versie 4.x van de runtime.

In code worden assembly's verwezen zoals in het volgende voorbeeld:

#r "AssemblyName"

Verwijzen naar aangepaste assembly's

Als u wilt verwijzen naar een aangepaste assembly, kunt u een gedeelde assembly of een privéassembly gebruiken:

  • Gedeelde assembly's worden gedeeld tussen alle functies in een functie-app. Als u naar een aangepaste assembly wilt verwijzen, uploadt u de assembly naar een map met de naam bin in de hoofdmap (wwwroot) van uw functie-app.

  • Privéassembly's maken deel uit van de context van een bepaalde functie en ondersteunen sideloading van verschillende versies. Privéassembly's moeten worden geüpload in een bin map in de functiemap. Verwijs naar de assembly's met behulp van de bestandsnaam, zoals #r "MyAssembly.dll".

Zie de sectie over pakketbeheer voor informatie over het uploaden van bestanden naar uw functiemap.

Bekeken mappen

De map met het functiescriptbestand wordt automatisch gecontroleerd op wijzigingen in assembly's. Als u wilt kijken naar assemblywijzigingen in andere directory's, voegt u deze toe aan de watchDirectories lijst in host.json.

NuGet-pakketten gebruiken

De manier waarop zowel bindingsuitbreidingspakketten als andere NuGet-pakketten worden toegevoegd aan uw functie-app, is afhankelijk van de doelversie van de Functions-runtime.

Standaard worden de ondersteunde set NuGet-pakketten van de Functions-extensie beschikbaar gemaakt voor uw C#-scriptfunctie-app met behulp van extensiebundels. Zie Uitbreidingsbundels voor meer informatie.

Als u om een of andere reden geen extensiebundels in uw project kunt gebruiken, kunt u ook de Azure Functions Core Tools gebruiken om extensies te installeren op basis van bindingen die zijn gedefinieerd in de function.json-bestanden in uw app. Wanneer u Core Tools gebruikt om extensies te registreren, moet u de --csx optie gebruiken. Zie func-extensies installeren voor meer informatie.

Core Tools leest standaard de function.json-bestanden en voegt de vereiste pakketten toe aan een projectbestand extensions.csproj C#-klassebibliotheek in de hoofdmap van het bestandssysteem van de functie-app (wwwroot). Omdat Core Tools dotnet.exe gebruikt, kunt u deze gebruiken om een NuGet-pakketverwijzing toe te voegen aan dit extensiebestand. Tijdens de installatie worden de extensions.csproj door Core Tools gebouwd om de vereiste bibliotheken te installeren. Hier volgt een voorbeeld van extensies.csproj-bestand dat een verwijzing toevoegt naar Microsoft.ProjectOxford.Face versie 1.1.0:

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

Notitie

Voor C#-script (.csx) moet u instellen TargetFramework op een waarde van netstandard2.0. Andere doelframeworks, zoals net6.0, worden niet ondersteund.

Als u een aangepaste NuGet-feed wilt gebruiken, geeft u de feed op in een Nuget.Config-bestand in de hoofdmap van de functie-app. Zie NuGet-gedrag configureren voor meer informatie.

Als u alleen in de portal aan uw project werkt, moet u handmatig het bestand extensions.csproj of een Nuget.Config-bestand rechtstreeks op de site maken. Zie Extensies handmatig installeren voor meer informatie.

Omgevingsvariabelen

Als u een omgevingsvariabele of een app-instellingswaarde wilt ophalen, gebruikt System.Environment.GetEnvironmentVariableu , zoals wordt weergegeven in het volgende codevoorbeeld:

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

Beleid opnieuw proberen

Functions ondersteunt twee ingebouwde beleidsregels voor opnieuw proberen. Zie Beleid voor opnieuw proberen voor meer informatie.

Dit is het beleid voor opnieuw proberen in het bestand function.json :

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}
function.json-eigenschap Beschrijving
Strategie Gebruik fixedDelay.
maxRetryCount Vereist. Het maximum aantal nieuwe pogingen dat is toegestaan per functie-uitvoering. -1 betekent dat u het voor onbepaalde tijd opnieuw wilt proberen.
delayInterval De vertraging die wordt gebruikt tussen nieuwe pogingen. Geef deze op als een tekenreeks met de notatie HH:mm:ss.

Binding tijdens runtime

In C# en andere .NET-talen kunt u een imperatief bindingspatroon gebruiken in plaats van de declaratieve bindingen in function.json. Imperatieve binding is handig wanneer bindingsparameters tijdens runtime moeten worden berekend in plaats van ontwerptijd. Met dit patroon kunt u on-the-fly bindingen verbinden met ondersteunde invoer- en uitvoerbindingen in uw functiecode.

Definieer als volgt een imperatieve binding:

  • Neem geen vermelding op in function.json voor de gewenste imperatieve bindingen.
  • Geef een invoerparameter Binder binder of IBinder binder.
  • Gebruik het volgende C#-patroon om de gegevensbinding uit te voeren.
using (var output = await binder.BindAsync<T>(new BindingTypeAttribute(...)))
{
    ...
}

BindingTypeAttribute is het .NET-kenmerk dat uw binding definieert en T een invoer- of uitvoertype is dat wordt ondersteund door dat bindingstype. T kan geen out parametertype zijn (zoals out JObject). De Mobile Apps-tabeluitvoerbinding ondersteunt bijvoorbeeld zes uitvoertypen, maar u kunt alleen ICollector<T> of IAsyncCollector<T> voor Tgebruiken.

Voorbeeld van één kenmerk

Met de volgende voorbeeldcode maakt u een storage-blobuitvoerbinding met het blobpad dat tijdens de runtime is gedefinieerd en schrijft u vervolgens een tekenreeks naar de blob.

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 definieert de invoer- of uitvoerbinding van de opslagblob en TextWriter is een ondersteund type uitvoerbinding.

Voorbeeld van meerdere kenmerken

In het voorgaande voorbeeld wordt de app-instelling voor het hoofdopslagaccount van de functie-app verbindingsreeks (dat wil AzureWebJobsStoragewel). U kunt een aangepaste app-instelling opgeven die moet worden gebruikt voor het opslagaccount door de StorageAccountAttribute toe te voegen en de kenmerkmatrix door te geven aan BindAsync<T>(). Gebruik een Binder parameter, niet IBinder. Voorbeeld:

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

De volgende tabel bevat de .NET-kenmerken voor elk bindingstype en de pakketten waarin ze zijn gedefinieerd.

Binding Kenmerk Verwijzing toevoegen
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"
Opslagwachtrij Microsoft.Azure.WebJobs.QueueAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Opslagblob Microsoft.Azure.WebJobs.BlobAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Opslagtabel Microsoft.Azure.WebJobs.TableAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Twilio Microsoft.Azure.WebJobs.TwilioSmsAttribute #r "Microsoft.Azure.WebJobs.Extensions.Twilio"

Een C#-script-app converteren naar een C#-project

De eenvoudigste manier om een C#-scriptfunctie-app te converteren naar een gecompileerd C#-klassebibliotheekproject is om te beginnen met een nieuw project. Vervolgens kunt u voor elke functie de code en configuratie migreren van elk run.csx-bestand en function.json-bestand in een functiemap naar één nieuw .cs-klassebibliotheekcodebestand. Als u bijvoorbeeld een C#-scriptfunctie hebt met de naam HelloWorld , hebt u twee bestanden: HelloWorld/run.csx en HelloWorld/function.json. Voor deze functie maakt u een codebestand met de naam HelloWorld.cs in uw nieuwe klassebibliotheekproject.

Als u C#-scripts gebruikt voor het bewerken van de portal, kunt u de app-inhoud downloaden naar uw lokale computer. Kies de optie Site-inhoud in plaats van het Project Content en Visual Studio. U hoeft geen project te genereren en u hoeft geen toepassingsinstellingen op te nemen in de download. U definieert een nieuwe ontwikkelomgeving en deze omgeving mag niet dezelfde machtigingen hebben als uw gehoste app-omgeving.

Deze instructies laten zien hoe u C#-scriptfuncties (die worden uitgevoerd in proces met de Functions-host) converteert naar C#-klassebibliotheekfuncties die worden uitgevoerd in een geïsoleerd werkproces.

  1. Voltooi de sectie Een functions-app-project maken vanuit de quickstart van uw voorkeur:


  1. Als uw oorspronkelijke C#-scriptcode een extensions.csproj bestand of bestanden function.proj bevat, kopieert u de pakketverwijzingen uit dit bestand en voegt u deze toe aan het bestand van .csproj het nieuwe project in hetzelfde ItemGroup met de functions-kernafhankelijkheden.

    Tip

    Conversie biedt een goede mogelijkheid om bij te werken naar de nieuwste versies van uw afhankelijkheden. Hiervoor zijn mogelijk aanvullende codewijzigingen in een latere stap vereist.

  2. Kopieer de inhoud van het oorspronkelijke host.json bestand naar het bestand van host.json het nieuwe project, met uitzondering van de extensionBundles sectie (gecompileerde C#-projecten gebruiken geen uitbreidingsbundels en u moet expliciet verwijzingen toevoegen naar alle extensies die door uw functies worden gebruikt). Wanneer u host.json-bestanden samenvoegt, moet u er rekening mee houden dat het schema versie 2.0 heeft, waarbij de host.json meeste apps versie 2.0 gebruiken. De inhoud van de extensions sectie kan verschillen op basis van specifieke versies van de bindingsextensies die door uw functies worden gebruikt. Zie artikelen over afzonderlijke extensieverwijzingen voor meer informatie over het correct configureren van de host.json voor uw specifieke versies.

  3. Voor gedeelde bestanden waarnaar wordt verwezen door een #load richtlijn, maakt u een nieuw .cs bestand voor elk van deze gedeelde verwijzingen. Het is eenvoudigst om een nieuw .cs bestand te maken voor elke definitie van een gedeelde klasse. Als er statische methoden zonder klasse zijn, moet u nieuwe klassen voor deze methoden definiëren.

  4. Voer de volgende taken uit voor elke <FUNCTION_NAME> map in het oorspronkelijke project:

    1. Maak een nieuw bestand met de naam <FUNCTION_NAME>.csen vervang dit <FUNCTION_NAME> door de naam van de map die de C#-scriptfunctie heeft gedefinieerd. U kunt op de volgende manier een nieuw functiecodebestand maken op basis van een van de triggerspecifieke sjablonen:

      Gebruik de func new --name <FUNCTION_NAME> opdracht en kies de juiste triggersjabloon bij de prompt.

    2. Kopieer de using instructies uit het run.csx bestand en voeg ze toe aan het nieuwe bestand. U hebt geen #r instructies nodig.

    3. Voeg voor elke #load instructie in uw run.csx bestand een nieuwe using instructie toe voor de naamruimte die u hebt gebruikt voor de gedeelde code.

    4. Definieer in het nieuwe bestand een klasse voor uw functie onder de naamruimte die u voor het project gebruikt.

    5. Maak een nieuwe methode met de naam RunHandler of iets dergelijks. Deze nieuwe methode fungeert als het nieuwe toegangspunt voor de functie.

    6. Kopieer de statische methode die uw functie vertegenwoordigt, samen met eventuele functies die worden aangeroepen, van run.csx naar uw nieuwe klasse als een tweede methode. Vanuit de nieuwe methode die u in de vorige stap hebt gemaakt, roept u deze statische methode aan. Deze indirecte stap is handig voor het navigeren door eventuele verschillen wanneer u de upgrade voortzet. U kunt de oorspronkelijke methode precies hetzelfde houden en eenvoudig de invoer van de nieuwe context beheren. Mogelijk moet u parameters maken voor de nieuwe methode die u vervolgens doorgeeft aan de aanroep van de statische methode. Nadat u hebt bevestigd dat de migratie naar behoren heeft gewerkt, kunt u dit extra niveau van indirectie verwijderen.

    7. Voeg voor elke binding in het function.json bestand het bijbehorende kenmerk toe aan uw nieuwe methode. Zie Bindingen handmatig toevoegen op basis van voorbeelden om snel bindingsvoorbeelden te vinden.

    8. Voeg uitbreidingspakketten toe die vereist zijn voor de bindingen aan uw project, als u dit nog niet hebt gedaan.

  5. Maak alle toepassingsinstellingen die vereist zijn voor uw app opnieuw in de Values verzameling van het bestand local.settings.json.

  6. Controleer of uw project lokaal wordt uitgevoerd:

    Gebruik func start deze opdracht om uw app uit te voeren vanaf de opdrachtregel. Zie Functies lokaal uitvoeren voor meer informatie.

  7. Publiceer uw project naar een nieuwe functie-app in Azure:

    Maak uw Azure-resources en implementeer het codeproject in Azure met behulp van de func azure functionapp publish <APP_NAME> opdracht. Zie Projectbestanden implementeren voor meer informatie.

Voorbeeld van functieconversie

In deze sectie ziet u een voorbeeld van de migratie voor één functie.

De oorspronkelijke functie in C#-scripts heeft twee bestanden:

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

De inhoud van HelloWorld/function.json :

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

De inhoud van HelloWorld/run.csx :

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

Na de migratie naar het geïsoleerde werkrolmodel met ASP.NET Core-integratie, worden deze vervangen door één HelloWorld.cs:

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

Bindingsconfiguratie en voorbeelden

Deze sectie bevat verwijzingen en voorbeelden voor het definiëren van triggers en bindingen in C#-script.

Blob-trigger

In de volgende tabel worden de bindingsconfiguratie-eigenschappen voor het C#-script uitgelegd dat u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op blobTrigger. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
direction Moet worden ingesteld op in. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
name De naam van de variabele die de blob in functiecode vertegenwoordigt.
path De container die moet worden bewaakt. Dit kan een blobnaampatroon zijn.
verbinding De naam van een app-instelling of verzameling die aangeeft hoe verbinding moet worden gemaakt met Azure Blobs. Zie Verbinding maken ions.

In het volgende voorbeeld ziet u een blobtriggerdefinitie in een function.json-bestand en code die gebruikmaakt van de binding. De functie schrijft een logboek wanneer een blob wordt toegevoegd of bijgewerkt in de samples-workitemscontainer.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Met de tekenreeks {name} in het pad van de blobtrigger samples-workitems/{name} wordt een bindingsexpressie gemaakt die u in functiecode kunt gebruiken voor toegang tot de bestandsnaam van de triggerende blob. Zie Blob-naampatronen voor meer informatie.

Hier volgt C#-scriptcode die wordt gekoppeld aan een Stream:

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

Hier volgt C#-scriptcode die wordt gekoppeld aan een CloudBlockBlob:

#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-invoer

In de volgende tabel worden de bindingsconfiguratie-eigenschappen voor het C#-script uitgelegd dat u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op blob.
direction Moet worden ingesteld op in.
name De naam van de variabele die de blob in functiecode vertegenwoordigt.
path Het pad naar de blob.
verbinding De naam van een app-instelling of verzameling die aangeeft hoe verbinding moet worden gemaakt met Azure Blobs. Zie Verbinding maken ions.

In het volgende voorbeeld ziet u blob-invoer- en uitvoerbindingen in een function.json-bestand en C#-scriptcode die gebruikmaakt van de bindingen. De functie maakt een kopie van een tekst-blob. De functie wordt geactiveerd door een wachtrijbericht dat de naam van de blob bevat die moet worden gekopieerd. De nieuwe blob heeft de naam {originalblobname}-Copy.

In het bestand function.json wordt de queueTrigger eigenschap metagegevens gebruikt om de blobnaam op te geven in de path eigenschappen:

{
  "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
}

Dit is de C# Script-code:

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

Blob-uitvoer

In de volgende tabel worden de bindingsconfiguratie-eigenschappen voor het C#-script uitgelegd dat u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op blob.
direction Moet worden ingesteld op out.
name De naam van de variabele die de blob in functiecode vertegenwoordigt.
path Het pad naar de blob.
verbinding De naam van een app-instelling of verzameling die aangeeft hoe verbinding moet worden gemaakt met Azure Blobs. Zie Verbinding maken ions.

In het volgende voorbeeld ziet u blob-invoer- en uitvoerbindingen in een function.json-bestand en C#-scriptcode die gebruikmaakt van de bindingen. De functie maakt een kopie van een tekst-blob. De functie wordt geactiveerd door een wachtrijbericht dat de naam van de blob bevat die moet worden gekopieerd. De nieuwe blob heeft de naam {originalblobname}-Copy.

In het bestand function.json wordt de queueTrigger eigenschap metagegevens gebruikt om de blobnaam op te geven in de path eigenschappen:

{
  "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
}

Dit is de C# Script-code:

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

RabbitMQ-trigger

In het volgende voorbeeld ziet u een RabbitMQ-triggerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie leest en registreert het RabbitMQ-bericht.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

using System;

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

Wachtrijtrigger

In de volgende tabel worden de bindingsconfiguratie-eigenschappen voor het C#-script uitgelegd dat u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op queueTrigger. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
direction Alleen in het bestand function.json . Moet worden ingesteld op in. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
name De naam van de variabele die de nettolading van het wachtrijitem bevat in de functiecode.
queueName De naam van de wachtrij die moet worden gepeild.
verbinding De naam van een app-instelling of verzameling die aangeeft hoe verbinding moet worden gemaakt met Azure Queues. Zie Verbinding maken ions.

In het volgende voorbeeld ziet u een wachtrijtriggerbinding in een function.json-bestand en C#-scriptcode die gebruikmaakt van de binding. De functie peilt de myqueue-items wachtrij en schrijft een logboek telkens wanneer een wachtrij-item wordt verwerkt.

Dit is het bestand function.json :

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

Dit is de C# Script-code:

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

Wachtrijuitvoer

In de volgende tabel worden de bindingsconfiguratie-eigenschappen voor het C#-script uitgelegd dat u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op queue. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
direction Moet worden ingesteld op out. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
name De naam van de variabele die de wachtrij in functiecode vertegenwoordigt. Ingesteld om $return te verwijzen naar de retourwaarde van de functie.
queueName De naam van de wachtrij.
verbinding De naam van een app-instelling of verzameling die aangeeft hoe verbinding moet worden gemaakt met Azure Queues. Zie Verbinding maken ions.

In het volgende voorbeeld ziet u een HTTP-triggerbinding in een function.json-bestand en C#-scriptcode die gebruikmaakt van de binding. De functie maakt een wachtrijitem met een payload van het CustomQueueMessage-object voor elke ontvangen HTTP-aanvraag.

Dit is het bestand function.json :

{
  "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"
    }
  ]
}

Hier volgt C#-scriptcode waarmee één wachtrijbericht wordt gemaakt:

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

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

U kunt meerdere berichten tegelijk verzenden met behulp van een ICollector of IAsyncCollector parameter. Hier volgt C#-scriptcode waarmee meerdere berichten worden verzonden, één met de HTTP-aanvraaggegevens en één met vastgelegde waarden:

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

Tabelinvoer

In deze sectie vindt u een overzicht van de ondersteuning voor de table-API-versie van de extensie .

In de volgende tabel worden de bindingsconfiguratie-eigenschappen voor het C#-script uitgelegd dat u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op table. Deze eigenschap wordt automatisch ingesteld wanneer u de binding maakt in Azure Portal.
direction Moet worden ingesteld op in. Deze eigenschap wordt automatisch ingesteld wanneer u de binding maakt in Azure Portal.
name De naam van de variabele die de tabel of entiteit in functiecode vertegenwoordigt.
tableName De naam van de tabel.
partitionKey Optioneel. De partitiesleutel van de tabelentiteit die moet worden gelezen.
rowKey Optioneel. De rijsleutel van de tabelentiteit die moet worden gelezen. Kan niet worden gebruikt met take of filter.
Nemen Optioneel. Het maximum aantal entiteiten dat moet worden geretourneerd. Kan niet worden gebruikt met rowKey.
filter Optioneel. Een OData-filterexpressie voor de entiteiten die moeten worden geretourneerd uit de tabel. Kan niet worden gebruikt met rowKey.
verbinding De naam van een app-instelling of instellingsverzameling die aangeeft hoe verbinding moet worden gemaakt met de tabelservice. Zie Verbinding maken ions.

In het volgende voorbeeld ziet u een tabelinvoerbinding in een function.json-bestand en C#-scriptcode die gebruikmaakt van de binding. De functie gebruikt een wachtrijtrigger om één tabelrij te lezen.

Het bestand function.json geeft een partitionKey en een rowKey. De rowKey waarde {queueTrigger} geeft aan dat de rijsleutel afkomstig is van de tekenreeks van het wachtrijbericht.

{
  "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
}

Dit is de C# Script-code:

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

Tabeluitvoer

In deze sectie vindt u een overzicht van de ondersteuning voor de table-API-versie van de extensie .

In de volgende tabel worden de bindingsconfiguratie-eigenschappen voor het C#-script uitgelegd dat u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op table. Deze eigenschap wordt automatisch ingesteld wanneer u de binding maakt in Azure Portal.
direction Moet worden ingesteld op out. Deze eigenschap wordt automatisch ingesteld wanneer u de binding maakt in Azure Portal.
name De naam van de variabele die wordt gebruikt in functiecode die de tabel of entiteit vertegenwoordigt. Ingesteld om $return te verwijzen naar de retourwaarde van de functie.
tableName De naam van de tabel waarnaar moet worden geschreven.
partitionKey De partitiesleutel van de tabelentiteit die moet worden geschreven.
rowKey De rijsleutel van de tabelentiteit die moet worden geschreven.
verbinding De naam van een app-instelling of instellingsverzameling die aangeeft hoe verbinding moet worden gemaakt met de tabelservice. Zie Verbinding maken ions.

In het volgende voorbeeld ziet u een tabeluitvoerbinding in een function.json-bestand en C#-scriptcode die gebruikmaakt van de binding. De functie schrijft meerdere tabelentiteiten.

Dit is het bestand function.json :

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

Dit is de C# Script-code:

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

Timertrigger

In de volgende tabel worden de bindingsconfiguratie-eigenschappen voor het C#-script uitgelegd dat u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op timerTrigger. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
direction Moet worden ingesteld op in. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
name De naam van de variabele die het timerobject in functiecode vertegenwoordigt.
schedule Een CRON-expressie of een TimeSpan-waarde . Een TimeSpan kan alleen worden gebruikt voor een functie-app die wordt uitgevoerd op een App Service-plan. U kunt de planningsexpressie in een app-instelling plaatsen en deze eigenschap instellen op de naam van de app-instelling die is verpakt in % tekens, zoals in dit voorbeeld: %ScheduleAppSetting%.
runOnStartup Als true, wordt de functie aangeroepen wanneer de runtime wordt gestart. De runtime wordt bijvoorbeeld gestart wanneer de functie-app wordt geactiveerd nadat deze inactief is gegaan vanwege inactiviteit. wanneer de functie-app opnieuw wordt opgestart als gevolg van functiewijzigingen en wanneer de functie-app wordt uitgeschaald. Wees voorzichtig.runOnStartup moet zelden worden ingesteld trueop , met name in productie.
useMonitor Stel in op true of false om aan te geven of de planning moet worden bewaakt. Planningsbewaking houdt de planningsexemplaren vast om ervoor te zorgen dat de planning correct wordt onderhouden, zelfs wanneer exemplaren van de functie-app opnieuw worden opgestart. Als deze niet expliciet is ingesteld, is true de standaardwaarde voor schema's met een terugkeerinterval dat groter is dan of gelijk is aan 1 minuut. Voor schema's die meer dan één keer per minuut worden geactiveerd, is de standaardwaarde false.

In het volgende voorbeeld ziet u een timertriggerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie schrijft een logboek dat aangeeft of deze functie aanroep te wijten is aan een gemiste planning. Het TimerInfo object wordt doorgegeven aan de functie.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

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-trigger

In de volgende tabel worden de eigenschappen van de triggerconfiguratie uitgelegd die u hebt ingesteld in het bestand function.json :

function.json-eigenschap Beschrijving
type Vereist - moet worden ingesteld op httpTrigger.
direction Vereist - moet worden ingesteld op in.
name Vereist: de naam van de variabele die wordt gebruikt in functiecode voor de aanvraag- of aanvraagbody.
authLevel Bepaalt welke sleutels aanwezig moeten zijn in de aanvraag om de functie aan te roepen. Zie Autorisatieniveau voor ondersteunde waarden.
Methoden Een matrix van de HTTP-methoden waarop de functie reageert. Als deze niet is opgegeven, reageert de functie op alle HTTP-methoden. Zie het HTTP-eindpunt aanpassen.
Route Definieert de routesjabloon, waarmee wordt bepaald op welke aanvraag-URL's uw functie reageert. De standaardwaarde als er geen is opgegeven, is <functionname>. Zie het HTTP-eindpunt aanpassen voor meer informatie.
webHookType Alleen ondersteund voor de runtime van versie 1.x.

Hiermee configureert u de HTTP-trigger om te fungeren als een webhookontvanger voor de opgegeven provider. Zie WebHooktype voor ondersteunde waarden.

In het volgende voorbeeld ziet u een triggerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie zoekt naar een name parameter in de querytekenreeks of de hoofdtekst van de HTTP-aanvraag.

Dit is het bestand function.json :

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

Hier volgt C#-scriptcode die wordt gekoppeld aan 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");
}

U kunt een aangepast object binden in plaats van HttpRequest. Dit object wordt gemaakt op basis van de hoofdtekst van de aanvraag en geparseerd als JSON. Op dezelfde manier kan een type worden doorgegeven aan de HTTP-antwoorduitvoerbinding en worden geretourneerd als de hoofdtekst van het antwoord, samen met een 200 statuscode.

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-uitvoer

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u hebt ingesteld in het bestand function.json .

Eigenschappen Beschrijving
type Moet worden ingesteld op http.
direction Moet worden ingesteld op out.
name De naam van de variabele die wordt gebruikt in functiecode voor het antwoord of $return om de retourwaarde te gebruiken.

Event Hubs-trigger

In de volgende tabel worden de eigenschappen van de triggerconfiguratie uitgelegd die u hebt ingesteld in het bestand function.json :

function.json-eigenschap Beschrijving
type Moet worden ingesteld op eventHubTrigger. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
direction Moet worden ingesteld op in. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
name De naam van de variabele die het gebeurtenisitem in functiecode vertegenwoordigt.
eventHubName Functions 2.x en hoger. De naam van de event hub. Wanneer de event hub-naam ook aanwezig is in de verbindingsreeks, overschrijft die waarde deze eigenschap tijdens runtime. Kan worden verwezen via app-instellingen%eventHubName%. In versie 1.x heeft deze eigenschap de naam path.
consumerGroup Een optionele eigenschap waarmee de consumentengroep wordt ingesteld die wordt gebruikt om abonnementen te nemen op gebeurtenissen in de hub. Als deze wordt weggelaten, wordt de $Default-consumentengroep gebruikt.
verbinding De naam van een app-instelling of instellingsverzameling die aangeeft hoe verbinding moet worden gemaakt met Event Hubs. Zie Verbinding maken ions.

In het volgende voorbeeld ziet u een Event Hubs-triggerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. Met de functie wordt de berichttekst van de Event Hubs-trigger geregistreerd.

In de volgende voorbeelden worden bindingsgegevens van Event Hubs weergegeven in het bestand function.json voor Functions Runtime versie 2.x en latere versies.

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

Dit is de C# Script-code:

using System;

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

Als u toegang wilt krijgen tot gebeurtenismetagegevens in functiecode, bindt u aan een EventData-object . U kunt ook toegang krijgen tot dezelfde eigenschappen met behulp van bindingsexpressies in de methodehandtekening. In het volgende voorbeeld ziet u beide manieren om dezelfde gegevens op te halen:

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

Als u gebeurtenissen in een batch wilt ontvangen, maakt u string of EventData een matrix:

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-uitvoer

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op eventHub.
direction Moet worden ingesteld op out. Deze parameter wordt automatisch ingesteld wanneer u de binding maakt in de Azure-portal.
name De naam van de variabele die in functiecode wordt gebruikt, vertegenwoordigt de gebeurtenis.
eventHubName Functions 2.x en hoger. De naam van de event hub. Wanneer de event hub-naam ook aanwezig is in de verbindingsreeks, overschrijft die waarde deze eigenschap tijdens runtime. In Functions 1.x heeft deze eigenschap de naam path.
verbinding De naam van een app-instelling of instellingsverzameling die aangeeft hoe verbinding moet worden gemaakt met Event Hubs. Zie Verbinding maken ions voor meer informatie.

In het volgende voorbeeld ziet u een event hub-triggerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie schrijft een bericht naar een Event Hub.

In de volgende voorbeelden worden bindingsgegevens van Event Hubs weergegeven in het bestand function.json voor Functions Runtime versie 2.x en latere versies.

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

Dit is de C#-scriptcode voor het maken van één bericht:

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

Dit is de C#-scriptcode voor het maken van meerdere berichten:

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

Trigger voor Event Grid

In de volgende tabel worden de bindingsconfiguratie-eigenschappen voor het C#-script uitgelegd dat u hebt ingesteld in het bestand function.json . Er zijn geen constructorparameters of eigenschappen die moeten worden ingesteld in het EventGridTrigger kenmerk.

function.json-eigenschap Beschrijving
type Vereist - moet worden ingesteld op eventGridTrigger.
direction Vereist - moet worden ingesteld op in.
name Vereist: de variabelenaam die wordt gebruikt in functiecode voor de parameter die de gebeurtenisgegevens ontvangt.

In het volgende voorbeeld ziet u een Event Grid-trigger die is gedefinieerd in het bestand function.json .

Dit zijn de bindingsgegevens in het bestand function.json :

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

Hier volgt een voorbeeld van een C#-scriptfunctie die gebruikmaakt van een EventGridEvent bindingsparameter:

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

Hier volgt een voorbeeld van een C#-scriptfunctie die gebruikmaakt van een JObject bindingsparameter:

#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-uitvoer

In de volgende tabel worden de bindingsconfiguratie-eigenschappen voor het C#-script uitgelegd dat u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op eventGrid.
direction Moet worden ingesteld op out. Deze parameter wordt automatisch ingesteld wanneer u de binding maakt in de Azure-portal.
name De naam van de variabele die in functiecode wordt gebruikt, vertegenwoordigt de gebeurtenis.
topicEndpointUri De naam van een app-instelling die de URI voor het aangepaste onderwerp bevat, zoals MyTopicEndpointUri.
topicKeySetting De naam van een app-instelling die een toegangssleutel voor het aangepaste onderwerp bevat.

In het volgende voorbeeld ziet u de event grid-uitvoerbindingsgegevens in het bestand function.json .

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

Hier volgt C#-scriptcode waarmee één gebeurtenis wordt gemaakt:

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

Hier volgt C#-scriptcode waarmee meerdere gebeurtenissen worden gemaakt:

#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-trigger

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op serviceBusTrigger. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
direction Moet worden ingesteld op in. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
name De naam van de variabele die de wachtrij of het onderwerpbericht in functiecode vertegenwoordigt.
queueName Naam van de wachtrij die moet worden bewaakt. Alleen instellen als u een wachtrij bewaakt, niet voor een onderwerp.
topicName De naam van het onderwerp dat moet worden bewaakt. Alleen instellen als u een onderwerp bewaakt, niet voor een wachtrij.
subscriptionName Naam van het abonnement dat moet worden bewaakt. Alleen instellen als u een onderwerp bewaakt, niet voor een wachtrij.
verbinding De naam van een app-instelling of instellingsverzameling die aangeeft hoe verbinding moet worden gemaakt met Service Bus. Zie Verbinding maken ions.
accessRights Toegangsrechten voor de verbindingsreeks. Beschikbare waarden zijn manage en listen. De standaardwaarde ismanage, wat aangeeft dat de connection machtiging Beheren is ingesteld. Als u een verbindingsreeks gebruikt waarvoor de machtiging Beheren niet is ingesteld, stelt u 'listen' inaccessRights. Anders kan de Functions-runtime mislukken bij het uitvoeren van bewerkingen waarvoor beheerrechten zijn vereist. In Azure Functions versie 2.x en hoger is deze eigenschap niet beschikbaar omdat de nieuwste versie van de Service Bus SDK geen ondersteuning biedt voor beheerbewerkingen.
isSessionsEnabled true als u verbinding maakt met een sessiebewuste wachtrij of een abonnement. false anders is dit de standaardwaarde.
Autoaanvullen true wanneer de trigger na verwerking automatisch moet worden aangeroepen, of als de functiecode handmatig wordt aangeroepen.

Instelling hiervoor false wordt alleen ondersteund in C#.

Als deze optie is ingesteld true, wordt het bericht automatisch voltooid als de uitvoering van de functie is voltooid en wordt het bericht op een andere manier afgelaten.
<br/Wanneer deze optie is ingesteld false, bent u verantwoordelijk voor het aanroepen van ServiceBusReceiver-methoden om het bericht, de sessie of de batch te voltooien, af te geven of af te schrijven. Wanneer er een uitzondering wordt gegenereerd (en geen van de ServiceBusReceiver methoden wordt aangeroepen), blijft de vergrendeling behouden. Zodra de vergrendeling is verlopen, wordt het bericht opnieuw in de wachtrij geplaatst met de DeliveryCount incrementele en wordt de vergrendeling automatisch vernieuwd.

Deze eigenschap is alleen beschikbaar in Azure Functions 2.x en hoger.

In het volgende voorbeeld ziet u een Service Bus-triggerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie leest metagegevens van berichten en registreert een Service Bus-wachtrijbericht.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

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-uitvoer

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op serviceBus. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
direction Moet worden ingesteld op out. Deze eigenschap wordt automatisch ingesteld wanneer u de trigger maakt in de Azure-portal.
name De naam van de variabele die de wachtrij of het onderwerpbericht in functiecode vertegenwoordigt. Ingesteld op '$return' om te verwijzen naar de retourwaarde van de functie.
queueName De naam van de wachtrij. Alleen instellen als wachtrijberichten worden verzonden, niet voor een onderwerp.
topicName Naam van het onderwerp. Alleen instellen als u onderwerpberichten verzendt, niet voor een wachtrij.
verbinding De naam van een app-instelling of instellingsverzameling die aangeeft hoe verbinding moet worden gemaakt met Service Bus. Zie Verbinding maken ions.
accessRights (alleen v1) Toegangsrechten voor de verbindingsreeks. Beschikbare waarden zijn manage en listen. De standaardwaarde ismanage, wat aangeeft dat de connection machtiging Beheren is ingesteld. Als u een verbindingsreeks gebruikt waarvoor de machtiging Beheren niet is ingesteld, stelt u 'listen' inaccessRights. Anders kan de Functions-runtime mislukken bij het uitvoeren van bewerkingen waarvoor beheerrechten zijn vereist. In Azure Functions versie 2.x en hoger is deze eigenschap niet beschikbaar omdat de nieuwste versie van de Service Bus SDK geen ondersteuning biedt voor beheerbewerkingen.

In het volgende voorbeeld ziet u een Service Bus-uitvoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie gebruikt een timertrigger om elke 15 seconden een wachtrijbericht te verzenden.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Hier volgt C#-scriptcode waarmee één bericht wordt gemaakt:

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

Dit is de C#-scriptcode voor het maken van meerdere berichten:

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-trigger

In deze sectie wordt de ondersteuning voor versie 4.x+ van de extensie alleen beschreven.

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op cosmosDBTrigger.
direction Moet worden ingesteld op in. Deze parameter wordt automatisch ingesteld wanneer u de trigger maakt in Azure Portal.
name De naam van de variabele die wordt gebruikt in functiecode die de lijst met documenten met wijzigingen vertegenwoordigt.
verbinding De naam van een app-instelling of verzameling die aangeeft hoe verbinding moet worden gemaakt met het Azure Cosmos DB-account dat wordt bewaakt. Zie Verbinding maken ions voor meer informatie.
Databasenaam De naam van de Azure Cosmos DB-database met de container die wordt bewaakt.
containerName De naam van de container die wordt bewaakt.
lease Verbinding maken ion (Optioneel) De naam van een app-instelling of instellingscontainer die aangeeft hoe verbinding moet worden gemaakt met het Azure Cosmos DB-account dat de leasecontainer bevat.

Wanneer deze niet is ingesteld, wordt de connection waarde gebruikt. Deze parameter wordt automatisch ingesteld wanneer de binding wordt gemaakt in de portal. De verbindingsreeks voor de leasecontainer moet schrijfmachtigingen hebben.
leaseDatabaseName (Optioneel) De naam van de database met de container die wordt gebruikt voor het opslaan van leases. Als deze instelling niet is ingesteld, wordt de waarde van de databaseName instelling gebruikt.
leaseContainerName (Optioneel) De naam van de container die wordt gebruikt voor het opslaan van leases. Wanneer deze niet is ingesteld, wordt de waarde leases gebruikt.
createLeaseContainerIfNotExists (Optioneel) Wanneer deze optie is ingesteld true, wordt de leasecontainer automatisch gemaakt wanneer deze nog niet bestaat. De standaardwaarde is false. Wanneer u Microsoft Entra-identiteiten gebruikt als u de waarde trueinstelt, is het maken van containers geen toegestane bewerking en kan uw functie niet worden gestart.
leasesContainerThroughput (Optioneel) Hiermee definieert u het aantal aanvraageenheden dat moet worden toegewezen wanneer de leasecontainer wordt gemaakt. Deze instelling wordt alleen gebruikt wanneer createLeaseContainerIfNotExists deze is ingesteld op true. Deze parameter wordt automatisch ingesteld wanneer de binding wordt gemaakt met behulp van de portal.
leaseContainerPrefix (Optioneel) Wanneer deze optie is ingesteld, wordt de waarde toegevoegd als voorvoegsel voor de leases die zijn gemaakt in de leasecontainer voor deze functie. Met behulp van een voorvoegsel kunnen twee afzonderlijke Azure Functions dezelfde Lease-container delen met behulp van verschillende voorvoegsels.
feedPollDelay (Optioneel) De tijd (in milliseconden) voor de vertraging tussen het peilen van een partitie voor nieuwe wijzigingen in de feed, nadat alle huidige wijzigingen zijn leeggezogen. De standaardwaarde is 5000 milliseconden of 5 seconden.
leaseAcquireInterval (Optioneel) Wanneer deze optie is ingesteld, definieert deze, in milliseconden, het interval voor het starten van een taak om te berekenen of partities gelijkmatig worden verdeeld over bekende hostinstanties. De standaardwaarde is 13000 (13 seconden).
leaseExpirationInterval (Optioneel) Wanneer deze is ingesteld, definieert deze, in milliseconden, het interval waarvoor de lease wordt genomen in een lease die een partitie vertegenwoordigt. Als de lease niet binnen dit interval wordt vernieuwd, wordt deze verlopen en wordt het eigendom van de partitie verplaatst naar een ander exemplaar. De standaardwaarde is 60000 (60 seconden).
leaseRenewInterval (Optioneel) Wanneer deze is ingesteld, definieert deze, in milliseconden, het vernieuwingsinterval voor alle leases voor partities die momenteel door een exemplaar worden bewaard. De standaardwaarde is 17000 (17 seconden).
maxItemsPerInvocation (Optioneel) Wanneer deze eigenschap is ingesteld, wordt het maximum aantal items ingesteld dat per functie-aanroep is ontvangen. Als bewerkingen in de bewaakte container worden uitgevoerd via opgeslagen procedures, blijft het transactiebereik behouden bij het lezen van items uit de wijzigingenfeed. Als gevolg hiervan kan het aantal ontvangen items hoger zijn dan de opgegeven waarde, zodat de items die door dezelfde transactie zijn gewijzigd, worden geretourneerd als onderdeel van één atomische batch.
startFromBeginning (Optioneel) Met deze optie wordt aan de trigger aangegeven dat wijzigingen vanaf het begin van de wijzigingsgeschiedenis van de container moeten worden gelezen in plaats van op het huidige tijdstip te beginnen. Lezen vanaf het begin werkt alleen wanneer de trigger voor het eerst wordt gestart, zoals in volgende uitvoeringen, de controlepunten al zijn opgeslagen. Het instellen van deze optie op true wanneer er al leases zijn gemaakt, heeft geen effect.
startFromTime (Optioneel) Hiermee haalt u de datum en tijd op van waaruit de leesbewerking van de wijzigingenfeed moet worden geïnitialiseerd. De aanbevolen indeling is ISO 8601 met de UTC-ontwerpaar, zoals 2021-02-16T14:19:29Z. Dit wordt alleen gebruikt om de eerste triggerstatus in te stellen. Nadat de trigger een leasestatus heeft, heeft het wijzigen van deze waarde geen effect.
preferredLocations (Optioneel) Definieert voorkeurslocaties (regio's) voor geo-gerepliceerde databaseaccounts in de Azure Cosmos DB-service. Waarden moeten door komma's worden gescheiden. Bijvoorbeeld 'VS - oost,VS - zuid-centraal,Europa - noord'.

In het volgende voorbeeld ziet u een Azure Cosmos DB-triggerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie schrijft logboekberichten wanneer Azure Cosmos DB-records worden toegevoegd of gewijzigd.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

    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-invoer

In deze sectie wordt de ondersteuning voor versie 4.x+ van de extensie alleen beschreven.

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
type Moet worden ingesteld op cosmosDB.
direction Moet worden ingesteld op in.
name De naam van de variabele die wordt gebruikt in functiecode die de lijst met documenten met wijzigingen vertegenwoordigt.
verbinding De naam van een app-instelling of instellingscontainer die aangeeft hoe verbinding moet worden gemaakt met het Azure Cosmos DB-account dat wordt bewaakt. Zie Verbinding maken ions voor meer informatie.
Databasenaam De naam van de Azure Cosmos DB-database met de container die wordt bewaakt.
containerName De naam van de container die wordt bewaakt.
partitionKey Hiermee geeft u de partitiesleutelwaarde voor de zoekactie. Kan bindingsparameters bevatten. Het is vereist voor zoekacties in gepartitioneerde containers.
id De id van het document dat moet worden opgehaald. Deze eigenschap ondersteunt bindingexpressies. Stel de eigenschappen sqlQuery niet inid. Als u geen van beide hebt ingesteld, wordt de hele container opgehaald.
sqlQuery Een Azure Cosmos DB SQL-query die wordt gebruikt voor het ophalen van meerdere documenten. De eigenschap ondersteunt runtimebindingen, zoals in dit voorbeeld: SELECT * FROM c where c.departmentId = {departmentId}. Stel de eigenschappen sqlQuery niet inid. Als u geen van beide hebt ingesteld, wordt de hele container opgehaald.
preferredLocations (Optioneel) Definieert voorkeurslocaties (regio's) voor geo-gerepliceerde databaseaccounts in de Azure Cosmos DB-service. Waarden moeten door komma's worden gescheiden. Bijvoorbeeld: East US,South Central US,North Europe.

Deze sectie bevat de volgende voorbeelden:

De HTTP-triggervoorbeelden verwijzen naar een eenvoudig ToDoItem type:

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

Wachtrijtrigger, id opzoeken uit tekenreeks

In het volgende voorbeeld ziet u een Azure Cosmos DB-invoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie leest één document en werkt de tekstwaarde van het document bij.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

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

Wachtrijtrigger, meerdere documenten ophalen met behulp van SqlQuery

In het volgende voorbeeld ziet u een Azure Cosmos DB-invoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie haalt meerdere documenten op die zijn opgegeven door een SQL-query, met behulp van een wachtrijtrigger om de queryparameters aan te passen.

De wachtrijtrigger biedt een parameter departmentId. Een wachtrijbericht van { "departmentId" : "Finance" } de afdeling Financiën retourneert alle records.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

    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-trigger, id opzoeken uit querytekenreeks

In het volgende voorbeeld ziet u een C#-scriptfunctie waarmee één document wordt opgehaald. De functie wordt geactiveerd door een HTTP-aanvraag die gebruikmaakt van een querytekenreeks om de id en partitiesleutelwaarde op te geven die moeten worden opgezoekd. Deze id- en partitiesleutelwaarde worden gebruikt om een ToDoItem document op te halen uit de opgegeven database en verzameling.

Dit is het bestand function.json :

{
  "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
}

Dit is de C# Script-code:

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-trigger, id opzoeken uit routegegevens

In het volgende voorbeeld ziet u een C#-scriptfunctie waarmee één document wordt opgehaald. De functie wordt geactiveerd door een HTTP-aanvraag die routegegevens gebruikt om de id- en partitiesleutelwaarde op te geven om op te zoeken. Deze id- en partitiesleutelwaarde worden gebruikt om een ToDoItem document op te halen uit de opgegeven database en verzameling.

Dit is het bestand function.json :

{
  "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
}

Dit is de C# Script-code:

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-trigger, meerdere documenten ophalen met behulp van SqlQuery

In het volgende voorbeeld ziet u een C#-scriptfunctie waarmee een lijst met documenten wordt opgehaald. De functie wordt geactiveerd door een HTTP-aanvraag. De query wordt opgegeven in de SqlQuery kenmerkeigenschap.

Dit is het bestand function.json :

{
  "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
}

Dit is de C# Script-code:

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

HTTP-trigger, meerdere documenten ophalen met Behulp van DocumentClient

In het volgende voorbeeld ziet u een C#-scriptfunctie waarmee een lijst met documenten wordt opgehaald. De functie wordt geactiveerd door een HTTP-aanvraag. De code maakt gebruik van een DocumentClient exemplaar dat wordt geleverd door de Azure Cosmos DB-binding om een lijst met documenten te lezen. Het DocumentClient exemplaar kan ook worden gebruikt voor schrijfbewerkingen.

Dit is het bestand function.json :

{
  "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
}

Dit is de C# Script-code:

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

Uitvoer van Azure Cosmos DB v2

In deze sectie wordt de ondersteuning voor versie 4.x+ van de extensie alleen beschreven.

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u hebt ingesteld in het bestand function.json .

function.json-eigenschap Beschrijving
verbinding De naam van een app-instelling of verzameling die aangeeft hoe verbinding moet worden gemaakt met het Azure Cosmos DB-account dat wordt bewaakt. Zie Verbinding maken ions voor meer informatie.
Databasenaam De naam van de Azure Cosmos DB-database met de container die wordt bewaakt.
containerName De naam van de container die wordt bewaakt.
createIfNotExists Een Booleaanse waarde om aan te geven of de container wordt gemaakt wanneer deze niet bestaat. De standaardwaarde is onwaar omdat nieuwe containers worden gemaakt met gereserveerde doorvoer, wat gevolgen heeft voor de kosten. Zie voor meer informatie de pagina met prijzen.
partitionKey Wanneer createIfNotExists is waar, definieert het partitiesleutelpad voor de gemaakte container. Kan bindingsparameters bevatten.
containerThroughput Wanneer createIfNotExists is waar, wordt de doorvoer van de gemaakte container gedefinieerd.
preferredLocations (Optioneel) Definieert voorkeurslocaties (regio's) voor geo-gerepliceerde databaseaccounts in de Azure Cosmos DB-service. Waarden moeten door komma's worden gescheiden. Bijvoorbeeld: East US,South Central US,North Europe.

Deze sectie bevat de volgende voorbeelden:

Wachtrijtrigger, één document schrijven

In het volgende voorbeeld ziet u een Azure Cosmos DB-uitvoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie maakt gebruik van een wachtrijinvoerbinding voor een wachtrij die JSON ontvangt in de volgende indeling:

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

Met de functie worden Azure Cosmos DB-documenten gemaakt in de volgende indeling voor elke record:

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

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

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

Wachtrijtrigger, documenten schrijven met behulp van IAsyncCollector

Als u meerdere documenten wilt maken, kunt u verbinding maken met ICollector<T> of IAsyncCollector<T> waar T een van de ondersteunde typen is.

Dit voorbeeld verwijst naar een eenvoudig ToDoItem type:

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

Dit is het bestand function.json:

{
  "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
}

Dit is de C# Script-code:

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-trigger

In het volgende voorbeeld ziet u een Azure Cosmos DB-triggerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie schrijft logboekberichten wanneer Azure Cosmos DB-records worden gewijzigd.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

    #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-invoer

Deze sectie bevat de volgende voorbeelden:

De HTTP-triggervoorbeelden verwijzen naar een eenvoudig ToDoItem type:

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

Wachtrijtrigger, id opzoeken uit tekenreeks

In het volgende voorbeeld ziet u een Azure Cosmos DB-invoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie leest één document en werkt de tekstwaarde van het document bij.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

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

Wachtrijtrigger, meerdere documenten ophalen met behulp van SqlQuery

In het volgende voorbeeld ziet u een Azure Cosmos DB-invoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie haalt meerdere documenten op die zijn opgegeven door een SQL-query, met behulp van een wachtrijtrigger om de queryparameters aan te passen.

De wachtrijtrigger biedt een parameter departmentId. Een wachtrijbericht van { "departmentId" : "Finance" } de afdeling Financiën retourneert alle records.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

    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-trigger, id opzoeken uit querytekenreeks

In het volgende voorbeeld ziet u een C#-scriptfunctie waarmee één document wordt opgehaald. De functie wordt geactiveerd door een HTTP-aanvraag waarin een querytekenreeks wordt gebruikt om de id op te zoeken. Deze id wordt gebruikt om een ToDoItem document op te halen uit de opgegeven database en verzameling.

Dit is het bestand function.json :

{
  "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
}

Dit is de C# Script-code:

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-trigger, id opzoeken uit routegegevens

In het volgende voorbeeld ziet u een C#-scriptfunctie waarmee één document wordt opgehaald. De functie wordt geactiveerd door een HTTP-aanvraag die routegegevens gebruikt om de id op te geven die moet worden opgezoekd. Deze id wordt gebruikt om een ToDoItem document op te halen uit de opgegeven database en verzameling.

Dit is het bestand function.json :

{
  "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
}

Dit is de C# Script-code:

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-trigger, meerdere documenten ophalen met behulp van SqlQuery

In het volgende voorbeeld ziet u een C#-scriptfunctie waarmee een lijst met documenten wordt opgehaald. De functie wordt geactiveerd door een HTTP-aanvraag. De query wordt opgegeven in de SqlQuery kenmerkeigenschap.

Dit is het bestand function.json :

{
  "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
}

Dit is de C# Script-code:

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

HTTP-trigger, meerdere documenten ophalen met Behulp van DocumentClient

In het volgende voorbeeld ziet u een C#-scriptfunctie waarmee een lijst met documenten wordt opgehaald. De functie wordt geactiveerd door een HTTP-aanvraag. De code maakt gebruik van een DocumentClient exemplaar dat wordt geleverd door de Azure Cosmos DB-binding om een lijst met documenten te lezen. Het DocumentClient exemplaar kan ook worden gebruikt voor schrijfbewerkingen.

Dit is het bestand function.json :

{
  "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
}

Dit is de C# Script-code:

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

Uitvoer van Azure Cosmos DB v1

Deze sectie bevat de volgende voorbeelden:

  • Wachtrijtrigger, één document schrijven
  • Wachtrijtrigger, documenten schrijven met behulp van IAsyncCollector

Wachtrijtrigger, één document schrijven

In het volgende voorbeeld ziet u een Azure Cosmos DB-uitvoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie maakt gebruik van een wachtrijinvoerbinding voor een wachtrij die JSON ontvangt in de volgende indeling:

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

Met de functie worden Azure Cosmos DB-documenten gemaakt in de volgende indeling voor elke record:

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

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

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

Wachtrijtrigger, documenten schrijven met behulp van IAsyncCollector

Als u meerdere documenten wilt maken, kunt u verbinding maken met ICollector<T> of IAsyncCollector<T> waar T een van de ondersteunde typen is.

Dit voorbeeld verwijst naar een eenvoudig ToDoItem type:

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

Dit is het bestand function.json:

{
  "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
}

Dit is de C# Script-code:

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-trigger

Meer voorbeelden voor de Azure SQL-trigger zijn beschikbaar in de GitHub-opslagplaats.

Het voorbeeld verwijst naar een ToDoItem klasse en een bijbehorende databasetabel:

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

Wijzigingen bijhouden is ingeschakeld voor de database en in de tabel:

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

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

De SQL-trigger bindt aan een IReadOnlyList<SqlChange<T>>, een lijst SqlChange met objecten die elk twee eigenschappen hebben:

  • Item: het item dat is gewijzigd. Het type item moet het tabelschema volgen zoals in de ToDoItem klasse wordt weergegeven.
  • Bewerking: een waarde uit SqlChangeOperation opsomming. De mogelijke waarden zijn Insert, Update en Delete.

In het volgende voorbeeld ziet u een SQL-trigger in een function.json-bestand en een C#-scriptfunctie die wordt aangeroepen wanneer er wijzigingen in de ToDo tabel zijn:

Hier volgen bindingsgegevens in het bestand function.json:

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

Hier volgt de C#-scriptfunctie:

#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-invoer

Meer voorbeelden voor de Azure SQL-invoerbinding zijn beschikbaar in de GitHub-opslagplaats.

Deze sectie bevat de volgende voorbeelden:

De voorbeelden verwijzen naar een ToDoItem klasse en een bijbehorende databasetabel:

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-trigger, rij ophalen op id uit queryreeks

In het volgende voorbeeld ziet u een Azure SQL-invoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie wordt geactiveerd door een HTTP-aanvraag die gebruikmaakt van een querytekenreeks om de id op te geven. Deze id wordt gebruikt om een ToDoItem record met de opgegeven query op te halen.

Notitie

De http-queryreeksparameter is hoofdlettergevoelig.

Dit zijn de bindingsgegevens in het bestand function.json :

{
    "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"
}

Dit is de C# Script-code:

#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-trigger, rijen verwijderen

In het volgende voorbeeld ziet u een Azure SQL-invoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding voor het uitvoeren van een opgeslagen procedure met invoer van de queryparameter van de HTTP-aanvraag. In dit voorbeeld verwijdert de opgeslagen procedure één record of alle records, afhankelijk van de waarde van de parameter.

De opgeslagen procedure dbo.DeleteToDo moet worden gemaakt in de SQL-database.

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

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

#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-uitvoer

Meer voorbeelden voor de Azure SQL-uitvoerbinding zijn beschikbaar in de GitHub-opslagplaats.

Deze sectie bevat de volgende voorbeelden:

De voorbeelden verwijzen naar een ToDoItem klasse en een bijbehorende databasetabel:

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-trigger, records schrijven naar een tabel

In het volgende voorbeeld ziet u een SQL-uitvoerbinding in een function.json-bestand en een C#-scriptfunctie waarmee records worden toegevoegd aan een tabel, met behulp van gegevens die zijn opgegeven in een HTTP POST-aanvraag als een JSON-hoofdtekst.

Hier volgen bindingsgegevens in het bestand function.json:

{
    "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"
}

Hier volgt een voorbeeld van C#-scriptcode:

#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-trigger, schrijven naar twee tabellen

In het volgende voorbeeld ziet u een SQL-uitvoerbinding in een function.json-bestand en een C#-scriptfunctie waarmee records worden toegevoegd aan een database in twee verschillende tabellen (dbo.ToDo en dbo.RequestLog), met behulp van gegevens in een HTTP POST-aanvraag als een JSON-hoofdtekst en meerdere uitvoerbindingen.

De tweede tabel, dbo.RequestLogkomt overeen met de volgende definitie:

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

Hier volgen bindingsgegevens in het bestand function.json:

{
    "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"
}

Hier volgt een voorbeeld van C#-scriptcode:

#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-uitvoer

In het volgende voorbeeld ziet u een RabbitMQ-uitvoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie leest in het bericht van een HTTP-trigger en voert het uit naar de RabbitMQ-wachtrij.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

using System;
using Microsoft.Extensions.Logging;

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

SendGrid-uitvoer

In het volgende voorbeeld ziet u een SendGrid-uitvoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding.

Dit zijn de bindingsgegevens in het bestand function.json :

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

Dit is de C# Script-code:

#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-trigger

Hier volgt een voorbeeld van bindingsgegevens in het bestand function.json :

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

En hier volgt de code:

#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-invoer

In het volgende voorbeeld ziet u een SignalR-verbindingsgegevensinvoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding om de verbindingsgegevens te retourneren.

Dit zijn bindingsgegevens in het bestand function.json :

Voorbeeld function.json:

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

Dit is de C#-scriptcode:

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

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

U kunt de userId eigenschap van de binding instellen op de waarde vanuit een header met behulp van een bindingexpressie: {headers.x-ms-client-principal-id} of {headers.x-ms-client-principal-name}.

Voorbeeld 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"
}

Dit is de C#-scriptcode:

#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-uitvoer

Dit zijn bindingsgegevens in het bestand function.json :

Voorbeeld function.json:

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

Dit is de C#-scriptcode:

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

U kunt een bericht alleen verzenden naar verbindingen die zijn geverifieerd voor een gebruiker door de gebruikers-id in te stellen in het SignalR-bericht.

Voorbeeld function.json:

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

Dit is de C# Script-code:

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

U kunt een bericht alleen verzenden naar verbindingen die aan een groep zijn toegevoegd door de groepsnaam in te stellen in het SignalR-bericht.

Voorbeeld function.json:

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

Dit is de C#-scriptcode:

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

Met SignalR Service kunnen gebruikers of verbindingen worden toegevoegd aan groepen. Berichten kunnen vervolgens naar een groep worden verzonden. U kunt de SignalR uitvoerbinding gebruiken om groepen te beheren.

In het volgende voorbeeld wordt een gebruiker aan een groep toegevoegd.

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

In het volgende voorbeeld wordt een gebruiker uit een groep verwijderd.

Voorbeeld 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-uitvoer

In het volgende voorbeeld ziet u een Twilio-uitvoerbinding in een function.json-bestand en een C#-scriptfunctie die gebruikmaakt van de binding. De functie gebruikt een out parameter om een sms-bericht te verzenden.

Dit zijn bindingsgegevens in het bestand function.json :

Voorbeeld function.json:

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

Dit is C#-scriptcode:

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

U kunt geen parameters in asynchrone code gebruiken. Hier volgt een voorbeeld van asynchrone C#-scriptcode:

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

Trigger voor opwarmen

In het volgende voorbeeld ziet u een opwarmtrigger in een function.json-bestand en een C#-scriptfunctie die wordt uitgevoerd op elk nieuw exemplaar wanneer deze wordt toegevoegd aan uw app.

Niet ondersteund voor versie 1.x van de Functions-runtime.

Dit is het bestand function.json :

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

Volgende stappen