Associazione di output dello stato Dapr per Funzioni di Azure

Scegliere un linguaggio di programmazione

L'associazione di output stato Dapr consente di salvare un valore a uno stato Dapr durante l'esecuzione di una funzione.

Per informazioni sull'installazione e sulla configurazione dell'estensione Dapr, vedere panoramica dell'estensione Dapr.

Esempio

È possibile creare una funzione C# usando una delle modalità C# seguenti:

Modello di esecuzione Descrizione
Modello di lavoro isolato Il codice della funzione viene eseguito in un processo di lavoro .NET separato. Usare con le versioni supportate di .NET e .NET Framework. Per altre informazioni, vedere Sviluppare funzioni di processo di lavoro isolato .NET.
Modello di processo Il codice della funzione viene eseguito nello stesso processo del processo host di Funzioni. Supporta solo versioni LTS (Long Term Support) di .NET. Per altre informazioni, vedere Sviluppare funzioni della libreria di classi .NET.

Nell'esempio seguente viene illustrato l'uso dell'associazione di output dello stato Dapr per rendere persistente un nuovo stato nell'archivio degli stati.

[FunctionName("StateOutputBinding")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "state/{key}")] HttpRequest req,
    [DaprState("statestore", Key = "{key}")] IAsyncCollector<string> state,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    await state.AddAsync(requestBody);

    return new OkResult();
}

Nell'esempio seguente viene creata una funzione "CreateNewOrderHttpTrigger" usando l'associazione DaprStateOutput con un HttpTrigger:

@FunctionName("CreateNewOrderHttpTrigger")
public String run(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
        @DaprStateOutput(
            stateStore = "%StateStoreName%",
            key = "product")
        OutputBinding<String> product,
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger (CreateNewOrderHttpTrigger) processed a request.");
}

Nell'esempio seguente, l'associazione di output dello stato Dapr viene associata a un trigger HTTP registrato dall'oggetto app:

const { app, trigger } = require('@azure/functions');

app.generic('StateOutputBinding', {
    trigger: trigger.generic({
        type: 'httpTrigger',
        authLevel: 'anonymous',
        methods: ['POST'],
        route: "state/{key}",
        name: "req"
    }),
    return: daprStateOutput,
    handler: async (request, context) => {
        context.log("Node HTTP trigger function processed a request.");

        const payload = await request.text();
        context.log(JSON.stringify(payload));

        return { value : payload };
    }
});

Gli esempi seguenti illustrano i trigger Dapr in un file function.json e nel codice di PowerShell che usano tali associazioni.

Ecco il file function.json per l'output daprState:

{
  "bindings": 
    {
      "type": "daprState",
      "stateStore": "%StateStoreName%",
      "direction": "out",
      "name": "order",
      "key": "order"
    }
}

Per altre informazioni sulle proprietà dei file function.json, vedere la sezione configurazione.

Nel codice:

using namespace System
using namespace Microsoft.Azure.WebJobs
using namespace Microsoft.Extensions.Logging
using namespace Microsoft.Azure.WebJobs.Extensions.Dapr
using namespace Newtonsoft.Json.Linq

param (
    $payload
)

# C# function processed a CreateNewOrder request from the Dapr Runtime.
Write-Host "PowerShell function processed a CreateNewOrder request from the Dapr Runtime."

# Payload must be of the format { "data": { "value": "some value" } }

# Convert the object to a JSON-formatted string with ConvertTo-Json
$jsonString = $payload| ConvertTo-Json

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name order -Value $payload["data"]

L'esempio seguente mostra un'associazione di output dello Stato Dapr, che usa il modello di programmazione Python v2. Per usare daprState nel codice dell'app per le funzioni Python:

import logging
import json
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="HttpTriggerFunc")
@app.route(route="req", auth_level=dapp.auth_level.ANONYMOUS)
@app.dapr_state_output(arg_name="state", state_store="statestore", key="newOrder")
def main(req: func.HttpRequest, state: func.Out[str] ) -> str:
    # request body must be passed this way '{\"value\": { \"key\": \"some value\" } }'
    body = req.get_body()
    if body is not None:
        state.set(body.decode('utf-8'))
        logging.info(body.decode('utf-8'))
    else:
        logging.info('req body is none')
    return 'ok'

Attributi

Nel modello In-process usare il DaprState per definire un'associazione di output dello stato Dapr, che supporta questi parametri:

Parametro Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
StateStore Nome del file di archivio degli stati in cui salvare lo stato. ✔️
Chiave Nome della chiave per salvare lo stato all'interno dell'archivio degli stati. ✔️ ✔️
valore Obbligatorio. Valore in corso di archiviazione. ✔️

Annotazioni

L'annotazione DaprStateOutput consente di avere accesso di funzione a un archivio di stati.

Elemento Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
stateStore Nome del file di archivio degli stati in cui salvare lo stato. ✔️
key Nome della chiave per salvare lo stato all'interno dell'archivio degli stati. ✔️ ✔️
value Obbligatorio. Valore in corso di archiviazione. ✔️

Impostazione

Nella tabella seguente vengono illustrate le proprietà di configurazione dell'associazione impostate nel codice.

Proprietà Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
stateStore Nome del file di archivio degli stati in cui salvare lo stato. ✔️
key Nome della chiave per salvare lo stato all'interno dell'archivio degli stati. ✔️ ✔️
value Obbligatorio. Valore in corso di archiviazione. ✔️

Nella tabella seguente sono illustrate le proprietà di configurazione dell'associazione impostate nel file function.json.

Proprietà di function.json Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
stateStore Nome del file di archivio degli stati in cui salvare lo stato. ✔️
key Nome della chiave per salvare lo stato all'interno dell'archivio degli stati. ✔️ ✔️
value Obbligatorio. Valore in corso di archiviazione. ✔️

La tabella seguente illustra le proprietà di configurazione dell'associazione per @dapp.dapr_state_output impostate nel codice Python.

Proprietà Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
stateStore Nome del file di archivio degli stati in cui salvare lo stato. ✔️
key Nome della chiave per salvare lo stato all'interno dell'archivio degli stati. ✔️ ✔️
value Obbligatorio. Valore in corso di archiviazione. ✔️

Se le proprietà sono definite sia in Attributi che in RequestBody, la priorità viene assegnata ai dati forniti in RequestBody.

Per esempi completi, vedere la sezione di esempio.

Utilizzo

Per usare l'associazione di input dello stato Dapr, iniziare configurando un componente dell'archivio degli stati Dapr. Per altre informazioni sul componente da usare e su come configurarlo, vedere la documentazione ufficiale di Dapr.

Per usare daprState in Python v2, configurare il progetto con le dipendenze corrette.

  1. Creare e attivare un ambiente virtuale.

  2. Nel file requirements.text aggiungere la riga seguente:

    azure-functions==1.18.0b3
    
  3. Nel terminale installare la libreria Python.

    pip install -r .\requirements.txt
    
  4. Modificare il file local.setting.json con la configurazione seguente:

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Passaggi successivi

Altre informazioni sulla gestione dello stato Dapr.