Dela via


Mönster för Bindningsuttryck i Azure Functions

En av de mest kraftfulla funktionerna i utlösare och bindningar är bindningsuttryck. I function.json-filen och i funktionsparametrar och kod kan du använda uttryck som matchar värden från olika källor.

De flesta uttryck kan identifieras genom att de omsluts av klammerparenteser. I en köutlösarfunktion {queueTrigger} matchas till exempel kömeddelandetexten. path Om egenskapen för en blobutdatabindning är container/{queueTrigger} och funktionen utlöses av ett kömeddelande HelloWorldskapas en blob med namnetHelloWorld.

Typer av bindande uttryck

Bindningsuttryck – appinställningar

Vi rekommenderar att hemligheter och anslutningssträng hanteras med appinställningar i stället för konfigurationsfiler. Detta begränsar åtkomsten till dessa hemligheter och gör det säkert att lagra filer som function.json i lagringsplatser för offentlig källkontroll.

Appinställningar är också användbara när du vill ändra konfigurationen baserat på miljön. I en testmiljö kanske du till exempel vill övervaka en annan kö eller bloblagringscontainer.

Appinställningsbindningsuttryck identifieras på ett annat sätt än andra bindningsuttryck: de är inlindade i procenttecken i stället för klammerparenteser. Om till exempel blobutdatabindningssökvägen är %Environment%/newblob.txt och appinställningsvärdet Environment är Developmentskapas en blob i containern Development .

När en funktion körs lokalt kommer appinställningsvärden från den local.settings.json filen.

Kommentar

Egenskapen connection för utlösare och bindningar är ett specialfall och löser automatiskt värden som appinställningar, utan procenttecken.

Följande exempel är en Azure Queue Storage-utlösare som använder en appinställning %input_queue_name% för att definiera kön som ska utlösas.

{
  "bindings": [
    {
      "name": "order",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "%input_queue_name%",
      "connection": "MY_STORAGE_ACCT_APP_SETTING"
    }
  ]
}

Du kan använda samma metod i klassbibliotek:

[FunctionName("QueueTrigger")]
public static void Run(
    [QueueTrigger("%input_queue_name%")]string myQueueItem, 
    ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
}

Filnamn för utlösare

path För en Blob-utlösare kan vara ett mönster som låter dig referera till namnet på den utlösande bloben i andra bindningar och funktionskod. Mönstret kan också innehålla filtreringsvillkor som anger vilka blobar som kan utlösa ett funktionsanrop.

I följande blobutlösarbindning path är sample-images/{filename}till exempel mönstret , som skapar ett bindningsuttryck med namnet filename:

{
  "bindings": [
    {
      "name": "image",
      "type": "blobTrigger",
      "path": "sample-images/{filename}",
      "direction": "in",
      "connection": "MyStorageConnection"
    },
    ...

Uttrycket filename kan sedan användas i en utdatabindning för att ange namnet på den blob som skapas:

    ...
    {
      "name": "imageSmall",
      "type": "blob",
      "path": "sample-images-sm/{filename}",
      "direction": "out",
      "connection": "MyStorageConnection"
    }
  ],
}

Funktionskoden har åtkomst till samma värde med hjälp filename av som ett parameternamn:

// C# example of binding to {filename}
public static void Run(Stream image, string filename, Stream imageSmall, ILogger log)  
{
    log.LogInformation($"Blob trigger processing: {filename}");
    // ...
} 

Samma möjlighet att använda bindningsuttryck och mönster gäller för attribut i klassbibliotek. I följande exempel är attributkonstruktorparametrarna samma path värden som föregående function.json exempel:

[FunctionName("ResizeImage")]
public static void Run(
    [BlobTrigger("sample-images/{filename}")] Stream image,
    [Blob("sample-images-sm/{filename}", FileAccess.Write)] Stream imageSmall,
    string filename,
    ILogger log)
{
    log.LogInformation($"Blob trigger processing: {filename}");
    // ...
}

Du kan också skapa uttryck för delar av filnamnet. I följande exempel utlöses funktionen endast på filnamn som matchar ett mönster: anyname-anyfile.csv

{
    "name": "myBlob",
    "type": "blobTrigger",
    "direction": "in",
    "path": "testContainerName/{date}-{filetype}.csv",
    "connection": "OrderStorageConnection"
}

Mer information om hur du använder uttryck och mönster i blobsökvägssträngen finns i bindningsreferensen för lagringsblob.

Utlösarmetadata

Förutom den datanyttolast som tillhandahålls av en utlösare (till exempel innehållet i kömeddelandet som utlöste en funktion) ger många utlösare ytterligare metadatavärden. Dessa värden kan användas som indataparametrar i C# och F# eller egenskaper för context.bindings objektet i JavaScript.

En Azure Queue Storage-utlösare stöder till exempel följande egenskaper:

  • QueueTrigger – utlösa meddelandeinnehåll om en giltig sträng
  • DequeueCount
  • ExpirationTime
  • Id
  • InsertionTime
  • NextVisibleTime
  • PopReceipt

