你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Functions 的 Dapr 调用输出绑定

Dapr 调用输出绑定允许在函数执行期间调用另一个 Dapr 应用程序。

若要了解 Dapr 扩展的设置和配置详细信息,请参阅 Dapr 扩展概述

示例

可以使用以下 C# 模式之一创建 C# 函数:

执行模型 说明
独立工作模型 函数代码在单独的 .NET 工作进程中运行。 与受支持的 .NET 和 .NET Framework 版本结合使用。 若要了解详细信息,请参阅开发 .NET 独立工作进程函数
进程模型 函数代码与 Functions 宿主进程在同一进程中运行。 仅支持 .NET 的长期支持 (LTS) 版本。 若要了解详细信息,请参阅开发 .NET 类库函数

以下示例演示如何使用 Dapr 调用输出绑定来执行在另一个 Dapr 化应用程序中托管的 Dapr 服务调用操作。 在此示例中,函数的作用类似于代理。

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

以下示例使用 DaprInvokeOutput 绑定和 HttpTrigger 创建一个 "InvokeOutputBinding" 函数:

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

在以下示例中,Dapr 调用输出绑定与由 app 对象注册的 HTTP 触发器配对:

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

以下示例显示了 function.json 文件中的 Dapr 触发器以及使用这些绑定的 PowerShell 代码。

daprInvoke 的 function.json 文件如下所示

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

有关 function.json 文件属性的详细信息,请参阅配置部分。

在代码中:

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

以下示例显示了一个 Dapr 调用输出绑定,该绑定使用 v2 Python 编程模型。 在 Python 函数应用代码中使用 daprInvoke

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'

属性

进程内模型中,使用 DaprInvoke 属性定义 Dapr 调用输出绑定,该绑定支持以下参数:

参数 说明 可通过 Attribute 发送 可通过 RequestBody 发送
AppId 要调用的 Dapr 应用 ID。
MethodName 要调用的应用的方法名称。
HttpVerb 可选。 使用应用调用的 HTTP 谓词。 默认为 POST
正文 必需。 请求的正文。

批注

DaprInvokeOutput 注释允许调用函数并侦听输出绑定。

元素 说明 可通过 Attribute 发送 可通过 RequestBody 发送
appId 调用绑定中涉及的应用程序的应用 ID。
methodName 方法变量的名称。
httpVerb POST 或 GET。
正文 必需。 请求的正文。

配置

下表说明了在代码中设置的绑定配置属性。

properties 说明 可通过 Attribute 发送 可通过 RequestBody 发送
appId 调用绑定中涉及的应用程序的应用 ID。
methods POST 或 GET。
正文 必需。 请求的正文。

下表解释了在 function.json 文件中设置的绑定配置属性。

“function.json”属性 说明 可通过 Attribute 发送 可通过 RequestBody 发送
appId 调用绑定中涉及的应用程序的应用 ID。
methodName 方法变量的名称。
httpVerb POST 或 GET。
正文 必需。 请求的正文。

下表介绍了在 Python 代码中设置的 @dapp.dapr_invoke_output 的绑定配置属性。

properties 说明 可通过 Attribute 发送 可通过 RequestBody 发送
app_id 调用绑定中涉及的应用程序的应用 ID。
method_name 方法变量的名称。
http_verb 设置为 postget
正文 必需。 请求的正文。

如果属性在 Attributes 和 RequestBody 中定义,则优先于 RequestBody 中提供的数据。

有关完整示例,请参阅示例部分

使用情况

若要使用 Dapr 服务调用输出绑定,请详细了解官方 Dapr 文档中的如何使用 Dapr 服务调用

要在 Python v2 中使用 daprInvoke,请使用正确的依赖项设置项目。

  1. 创建并激活虚拟环境

  2. requirements.text 文件中添加以下行:

    azure-functions==1.18.0b3
    
  3. 在终端中安装 Python 库。

    pip install -r .\requirements.txt
    
  4. 修改具有以下配置的 local.setting.json 文件:

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

后续步骤

详细了解 Dapr 服务调用。