本文介绍有关函数触发器和绑定的高级概念。
触发器会导致函数运行。 触发器定义如何调用函数,并且函数必须只有一个触发器。 触发器还可以将数据传入函数,就像使用方法调用一样。
绑定到函数是一种以声明方式将函数连接到其他资源的方法。 绑定将数据传入函数(输入绑定),或者允许使用绑定参数将数据从函数(输出绑定)中写出。 函数触发器本质上是一种特殊的输入绑定类型。
可以混合和匹配绑定,以适应函数的特定方案。 绑定是可选的,一个函数可能具有一个或多个输入和/或输出绑定。
使用触发器和绑定可以避免对其他服务进行硬编码访问。 函数接收函数参数中的数据(例如,队列消息内容)。 使用函数的返回值发送数据(例如,用于创建队列消息)。
请考虑以下示例,了解如何实现函数:
示例方案 | 触发器 | 输入绑定 | 输出绑定 |
---|---|---|---|
新的队列消息到达,该消息运行函数以写入另一个队列。 | 队列* | 没有 | 队列* |
计划作业读取 Azure Blob 存储内容并创建新的 Azure Cosmos DB 文档。 | 定时器 | Blob 存储 | Azure Cosmos DB |
Azure 事件网格用于从 Blob 存储读取映像,以及 Azure Cosmos DB 中的文档以发送电子邮件。 | 事件网格 | Blob 存储和 Azure Cosmos DB | SendGrid |
* 表示不同的队列。
这些示例并非详尽无遗,但它们说明了如何将触发器和绑定一起使用。 有关更全面的方案集,请参阅 Azure Functions 方案。
提示
Azure Functions 不需要使用输入和输出绑定连接到 Azure 服务。 始终可以在代码中创建 Azure SDK 客户端,并将其用于数据传输。 有关详细信息,请参阅 “连接到服务”。
触发器和绑定的定义
以下示例显示了一个 HTTP 触发的函数,其中包含将消息写入 Azure 存储队列的输出绑定。
对于 C# 类库函数,可以通过使用 C# 属性修饰方法和参数来配置触发器和绑定。 应用的特定属性可能取决于 C# 运行时模型:
HTTP 触发器 (HttpTrigger
) 是在 Run
方法上为返回 HttpExample
对象的名为 MultiResponse
的函数定义的:
[Function("HttpExample")]
public static MultiResponse Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req,
FunctionContext executionContext)
{
此示例显示 MultiResponse
对象定义。 对象定义返回 HttpResponse
HTTP 请求,并使用 QueueOutput
绑定将消息写入存储队列:
public class MultiResponse
{
[QueueOutput("outqueue",Connection = "AzureWebJobsStorage")]
public string[] Messages { get; set; }
public HttpResponseData HttpResponse { get; set; }
}
有关详细信息,请参阅 独立辅助角色模型的 C# 指南。
旧 C# 脚本函数使用 function.json
定义文件。 有关详细信息,请参阅 Azure Functions C# 脚本 (.csx) 开发人员参考。
对于 Java 函数,可以通过批注特定方法和参数来配置触发器和绑定。 此 HTTP 触发器 () 在名为 message
定义的存储队列@QueueOutput
:
@FunctionName("HttpExample")
public HttpResponseMessage run(
@HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
@QueueOutput(name = "msg", queueName = "outqueue",
connection = "AzureWebJobsStorage") OutputBinding<String> msg,
final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
有关详细信息,请参阅 Java 开发人员指南。
为 Node.js 函数定义触发器和绑定的方式取决于 Azure Functions 的特定 Node.js 版本:
在 Azure Functions 版本 4 的 Node.js 中,可以使用从 @azure/functions
模块导出的对象来配置触发器和绑定。 有关详细信息,请参阅 Node.js 开发人员指南。
http
导出app
对象上的方法定义 HTTP 触发器。
output
该方法storageQueue
定义此触发器上的输出绑定。
const { app, output } = require('@azure/functions');
const queueOutput = output.storageQueue({
queueName: 'outqueue',
connection: 'MyStorageConnectionAppSetting',
});
app.http('httpTrigger1', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
extraOutputs: [queueOutput],
handler: async (request, context) => {
const body = await request.text();
context.extraOutputs.set(queueOutput, body);
return { body: 'Created queue item.' };
},
});
http
导出app
对象上的方法定义 HTTP 触发器。
output
该方法storageQueue
定义此触发器上的输出绑定。
import { app, HttpRequest, HttpResponseInit, InvocationContext, output } from '@azure/functions';
const queueOutput = output.storageQueue({
queueName: 'outqueue',
connection: 'MyStorageConnectionAppSetting',
});
export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
const body = await request.text();
context.extraOutputs.set(queueOutput, body);
return { body: 'Created queue item.' };
}
app.http('httpTrigger1', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
extraOutputs: [queueOutput],
handler: httpTrigger1,
});
此示例 function.json
文件会定义函数:
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "Response"
},
{
"type": "queue",
"direction": "out",
"name": "msg",
"queueName": "outqueue",
"connection": "AzureWebJobsStorage"
}
]
}
有关详细信息,请参阅 PowerShell 开发人员指南。
定义函数的方式取决于适用于 Azure Functions 的 Python 版本:
在 Python for Azure Functions 版本 2 中,使用修饰器直接在代码中定义函数:
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.route(route="HttpExample")
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
def HttpExample(req: func.HttpRequest, msg: func.Out [func.QueueMessage]) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
绑定注意事项
并非所有服务都支持输入和输出绑定。 有关 绑定的特定代码示例,请参阅特定的绑定扩展。
触发器和绑定的定义根据开发语言的不同而异。 请确保选择本文 顶部 的语言。
触发器和绑定名称限制为字母数字字符和下划线
_
。
将绑定添加到函数的任务
可以使用输入或输出绑定将函数连接到其他服务。 通过向函数添加绑定的具体定义来添加绑定。 若要了解如何作,请参阅 将绑定添加到 Azure Functions 中的现有函数。
Azure Functions 支持多个绑定,这些绑定必须正确配置。 例如,函数可以从队列(输入绑定)读取数据,并将数据同时写入数据库(输出绑定)。
支持的绑定
下表显示了 Azure Functions 运行时的主版本支持的绑定:
类型 | 1.x | 2.x 及更高版本1 | 触发器 | 输入 | 输出 |
---|---|---|---|---|---|
Blob 存储 | ✔ | ✔ | ✔ | ✔ | ✔ |
Azure Cosmos DB | ✔ | ✔ | ✔ | ✔ | ✔ |
Azure SQL | ✔ | ✔ | ✔ | ✔ | |
Dapr3 | ✔ | ✔ | ✔ | ✔ | |
事件网格 | ✔ | ✔ | ✔ | ✔ | |
事件中心 | ✔ | ✔ | ✔ | ✔ | |
HTTP 和 Webhook | ✔ | ✔ | ✔ | ✔ | |
IoT 中心 | ✔ | ✔ | ✔ | ||
Kafka2 | ✔ | ✔ | ✔ | ||
移动应用 | ✔ | ✔ | ✔ | ||
通知中心 | ✔ | ✔ | |||
队列存储 | ✔ | ✔ | ✔ | ✔ | |
RabbitMQ2 | ✔ | ✔ | ✔ | ||
SendGrid | ✔ | ✔ | ✔ | ||
服务总线 | ✔ | ✔ | ✔ | ✔ | |
SignalR | ✔ | ✔ | ✔ | ✔ | |
表格存储 | ✔ | ✔ | ✔ | ✔ | |
定时器 | ✔ | ✔ | ✔ |
1 从版本 2.x 运行时开始,除 HTTP 和计时器之外的所有绑定都必须注册。 请参阅 “注册绑定扩展”。
2 消耗计划中不支持触发器。 需要 运行时驱动的触发器。
3 仅在 Kubernetes、IoT Edge 和其他自承载模式下受支持。
有关哪些绑定处于预览状态或已批准用于生产用途的信息,请参阅 支持的语言。
仅当基础服务 SDK 受支持时,才支持特定版本的绑定扩展。 基础服务 SDK 版本中对支持的更改会影响对使用扩展的支持。
绑定的代码示例
使用下表查找特定绑定类型的更多示例,这些示例演示如何在函数中使用绑定。 首先,选择与你的项目相对应的语言选项卡。
服务 | 示例 | 示例 |
---|---|---|
Blob 存储 |
触发器 输入 输出 |
链接 |
Azure Cosmos DB |
触发器 输入 输出 |
链接 |
Azure SQL |
触发器(预览版) 输入 输出 |
链接 |
事件网格 |
触发器 输出 |
链接 |
事件中心 |
触发器 输出 |
|
IoT 中心 |
触发器 输出 |
|
HTTP | 触发器 | 链接 |
队列存储 |
触发器 输出 |
链接 |
RabbitMQ |
触发器 输出 |
|
SendGrid | 输出 | |
服务总线 |
触发器 输出 |
链接 |
SignalR |
触发器 输入 输出 |
|
表存储 |
输入 输出 |
|
定时器 | 触发器 | 链接 |
自定义绑定
可以创建自定义输入和输出绑定。 绑定必须在 .NET 中创作,但可以从任何受支持的语言使用它们。 有关创建自定义绑定的详细信息,请参阅 创建自定义输入和输出绑定。