你当前正在访问 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'
属性
批注
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。 | ✔ | ✔ |
正文 | 必需。 请求的正文。 | ❌ | ✔ |
如果属性在 Attributes 和 RequestBody
中定义,则优先于 RequestBody
中提供的数据。
有关完整示例,请参阅示例部分。
使用情况
若要使用 Dapr 服务调用输出绑定,请详细了解官方 Dapr 文档中的如何使用 Dapr 服务调用。