wzorce wyrażeń powiązań Azure Functions

Jedną z najbardziej zaawansowanych funkcji wyzwalaczy i powiązań jest wyrażenie powiązania. W pliku function.json i parametrach funkcji i kodzie można użyć wyrażeń rozpoznawanych jako wartości z różnych źródeł.

Większość wyrażeń identyfikuje się przez umieszczenie ich w nawiasach klamrowych. Na przykład w funkcji {queueTrigger} wyzwalacza kolejki jest rozpoznawany tekst komunikatu kolejki. path Jeśli właściwość powiązania wyjściowego obiektu blob jest container/{queueTrigger} i funkcja jest wyzwalana przez komunikat HelloWorldkolejki , zostanie utworzony obiekt blob o nazwie HelloWorld .

Typy wyrażeń powiązania

Wyrażenia powiązania — ustawienia aplikacji

Najlepszym rozwiązaniem jest zarządzanie wpisami tajnymi i parametrami połączenia przy użyciu ustawień aplikacji, a nie plików konfiguracji. Ogranicza to dostęp do tych wpisów tajnych i zapewnia bezpieczeństwo przechowywania plików, takich jak function.json w repozytoriach kontroli źródła publicznego.

Ustawienia aplikacji są również przydatne za każdym razem, gdy chcesz zmienić konfigurację na podstawie środowiska. Na przykład w środowisku testowym możesz monitorować inny kontener kolejki lub magazynu obiektów blob.

Wyrażenia powiązań ustawień aplikacji są identyfikowane inaczej niż inne wyrażenia powiązań: są one opakowane w znaki procentowe, a nie nawiasy klamrowe. Jeśli na przykład ścieżka powiązania danych wyjściowych obiektu blob to %Environment%/newblob.txt , a Environment wartość ustawienia aplikacji to Development, obiekt blob zostanie utworzony w kontenerze Development .

Gdy funkcja działa lokalnie, wartości ustawień aplikacji pochodzą z pliku local.settings.json .

Uwaga

Właściwość connection wyzwalaczy i powiązań jest specjalnym przypadkiem i automatycznie rozpoznaje wartości jako ustawienia aplikacji bez znaków procentowych.

Poniższy przykład to wyzwalacz usługi Azure Queue Storage, który używa ustawienia %input_queue_name% aplikacji do zdefiniowania kolejki do wyzwalania.

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

Możesz użyć tego samego podejścia w bibliotekach klas:

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

Nazwa pliku wyzwalacza

Wyzwalacz path obiektu blob może być wzorcem, który umożliwia odwoływanie się do nazwy wyzwalającego obiektu blob w innych powiązaniach i kodzie funkcji. Wzorzec może również obejmować kryteria filtrowania, które określają, które obiekty blob mogą wyzwalać wywołanie funkcji.

Na przykład w poniższym powiązaniu path wyzwalacza obiektu blob wzorzec to sample-images/{filename}, który tworzy wyrażenie powiązania o nazwie filename:

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

filename Wyrażenie można następnie użyć w powiązaniu wyjściowym, aby określić nazwę tworzonego obiektu blob:

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

Kod funkcji ma dostęp do tej samej wartości przy użyciu filename nazwy 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}");
    // ...
} 

Ta sama możliwość używania wyrażeń powiązań i wzorców ma zastosowanie do atrybutów w bibliotekach klas. W poniższym przykładzie parametry konstruktora atrybutów są takie same path jak poprzednie przykłady 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}");
    // ...
}

Można również tworzyć wyrażenia dla części nazwy pliku. W poniższym przykładzie funkcja jest wyzwalana tylko w nazwach plików pasujących do wzorca: anyname-anyfile.csv

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

Aby uzyskać więcej informacji na temat używania wyrażeń i wzorców w ciągu ścieżki obiektu blob, zobacz dokumentację powiązania obiektu blob usługi Storage.

Metadane wyzwalacza

Oprócz ładunku danych dostarczonego przez wyzwalacz (na przykład zawartość komunikatu kolejki, który wyzwolił funkcję), wiele wyzwalaczy zapewnia dodatkowe wartości metadanych. Te wartości mogą być używane jako parametry wejściowe w języku C# i F# lub właściwości obiektu context.bindings w języku JavaScript.

