vzory výrazů vazby Azure Functions

Jednou z nejvýkonnějších funkcí triggerů a vazeb jsou vazbové výrazy. V souboru function.json a v parametrech a kódu funkce můžete použít výrazy, které se přeloží na hodnoty z různých zdrojů.

Většina výrazů je označena a tím, že je zabalena ve složených závorkách. Například ve funkci {queueTrigger} triggeru fronty se přeloží na text zprávy fronty. path Pokud je container/{queueTrigger} vlastnost výstupní vazby objektu blob a funkce se aktivuje zprávou HelloWorldfronty , vytvoří se objekt blob s názvem HelloWorld .

Typy vazbových výrazů

Vazbové výrazy – nastavení aplikace

Osvědčeným postupem je, že tajné kódy a připojovací řetězce by se měly spravovat pomocí nastavení aplikace, nikoli pomocí konfiguračních souborů. Tím se omezí přístup k těmto tajným kódům a bude bezpečné ukládat soubory, jako je function.json , ve veřejných úložištích správy zdrojového kódu.

Nastavení aplikace jsou také užitečná, kdykoli chcete změnit konfiguraci v závislosti na prostředí. Například v testovacím prostředí můžete chtít monitorovat jiný kontejner fronty nebo úložiště objektů blob.

Výrazy vazby nastavení aplikace se identifikují jinak než jiné vazbové výrazy: jsou zabalené do znaků procent místo do složených závorek. Pokud je %Environment%/newblob.txt například cesta k výstupní vazbě objektu Environment blob a hodnota nastavení aplikace je Development, vytvoří se v kontejneru Development objekt blob.

Když je funkce spuštěná místně, hodnoty nastavení aplikace pocházejí ze souboru local.settings.json .

Poznámka

Vlastnost connection triggerů a vazeb je speciální případ a automaticky překládá hodnoty jako nastavení aplikace bez znaků procenta.

Následující příklad je trigger služby Azure Queue Storage, který pomocí nastavení %input_queue_name% aplikace definuje frontu, ve které se má aktivovat.

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

Stejný přístup můžete použít i v knihovnách tříd:

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

Název souboru aktivační události

Trigger path objektu blob může být vzor, který umožňuje odkazovat na název aktivačního objektu blob v jiných vazbách a kódu funkce. Vzor může také zahrnovat kritéria filtrování, která určují, které objekty blob mohou aktivovat vyvolání funkce.

Například v následující vazbě triggeru objektu path blob je sample-images/{filename}vzor , který vytvoří výraz vazby s názvem filename:

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

Výraz filename se pak dá použít ve výstupní vazbě k zadání názvu vytvářeného objektu blob:

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

Kód funkce má přístup ke stejné hodnotě pomocí filename jako názvu parametru:

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

Stejná schopnost používat vazbové výrazy a vzory platí pro atributy v knihovnách tříd. V následujícím příkladu mají parametry konstruktoru atributu stejné path hodnoty jako předchozí příklady function.json :

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

Můžete také vytvořit výrazy pro části názvu souboru. V následujícím příkladu se funkce aktivuje jenom u názvů souborů, které odpovídají vzoru: anyname-anyfile.csv

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

Další informace o tom, jak používat výrazy a vzory v řetězci cesty k objektu blob, najdete v tématu Referenční informace o vazbách objektů blob služby Storage.

Metadata aktivační události

Kromě datové části poskytované triggerem (například obsahu zprávy fronty, která aktivovala funkci) poskytuje mnoho triggerů další hodnoty metadat. Tyto hodnoty lze použít jako vstupní parametry v jazycích C# a F# nebo jako vlastnosti objektu v JavaScriptu context.bindings .

Například trigger služby Azure Queue Storage podporuje následující vlastnosti:

  • QueueTrigger – aktivace obsahu zprávy, pokud je platný řetězec.
  • DequeueCount
  • ExpirationTime
  • Id
  • Čas vložení
  • DalšívisibleTime
  • Místníreceipt

Tyto hodnoty metadat jsou přístupné ve vlastnostech souboru function.json . Předpokládejme například, že používáte trigger fronty a zpráva fronty obsahuje název objektu blob, který chcete přečíst. V souboru function.json můžete použít queueTrigger vlastnost metadat ve vlastnosti objektu blob path , jak je znázorněno v následujícím příkladu:

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

Podrobnosti o vlastnostech metadat pro jednotlivé triggery jsou popsány v odpovídajícím referenčním článku. Příklad najdete v tématu Metadata triggeru fronty. Dokumentace je k dispozici také na portálu na kartě Integrace v části Dokumentace pod oblastí konfigurace vazby.

Datové části JSON

V některých scénářích můžete odkazovat na vlastnosti datové části triggeru v konfiguraci pro další vazby ve stejné funkci a v kódu funkce. To vyžaduje, aby datová část triggeru byla JSON a byla menší než prahová hodnota specifická pro jednotlivé triggery. Obvykle musí být velikost datové části menší než 100 MB, ale měli byste zkontrolovat referenční obsah každého triggeru. Použití vlastností datové části triggeru může mít vliv na výkon vaší aplikace a vynutí, aby typ parametru triggeru byl jednoduchými typy, jako jsou řetězce nebo vlastní typ objektu představující data JSON. Nedá se použít se streamy, klienty ani jinými typy sad SDK.

Následující příklad ukazuje soubor function.json pro funkci webhooku, která obdrží název objektu blob ve formátu JSON: {"BlobName":"HelloWorld.txt"}. Vstupní vazba objektu blob čte objekt blob a výstupní vazba HTTP vrátí obsah objektu blob v odpovědi HTTP. Všimněte si, že vstupní vazba objektu blob získá název objektu blob přímým odkazem na BlobName vlastnost ("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"
    }
  ]
}

Aby to fungovalo v C# a F#, potřebujete třídu, která definuje pole, která se mají deserializovat, jako v následujícím příkladu:

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

V JavaScriptu se deserializace JSON provádí automaticky.

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

Tečková notace

Pokud jsou některé vlastnosti v datové části JSON objekty s vlastnostmi, můžete na ně odkazovat přímo pomocí tečkového zápisu (.). Tento zápis nefunguje pro vazby Azure Cosmos DB nebo Table Storage .

Předpokládejme například, že váš kód JSON vypadá takto:

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

Přímo můžete označovat FileName jako BlobName.FileName. V tomto formátu JSON by vlastnost v předchozím příkladu vypadala path takto:

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

V jazyce C# byste potřebovali dvě třídy:

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

Vytváření identifikátorů GUID

Výraz {rand-guid} vazby vytvoří identifikátor GUID. Následující cesta k objektu function.json blob v souboru vytvoří objekt blob s názvem , jako je50710cb5-84b9-4d87-9d83-a03d6976a682.txt.

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

Aktuální čas

Výraz DateTime vazby se přeloží na DateTime.UtcNow. Následující cesta k objektu function.json blob v souboru vytvoří objekt blob s názvem , jako je2018-02-16T17-59-55Z.txt.

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

Vazby za běhu

V jazyce C# a dalších jazycích .NET můžete místo deklarativních vazeb v souboru function.json a atributech použít imperativní vzor vazby. Imperativní vazba je užitečná v případech, kdy je potřeba parametry vazby vypočítat za běhu a ne v době návrhu. Další informace najdete v referenčních informacích pro vývojáře v jazyce C# nebo v referenčních informacích pro vývojáře skriptů jazyka C#.

Další kroky