Condividi tramite


Associazione di output Dapr Invoke per Funzioni di Azure

L'associazione di output Dapr Invoke consente di richiamare un'altra applicazione 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 di un'associazione di output Dapr Invoke per eseguire un'operazione di chiamata al servizio Dapr ospitata in un'altra applicazione con Dapr. In questo esempio la funzione funge da proxy.

[FunctionName("InvokeOutputBinding")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = "invoke/{appId}/{methodName}")] HttpRequest req,
    [DaprInvoke(AppId = "{appId}", MethodName = "{methodName}", HttpVerb = "post")] IAsyncCollector<InvokeMethodParameters> output,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

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

    var outputContent = new InvokeMethodParameters
    {
        Body = requestBody
    };

    await output.AddAsync(outputContent);

    return new OkResult();
}

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

@FunctionName("InvokeOutputBinding")
public String run(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.GET, HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS,
            route = "invoke/{appId}/{methodName}")
            HttpRequestMessage<Optional<String>> request,
        @DaprInvokeOutput(
            appId = "{appId}", 
            methodName = "{methodName}", 
            httpVerb = "post")
        OutputBinding<String> payload,
        final ExecutionContext context)

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

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

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

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

        return { body: 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 daprInvoke:

{
  "bindings":
    {
      "type": "daprInvoke",
      "direction": "out",
      "appId": "{appId}",
      "methodName": "{methodName}",
      "httpVerb": "post",
      "name": "payload"
    }
}

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

Nel codice:

using namespace System.Net

# Input bindings are passed in via param block.
param($req, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "Powershell InvokeOutputBinding processed a request."

$req_body = $req.Body

$invoke_output_binding_req_body = @{
    "body" = $req_body
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name payload -Value $invoke_output_binding_req_body

Push-OutputBinding -Name res -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $req_body
})

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

import logging
import json
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="InvokeOutputBinding")
@app.route(route="invoke/{appId}/{methodName}", auth_level=dapp.auth_level.ANONYMOUS)
@app.dapr_invoke_output(arg_name = "payload", app_id = "{appId}", method_name = "{methodName}", http_verb = "post")
def main(req: func.HttpRequest, payload: func.Out[str] ) -> str:
    # request body must be passed this way "{\"body\":{\"value\":{\"key\":\"some value\"}}}" to use the InvokeOutputBinding, all the data must be enclosed in body property.
    logging.info('Python function processed a InvokeOutputBinding request from the Dapr Runtime.')

    body = req.get_body()
    logging.info(body)
    if body is not None:
        payload.set(body)
    else:
        logging.info('req body is none')
    return 'ok'

Attributi

Nel modello in-process usare l'attributo DaprInvoke per definire un'associazione di output Dapr Invoke, che supporta questi parametri:

Parametro Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
AppId ID dell'app Dapr da richiamare. ✔️ ✔️
MethodName Nome del metodo dell'app da richiamare. ✔️ ✔️
HttpVerb Facoltativo. Verbo HTTP da usare per l'app da richiamare. Il valore predefinito è POST. ✔️ ✔️
Testo Obbligatorio. Il corpo della richiesta. ✔️

Annotazioni

L'annotazione DaprInvokeOutput consente di richiamare la funzione e di ascoltare un'associazione di output.

Elemento Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
IDapp ID app dell'applicazione coinvolta nell'associazione Invoke. ✔️ ✔️
methodName Nome della variabile del metodo. ✔️ ✔️
httpVerb Pubblicare o ottenere. ✔️ ✔️
body Obbligatorio. Il corpo della richiesta. ✔️

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
IDapp ID app dell'applicazione coinvolta nell'associazione Invoke. ✔️ ✔️
methods Pubblicare o ottenere. ✔️ ✔️
body Obbligatorio. Il corpo della richiesta. ✔️

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
IDapp ID app dell'applicazione coinvolta nell'associazione Invoke. ✔️ ✔️
methodName Nome della variabile del metodo. ✔️ ✔️
httpVerb Pubblicare o ottenere. ✔️ ✔️
body Obbligatorio. Il corpo della richiesta. ✔️

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

Proprietà Descrizione Può essere inviato tramite Attributo Può essere inviato tramite RequestBody
app_id ID app dell'applicazione coinvolta nell'associazione Invoke. ✔️ ✔️
method_name Nome della variabile del metodo. ✔️ ✔️
http_verb Impostare su post o get. ✔️ ✔️
body Obbligatorio. Il corpo della richiesta. ✔️

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 output delle chiamate al servizio Dapr, altre informazioni su come usare la chiamata al servizio Dapr nella documentazione ufficiale di Dapr.

Per usare daprInvoke 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 chiamata al servizio Dapr.