kötési kifejezések mintáinak Azure Functions

Az eseményindítók és kötések egyik leghatékonyabb funkciója a kötési kifejezések. A function.json fájlban, valamint a függvényparaméterekben és -kódban különböző forrásokból származó értékekre feloldott kifejezéseket használhat.

A legtöbb ilyen kifejezés könnyen azonosítható, mivel kapcsos zárójelek között vannak. Egy üzenetsor-eseményindító függvényben {queueTrigger} például az üzenetsor üzenetének szövege lesz feloldva. Ha egy path blob kimeneti kötésének tulajdonsága, container/{queueTrigger} és a függvényt egy üzenetsor-üzenet HelloWorldaktiválja, létrejön egy nevű HelloWorld blob.

Kötéskifejezések típusai

Kötési kifejezések – alkalmazásbeállítások

Ajánlott eljárásként a titkos kódokat és a kapcsolati sztringeket alkalmazásbeállítások használatával kell kezelni a konfigurációs fájlok helyett. Ez korlátozza a titkos kódokhoz való hozzáférést, és biztonságossá teszi az olyan fájlok tárolását, mint a function.json nyilvános forráskódtárakban.

Az alkalmazásbeállítások akkor is hasznosak, ha a környezet alapján módosítani szeretné a konfigurációt. Tesztkörnyezetben például érdemes lehet egy másik üzenetsort vagy blobtárolót figyelni.

Az alkalmazásbeállítás kötési kifejezései másként vannak azonosítva, mint a többi kötési kifejezés: a kapcsos zárójelek helyett százalékjelekbe vannak csomagolva. Ha például a blob kimeneti kötésének elérési útja, %Environment%/newblob.txt és az Environment alkalmazásbeállítás értéke Development, a tárolóban Development létrejön egy blob.

Ha egy függvény helyileg fut, az alkalmazásbeállítási értékek a local.settings.json fájlból származnak.

Megjegyzés

Az connection eseményindítók és kötések tulajdonsága egy speciális eset, amely automatikusan feloldja az értékeket alkalmazásbeállításokként, százalékjelek nélkül.

Az alábbi példa egy Azure Queue Storage-eseményindító, amely egy alkalmazásbeállítással %input_queue_name% határozza meg a aktiválandó üzenetsort.

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

Ugyanezt a módszert használhatja az osztálytárakban is:

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

Eseményindító fájl neve

A path Blob-eseményindító olyan minta lehet, amely lehetővé teszi, hogy más kötésekben és függvénykódokban hivatkozzon az aktiváló blob nevére. A minta olyan szűrési feltételeket is tartalmazhat, amelyek meghatározzák, hogy mely blobok aktiválhatnak függvényhívást.

Például a következő Blob-eseményindító kötésben a path minta sample-images/{filename}a , amely létrehoz egy nevű kötési kifejezést filename:

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

A kifejezés filename ezután egy kimeneti kötésben használható a létrehozott blob nevének megadásához:

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

A függvénykód hozzáfér ehhez az értékhez paraméternévként használva filename :

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

A kötési kifejezések és minták használatának képessége az osztálytárak attribútumaira is vonatkozik. A következő példában az attribútumkonstruktor paraméterei ugyanazok path az értékek, mint az előző function.json példák:

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

A fájlnév egyes részeihez is létrehozhat kifejezéseket. Az alábbi példában a függvény csak a mintának megfelelő fájlneveken aktiválódik: anyname-anyfile.csv

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

A kifejezések és minták blobútvonal-sztringben való használatával kapcsolatos további információkért lásd a Storage-blobkötések referenciáját.

Eseményindító metaadatok

Az eseményindítók által biztosított adattartalomon (például a függvényt aktiváló üzenet üzenetének tartalmán) kívül számos eseményindító további metaadat-értékeket is biztosít. Ezek az értékek bemeneti paraméterként használhatók C# és F# nyelven, illetve tulajdonságokként a context.bindings JavaScript objektumán.