Na przykład wyzwalacz usługi Azure Queue Storage obsługuje następujące właściwości:

  • QueueTrigger — wyzwalanie zawartości komunikatu, jeśli prawidłowy ciąg
  • DequeueCount
  • ExpirationTime
  • Id
  • InsertionTime
  • NextVisibleTime
  • PopReceipt

Te wartości metadanych są dostępne we właściwościach pliku function.json . Załóżmy na przykład, że używasz wyzwalacza kolejki, a komunikat kolejki zawiera nazwę obiektu blob, który chcesz odczytać. W pliku function.json można użyć queueTrigger właściwości metadata we właściwości obiektu blob path , jak pokazano w poniższym przykładzie:

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

Szczegółowe informacje o właściwościach metadanych dla każdego wyzwalacza opisano w odpowiednim artykule referencyjnym. Aby zapoznać się z przykładem, zobacz metadane wyzwalacza kolejki. Dokumentacja jest również dostępna na karcie Integracja portalu w sekcji Dokumentacja poniżej obszaru konfiguracji powiązania.

Ładunki JSON

W niektórych scenariuszach można odwoływać się do właściwości ładunku wyzwalacza w konfiguracji dla innych powiązań w tej samej funkcji i w kodzie funkcji. Wymaga to, aby ładunek wyzwalacza był JSON i jest mniejszy niż próg specyficzny dla każdego wyzwalacza. Zazwyczaj rozmiar ładunku musi być mniejszy niż 100 MB, ale należy sprawdzić zawartość referencyjną dla każdego wyzwalacza. Użycie właściwości ładunku wyzwalacza może mieć wpływ na wydajność aplikacji i wymusza, aby typ parametru wyzwalacza był prostymi typami, takimi jak ciągi lub niestandardowy typ obiektu reprezentujący dane JSON. Nie można jej używać ze strumieniami, klientami ani innymi typami zestawu SDK.

Poniższy przykład przedstawia plik function.json dla funkcji elementu webhook, która odbiera nazwę obiektu blob w formacie JSON: {"BlobName":"HelloWorld.txt"}. Powiązanie wejściowe obiektu blob odczytuje obiekt blob, a powiązanie wyjściowe HTTP zwraca zawartość obiektu blob w odpowiedzi HTTP. Zwróć uwagę, że powiązanie wejściowe obiektu blob pobiera nazwę obiektu blob, odwołując się bezpośrednio do BlobName właściwości ("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 można było pracować w języku C# i F#, potrzebna jest klasa definiująca pola do deserializacji, jak w poniższym przykładzie:

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

W języku JavaScript deserializacja JSON jest wykonywana automatycznie.

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

Notacja kropkowa

Jeśli niektóre właściwości ładunku JSON są obiektami z właściwościami, możesz odwoływać się do nich bezpośrednio przy użyciu notacji kropkowej (.). Ta notacja nie działa w przypadku powiązań usługi Azure Cosmos DB ani usługi Table Storage .

Załóżmy na przykład, że kod JSON wygląda następująco:

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

Możesz odwoływać się bezpośrednio do FileName .BlobName.FileName W tym formacie JSON poniżej przedstawiono, jak path wyglądałaby właściwość w poprzednim przykładzie:

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

W języku C#potrzebne są dwie klasy:

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

Tworzenie identyfikatorów GUID

Wyrażenie {rand-guid} powiązania tworzy identyfikator GUID. Następująca ścieżka obiektu blob w function.json pliku tworzy obiekt blob o nazwie, takiej jak 50710cb5-84b9-4d87-9d83-a03d6976a682.txt.

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

Bieżący czas

Wyrażenie DateTime powiązania jest rozpoznawane jako DateTime.UtcNow. Następująca ścieżka obiektu blob w function.json pliku tworzy obiekt blob o nazwie, takiej jak 2018-02-16T17-59-55Z.txt.

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

Wiązanie w czasie wykonywania

W języku C# i innych językach platformy .NET można użyć wzorca powiązania imperatywnego, w przeciwieństwie do powiązań deklaratywnych w pliku function.json i atrybutach. Powiązanie imperatywne jest przydatne, gdy parametry powiązania muszą być obliczane w czasie wykonywania, a nie w czasie projektowania. Aby dowiedzieć się więcej, zobacz dokumentację dla deweloperów języka C# lub dokumentację dla deweloperów skryptów języka C#.

Następne kroki