Share via


Dapr Invoke-Ausgabebindung für Azure Functions

Wichtig

Die Dapr-Erweiterung für Azure Functions befindet sich derzeit in der Vorschau und wird nur in Azure Container Apps-Umgebungen unterstützt.

Mit der Dapr Invoke-Ausgabebindung können Sie während einer Funktionsausführung eine andere Dapr-Anwendung aufrufen.

Informationen zu Setup- und Konfigurationsdetails der Dapr-Erweiterung finden Sie in der Dapr-Erweiterungsübersicht.

Beispiel

Eine C#-Funktion kann mit einem der folgenden C#-Modi erstellt werden:

Ausführungsmodell Beschreibung
Isoliertes Workermodell Ihr Funktionscode wird in einem separaten .NET-Workerprozess ausgeführt. Verwenden Sie dazu unterstützte Versionen von .NET und .NET Framework. Weitere Informationen finden Sie unter Entwickeln von isolierten .NET-Workerprozessfunktionen.
In-Process-Modell Ihr Funktionscode wird im gleichen Prozess wie der Functions-Hostprozess ausgeführt. Unterstützt nur LTS-Versionen (Long Term Support) von .NET. Weitere Informationen finden Sie unter Entwickeln von .NET-Klassenbibliotheksfunktionen.

Das folgende Beispiel veranschaulicht die Verwendung einer Dapr Invoke-Ausgabebindung, um einen Vorgang zum Aufruf eines Dapr-Dienstes durchzuführen, der in einer anderen Dapr-isierten Anwendung gehostet wird. In diesem Beispiel fungiert die Funktion wie ein 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();
}

Im folgenden Beispiel wird eine "InvokeOutputBinding"-Funktion mithilfe der DaprInvokeOutput-Bindung und einem HttpTrigger erstellt:

@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)

Im folgenden Beispiel wird die Dapr-Ausgabebindung mit einem HTTP-Trigger gekoppelt, der app vom Objekt registriert wird:

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

Die folgenden Beispiele zeigen Dapr-Trigger in der Datei function.json und PowerShell-Code, der diese Bindungen verwendet.

Hier sehen Sie die Datei function.json für daprInvoke:

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

Weitere Informationen zu den Dateieigenschaften von function.json finden Sie im Abschnitt Konfiguration.

In Code:

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

Das folgende Beispiel zeigt eine Dapr Invoke-Ausgabebindung, die das v2 Python-Programmiermodell verwendet. So verwenden Sie daprInvoke in Ihrem Python-Funktions-App-Code:

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'

Attribute

Verwenden Sie im In-Process-Modell das Attribut DaprInvoke, um eine Dapr Invoke-Ausgabebindung zu definieren, die diese Parameter unterstützt:

Parameter Beschreibung Kann per Attribut gesendet werden Kann im RequestBody gesendet werden
AppId Die aufzurufende Dapr App-ID. ✔️ ✔️
MethodName Den Namen der aufzurufenden Methode. ✔️ ✔️
HttpVerb Optional. HTTP-Verb für den Aufruf in der App. Der Standardwert ist POST. ✔️ ✔️
Text Erforderlich. Den Anforderungstext. ✔️

Anmerkungen

Mit der Anmerkung DaprInvokeOutput können Sie ihre Funktion aufrufen und eine Ausgabebindung überwachen.

Element Beschreibung Kann per Attribut gesendet werden Kann im RequestBody gesendet werden
appId Die App-ID der Anwendung, die an der Invoke-Bindung beteiligt ist. ✔️ ✔️
methodName Der Name der Methodenvariable. ✔️ ✔️
httpVerb POST oder GET. ✔️ ✔️
Text Erforderlich. Den Anforderungstext. ✔️

Konfiguration

In der folgenden Tabelle werden die Bindungskonfigurationseigenschaften erläutert, die Sie im Code festlegen.

Eigenschaft Beschreibung Kann per Attribut gesendet werden Kann im RequestBody gesendet werden
appId Die App-ID der Anwendung, die an der Invoke-Bindung beteiligt ist. ✔️ ✔️
methods POST oder GET. ✔️ ✔️
Text Erforderlich. Den Anforderungstext. ✔️

Die folgende Tabelle gibt Aufschluss über die Bindungskonfigurationseigenschaften, die Sie in der Datei function.json festlegen.

function.json-Eigenschaft Beschreibung Kann per Attribut gesendet werden Kann im RequestBody gesendet werden
appId Die App-ID der Anwendung, die an der Invoke-Bindung beteiligt ist. ✔️ ✔️
methodName Der Name der Methodenvariable. ✔️ ✔️
httpVerb POST oder GET. ✔️ ✔️
Text Erforderlich. Den Anforderungstext. ✔️

Die folgende Tabelle gibt Aufschluss über die Bindungskonfigurationseigenschaften für @dapp.dapr_invoke_output, die Sie im Python-Code festlegen.

Eigenschaft Beschreibung Kann per Attribut gesendet werden Kann im RequestBody gesendet werden
app_id Die App-ID der Anwendung, die an der Invoke-Bindung beteiligt ist. ✔️ ✔️
method_name Der Name der Methodenvariable. ✔️ ✔️
http_verb Wird auf post oder get festgelegt. ✔️ ✔️
Text Erforderlich. Den Anforderungstext. ✔️

Wenn Eigenschaften sowohl in Attributen als auch in RequestBody definiert sind, haben die in RequestBody bereitgestellten Daten höhere Priorität.

Vollständige Beispiele finden Sie im Abschnitt Beispiele.

Verwendung

Wenn Sie die Invoke-Ausgabebindung des Dapr-Diensts verwenden möchten, erfahren Sie mehr über die Verwendung des Dapr-Dienstaufrufs in der offiziellen Dapr-Dokumentation.

Um daprInvoke in Python v2 zu verwenden, richten Sie Ihr Projekt mit den richtigen Abhängigkeiten ein.

  1. Erstellen und Aktivieren einer virtuellen Umgebung

  2. Fügen Sie in Ihrer requirements.text-Datei die folgende Zeile hinzu:

    azure-functions==1.18.0b3
    
  3. Installieren Sie im Terminal die Python-Bibliothek.

    pip install -r .\requirements.txt
    
  4. Ändern Sie Ihre local.setting.json-Datei mit der folgenden Konfiguration:

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Nächste Schritte

Erfahren Sie mehr über den Aufruf des Dapr-Dienstes.