Dessa metadatavärden är tillgängliga i function.json filegenskaper. Anta till exempel att du använder en köutlösare och att kömeddelandet innehåller namnet på en blob som du vill läsa. I den function.json filen kan du använda queueTrigger metadataegenskapen i blobegenskapen path , som du ser i följande exempel:

{
  "bindings": [
    {
      "name": "myQueueItem",
      "type": "queueTrigger",
      "queueName": "myqueue-items",
      "connection": "MyStorageConnection",
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "direction": "in",
      "connection": "MyStorageConnection"
    }
  ]
}

Information om metadataegenskaper för varje utlösare beskrivs i motsvarande referensartikel. Ett exempel finns i metadata för köutlösare. Dokumentation finns också på fliken Integrera i portalen i avsnittet Dokumentation under bindningskonfigurationsområdet.

JSON-nyttolaster

I vissa scenarier kan du referera till utlösarnyttolastens egenskaper i konfigurationen för andra bindningar i samma funktion och i funktionskoden. Detta kräver att utlösarnyttolasten är JSON och är mindre än ett tröskelvärde som är specifikt för varje utlösare. Normalt måste nyttolaststorleken vara mindre än 100 MB, men du bör kontrollera referensinnehållet för varje utlösare. Användning av utlösarnyttolastegenskaper kan påverka programmets prestanda och tvingar utlösarparametertypen att vara enkla typer som strängar eller en anpassad objekttyp som representerar JSON-data. Den kan inte användas med strömmar, klienter eller andra SDK-typer.

I följande exempel visas function.json-filen för en webhook-funktion som tar emot ett blobnamn i JSON: {"BlobName":"HelloWorld.txt"}. En blobindatabindning läser bloben och HTTP-utdatabindningen returnerar blobinnehållet i HTTP-svaret. Observera att blobindatabindningen hämtar blobnamnet genom att referera direkt till BlobName egenskapen ("path": "strings/{BlobName}")

{
  "bindings": [
    {
      "name": "info",
      "type": "httpTrigger",
      "direction": "in",
      "webHookType": "genericJson"
    },
    {
      "name": "blobContents",
      "type": "blob",
      "direction": "in",
      "path": "strings/{BlobName}",
      "connection": "AzureWebJobsStorage"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    }
  ]
}

För att detta ska fungera i C# och F# behöver du en klass som definierar fälten som ska deserialiseras, som i följande exempel:

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

public class BlobInfo
{
    public string BlobName { get; set; }
}
  
public static HttpResponseMessage Run(HttpRequestMessage req, BlobInfo info, string blobContents, ILogger log)
{
    if (blobContents == null) {
        return req.CreateResponse(HttpStatusCode.NotFound);
    } 

    log.LogInformation($"Processing: {info.BlobName}");

    return req.CreateResponse(HttpStatusCode.OK, new {
        data = $"{blobContents}"
    });
}

I JavaScript utförs JSON-deserialisering automatiskt.

module.exports = async function (context, info) {
    if ('BlobName' in info) {
        context.res = {
            body: { 'data': context.bindings.blobContents }
        }
    }
    else {
        context.res = {
            status: 404
        };
    }
}

Punkt notation

Om vissa av egenskaperna i JSON-nyttolasten är objekt med egenskaper kan du referera till dem direkt med punkt (.) notation. Den här notationen fungerar inte för Azure Cosmos DB - eller Table Storage-bindningar .

Anta till exempel att din JSON ser ut så här:

{
  "BlobName": {
    "FileName":"HelloWorld",
    "Extension":"txt"
  }
}

Du kan referera direkt till FileName som BlobName.FileName. Med det här JSON-formatet path ser egenskapen i föregående exempel ut så här:

"path": "strings/{BlobName.FileName}.{BlobName.Extension}",

I C#behöver du två klasser:

public class BlobInfo
{
    public BlobName BlobName { get; set; }
}
public class BlobName
{
    public string FileName { get; set; }
    public string Extension { get; set; }
}

Skapa GUID:er

Bindningsuttrycket {rand-guid} skapar ett GUID. Följande blobsökväg i en function.json fil skapar en blob med ett namn som 50710cb5-84b9-4d87-9d83-a03d6976a682.txt.

{
  "type": "blob",
  "name": "blobOutput",
  "direction": "out",
  "path": "my-output-container/{rand-guid}.txt"
}

Aktuell tid

Bindningsuttrycket DateTime matchas till DateTime.UtcNow. Följande blobsökväg i en function.json fil skapar en blob med ett namn som 2018-02-16T17-59-55Z.txt.

{
  "type": "blob",
  "name": "blobOutput",
  "direction": "out",
  "path": "my-output-container/{DateTime}.txt"
}

Bindning vid körning

I C# och andra .NET-språk kan du använda ett imperativt bindningsmönster, till skillnad från deklarativa bindningar i function.json och attribut. Imperativ bindning är användbart när bindningsparametrar måste beräknas vid körning i stället för designtid. Mer information finns i C#-utvecklarreferensen eller C#-skriptutvecklarreferensen.