Egy Azure Queue Storage-eseményindító például a következő tulajdonságokat támogatja:

  • QueueTrigger – Üzenettartalom aktiválása érvényes sztring esetén
  • DequeueCount
  • ExpirationTime
  • Id
  • InsertionTime
  • NextVisibleTime
  • PopReceipt

Ezek a metaadat-értékek a function.json fájltulajdonságokban érhetők el. Tegyük fel például, hogy egy üzenetsor-eseményindítót használ, és az üzenetsor-üzenet egy elolvasni kívánt blob nevét tartalmazza. A function.json fájlban használhatja queueTrigger a blobtulajdonság path metaadat-tulajdonságát az alábbi példában látható módon:

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

Az egyes eseményindítók metaadat-tulajdonságainak részleteit a megfelelő referenciacikk ismerteti. Példa: Üzenetsor-eseményindító metaadatai. A dokumentáció a portál Integrálás lapján, a kötéskonfigurációs terület alatti Dokumentáció szakaszban is elérhető.

JSON-adattartalmak

Bizonyos esetekben az eseményindító hasznos adatainak tulajdonságaira hivatkozhat az ugyanazon függvényben és függvénykódban található más kötések konfigurációjában. Ehhez az eseményindító hasznos adattartalma JSON, és kisebb, mint az egyes triggerekre jellemző küszöbértékek. A hasznos adatok méretének általában 100 MB-nál kisebbnek kell lennie, de minden eseményindító esetében ellenőriznie kell a referenciatartalmat. Az eseményindító hasznos adattulajdonságainak használata hatással lehet az alkalmazás teljesítményére, és az eseményindító paramétertípusát egyszerű típusokra kényszeríti, például sztringekre vagy JSON-adatokat képviselő egyéni objektumtípusra. Streamekkel, ügyfelekkel vagy más SDK-típusokkal nem használható.

Az alábbi példa egy webhookfüggvény function.json fájlját mutatja be, amely egy blobnevet fogad JSON-ban: {"BlobName":"HelloWorld.txt"}. A blobbemeneti kötés beolvassa a blobot, a HTTP kimeneti kötés pedig visszaadja a blob tartalmát a HTTP-válaszban. Figyelje meg, hogy a Blob bemeneti kötése közvetlenül a tulajdonságra hivatkozva kapja meg a BlobName blob nevét ("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"
    }
  ]
}

Ahhoz, hogy ez működjön C# és F# nyelven, szüksége lesz egy osztályra, amely meghatározza a deszerializálandó mezőket, ahogyan az alábbi példában látható:

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

A JavaScriptben a JSON-deszerializálás automatikusan megtörténik.

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

Pont jelölése

Ha a JSON hasznos adatainak egyes tulajdonságai tulajdonságokat tartalmazó objektumok, akkor pont (.) jelöléssel közvetlenül hivatkozhat ezekre. Ez a jelölés nem működik az Azure Cosmos DB - vagy Table Storage-kötések esetében.

Tegyük fel például, hogy a JSON a következőképpen néz ki:

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

Közvetlenül a következőre hivatkozhat: FileNameBlobName.FileName. Ezzel a JSON-formátummal az path előző példában szereplő tulajdonság így nézne ki:

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

A C#-ban két osztályra lenne szükség:

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

GUID-azonosítók létrehozása

A {rand-guid} kötési kifejezés létrehoz egy GUID azonosítót. A következő blobútvonal egy function.json fájlban létrehoz egy olyan nevű blobot, mint a50710cb5-84b9-4d87-9d83-a03d6976a682.txt.

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

Aktuális idő

A kötési kifejezés DateTime a következőre oldható fel: DateTime.UtcNow. A következő blobútvonal egy function.json fájlban létrehoz egy olyan nevű blobot, mint a2018-02-16T17-59-55Z.txt.

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

Kötés futásidőben

A C# és más .NET-nyelvekben imperatív kötési mintát használhat a function.json és attribútumok deklaratív kötései helyett. Az imperatív kötés akkor hasznos, ha a kötési paramétereket futásidőben kell kiszámítani a tervezési idő helyett. További információért tekintse meg a C#-fejlesztői referenciát vagy a C#-szkript fejlesztői referenciáját.

Következő lépések