你当前正在访问 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 状态输出绑定将新状态保存到状态存储中。

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

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

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

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

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

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

daprState 输出的 function.json 文件如下所示

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

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

在代码中:

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"]

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

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'

属性

进程内模型中,使用 DaprState 定义支持以下参数的 Dapr 状态输出绑定:

参数 说明 可通过 Attribute 发送 可通过 RequestBody 发送
StateStore 要保存状态的状态存储的名称。
在状态存储中保存状态的密钥的名称。
必需。 要存储的值。

批注

通过 DaprStateOutput 注释,可以让函数访问状态存储。

元素 说明 可通过 Attribute 发送 可通过 RequestBody 发送
stateStore 要保存状态的状态存储的名称。
在状态存储中保存状态的密钥的名称。
value 必需。 要存储的值。

配置

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

properties 说明 可通过 Attribute 发送 可通过 RequestBody 发送
stateStore 要保存状态的状态存储的名称。
在状态存储中保存状态的密钥的名称。
value 必需。 要存储的值。

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

“function.json”属性 说明 可通过 Attribute 发送 可通过 RequestBody 发送
stateStore 要保存状态的状态存储的名称。
在状态存储中保存状态的密钥的名称。
value 必需。 要存储的值。

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

properties 说明 可通过 Attribute 发送 可通过 RequestBody 发送
stateStore 要保存状态的状态存储的名称。
在状态存储中保存状态的密钥的名称。
value 必需。 要存储的值。

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

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

使用情况

要使用 Dapr 状态输出绑定,请先设置 Dapr 状态存储组件。 可在 Dapr 官方文档中详细了解可使用的组件及其设置方式。

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

  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 状态管理。