Dapr 调用输出绑定允许在函数执行期间调用另一个 Dapr 应用程序。
若要了解 Dapr 扩展的设置和配置详细信息,请参阅 Dapr 扩展概述。
示例:
可以使用以下 C# 模式之一创建 C# 函数:
执行模型 | DESCRIPTION |
---|---|
独立工作模型 | 函数代码在单独的 .NET 工作进程中运行。 与 支持的 .NET 和 .NET Framework 版本一起使用。 若要了解详细信息,请参阅 独立辅助角色模型中运行 C# Azure Functions 的指南。 |
进程内模型 | 函数代码与 Functions 宿主进程在同一进程中运行。 仅支持 .NET 的长期支持 (LTS) 版本。 若要了解详细信息,请参阅 使用 Azure Functions 开发 C# 类库函数。 |
以下示例演示如何使用 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
绑定和以下内容创建一个"InvokeOutputBinding"
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)
在以下示例中,Dapr 调用输出绑定与 HTTP 触发器配对,该触发器由 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 };
}
});
以下示例显示了 function.json 文件中的 Dapr 触发器以及使用这些绑定的 PowerShell 代码。
的 function.json 文件如下所示daprInvoke
:
{
"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 Invoke 输出绑定,该绑定使用 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
批注,可以调用函数并侦听输出绑定。
元素 | DESCRIPTION | 可通过 Attribute 发送 | 可通过 RequestBody 发送 |
---|---|---|---|
appId | 调用绑定中涉及的应用程序的应用 ID。 | ✔️ | ✔️ |
methodName | 方法变量的名称。 | ✔️ | ✔️ |
httpVerb | 发布或获取。 | ✔️ | ✔️ |
身体 | 必填。 请求的正文。 | ❌ | ✔️ |
配置
下表说明了在代码中设置的绑定配置属性。
资产 | DESCRIPTION | 可通过 Attribute 发送 | 可通过 RequestBody 发送 |
---|---|---|---|
appId | 调用绑定中涉及的应用程序的应用 ID。 | ✔️ | ✔️ |
methods | 发布或获取。 | ✔️ | ✔️ |
身体 | 必填。 请求的正文。 | ❌ | ✔️ |
下表解释了在 function.json 文件中设置的绑定配置属性。
“function.json”属性 | DESCRIPTION | 可通过 Attribute 发送 | 可通过 RequestBody 发送 |
---|---|---|---|
appId | 调用绑定中涉及的应用程序的应用 ID。 | ✔️ | ✔️ |
methodName | 方法变量的名称。 | ✔️ | ✔️ |
httpVerb | 发布或获取。 | ✔️ | ✔️ |
身体 | 必填。 请求的正文。 | ❌ | ✔️ |
如果属性在 Attributes 和 RequestBody
中定义,则优先于 RequestBody
中提供的数据。
有关完整示例,请参阅示例部分。
用法
若要使用 Dapr 服务调用输出绑定,请详细了解 如何在官方 Dapr 文档中使用 Dapr 服务调用。