你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文概要介绍有关函数触发器和绑定的概念。
触发器会导致函数运行。 触发器定义函数的调用方式,一个函数必须刚好有一个触发器。 触发器还可以将数据传入函数,就像使用方法调用一样。
绑定到函数是以声明方式将函数连接到其他资源的一种方法。 绑定可通过绑定参数将数据传入函数(输入绑定),或将数据从函数写出(输出绑定)。 函数触发器本质上是一种特殊的输入绑定类型。
可以混合搭配多种绑定,以满足函数的特定方案。 绑定是可选项,一个函数可以有一个或多个输入绑定和/或输出绑定。
使用触发器和绑定可以避免对其他服务进行硬编码访问。 函数接收函数参数中的数据(例如,队列消息内容)。 使用函数的返回值发送数据(例如,用于创建队列消息)。
以下示例演示如何实现函数:
| 示例方案 | 触发器 | 输入绑定 | 输出绑定 |
|---|---|---|---|
| 新的队列消息抵达,此时会运行一个函数来写入到另一个队列。 | 队列* | 无 | 队列* |
| 计划的作业读取 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 方法上为返回 MultiResponse 对象的名为 HttpExample 的函数定义的:
[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 函数,触发器和绑定是通过批注特定方法和参数配置的。 名为 HttpTriggerQueueOutput 的函数在 run 方法上定义了此 HTTP 触发器 (@HttpTrigger)。 此函数会将数据写入一个存储队列,该队列由 @QueueOutput 注释在 message 参数上定义:
@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 开发人员指南。
在 Azure Functions 中,针对 Node.js 函数定义触发器和绑定的方式,取决于所使用的 Node.js 版本:
在 Azure Functions 版本 4 的 Node.js 中,可以使用从 @azure/functions 模块导出的对象配置触发器和绑定。 有关详细信息,请参阅 Node.js 开发人员指南。
导出的 app 对象上的 http 方法定义了一个 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.' };
},
});
导出的 app 对象上的 http 方法定义了一个 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 版本:
在适用于 Azure Functions 版本 2 的 Python 中,可以使用修饰符直接在代码中定义函数:
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.x1 | 2.x 及更高2 | 触发器 | 输入 | 输出 |
|---|---|---|---|---|---|
| Blob 存储 | ✔ | ✔ | ✔ | ✔ | ✔ |
| Azure Cosmos DB | ✔ | ✔ | ✔ | ✔ | ✔ |
| Azure 数据资源管理器 | ✔ | ✔ | ✔ | ||
| Azure SQL | ✔ | ✔ | ✔ | ✔ | |
| Dapr4 | ✔ | ✔ | ✔ | ✔ | |
| 事件网格 | ✔ | ✔ | ✔ | ✔ | |
| 事件中心 | ✔ | ✔ | ✔ | ✔ | |
| HTTP 和 网络钩子 | ✔ | ✔ | ✔ | ✔ | |
| IoT 中心 | ✔ | ✔ | ✔ | ||
| Kafka3 | ✔ | ✔ | ✔ | ||
| 移动应用 | ✔ | ✔ | ✔ | ||
| 模型上下文协议 | ✔ | ✔ | |||
| 通知中心 | ✔ | ✔ | |||
| 队列存储 | ✔ | ✔ | ✔ | ✔ | |
| 雷迪斯 | ✔ | ✔ | ✔ | ✔ | |
| RabbitMQ3 | ✔ | ✔ | ✔ | ||
| SendGrid | ✔ | ✔ | ✔ | ||
| 服务总线 | ✔ | ✔ | ✔ | ✔ | |
| Azure SignalR 服务 | ✔ | ✔ | ✔ | ✔ | |
| 表存储 | ✔ | ✔ | ✔ | ✔ | |
| 计时器 | ✔ | ✔ | ✔ | ||
| Twilio | ✔ | ✔ | ✔ |
12026 年 9 月 14 日,Azure Functions 运行时版本 1.x 的支持将结束。 强烈建议将应用迁移到版本 4.x 以获得完全支持。
2 从版本 2.x 运行时开始,除 HTTP 和计时器之外的所有绑定都必须注册。 请参阅 注册 Azure Functions 绑定扩展。
3 消耗计划中不支持触发器。 此绑定类型需要 运行时驱动的触发器。
4 此绑定类型仅在 Kubernetes、Azure IoT Edge 和其他自承载模式下受支持。
有关哪些绑定处于预览状态或已批准在生产环境中使用的信息,请参阅支持的语言。
仅在支持基础服务 SDK 时,才支持特定绑定扩展版本。 基础服务 SDK 版本中对支持的更改会影响对使用扩展的支持。
绑定的代码示例
使用下表查找特定绑定类型的更多示例,这些示例演示如何在函数中使用绑定。 首先,选择与你的项目相对应的语言选项卡。
C# 的绑定代码取决于特定的进程模型。
| 服务 | 示例 | 示例 |
|---|---|---|
| Blob 存储 |
触发器 输入 输出 |
链接。 |
| Azure Cosmos DB |
触发器 输入 输出 |
链接。 |
| Azure 数据资源管理器 |
输入 输出 |
链接。 |
| Azure SQL |
触发器 输入 输出 |
|
| 事件网格 |
触发器 输出 |
链接。 |
| 事件中心 |
触发器 输出 |
|
| IoT 中心 |
触发器 输出 |
|
| HTTP | 触发器 | 链接。 |
| 队列存储 |
触发器 输出 |
链接。 |
| RabbitMQ |
触发器 输出 |
|
| SendGrid | 输出 | |
| 服务总线 |
触发器 输出 |
链接。 |
| Azure SignalR 服务 |
触发器 输入 输出 |
|
| 表存储 |
输入 输出 |
|
| 定时器 | 触发器 | 链接。 |
| Twilio | 输出 | 链接。 |
| 服务 | 示例 | 示例 |
|---|---|---|
| Blob 存储 |
触发器 输入 输出 |
链接。 |
| Azure Cosmos DB |
触发器 输入 输出 |
链接。 |
| Azure 数据资源管理器 |
输入 输出 |
|
| Azure SQL |
触发器 输入 输出 |
链接。 |
| 事件网格 |
触发器 输出 |
链接。 |
| 事件中心 |
触发器 输出 |
|
| IoT 中心 |
触发器 输出 |
|
| HTTP | 触发器 | 链接。 |
| 队列存储 |
触发器 输出 |
链接。 |
| RabbitMQ |
触发器 输出 |
|
| SendGrid | 输出 | |
| 服务总线 |
触发器 输出 |
链接。 |
| Azure SignalR 服务 |
触发器 输入 输出 |
|
| 表存储 |
输入 输出 |
|
| 定时器 | 触发器 | 链接。 |
| Twilio | 输出 | 链接。 |
| 服务 | 示例 | 示例 |
|---|---|---|
| Blob 存储 |
触发器 输入 输出 |
链接。 |
| Azure Cosmos DB |
触发器 输入 输出 |
链接。 |
| Azure SQL |
触发器 输入 输出 |
|
| 事件网格 |
触发器 输出 |
链接。 |
| 事件中心 |
触发器 输出 |
|
| IoT 中心 |
触发器 输出 |
|
| HTTP | 触发器 | 链接。 |
| 队列存储 |
触发器 输出 |
链接。 |
| RabbitMQ |
触发器 输出 |
|
| SendGrid | 输出 | |
| 服务总线 |
触发器 输出 |
链接。 |
| Azure SignalR 服务 |
触发器 输入 输出 |
|
| 表存储 |
输入 输出 |
|
| 定时器 | 触发器 | 链接。 |
| Twilio | 输出 | 链接。 |
Python 的绑定代码取决于 Python 模型版本。
自定义绑定
可以创建自定义输入和输出绑定。 绑定必须以 .NET 编写,但可以在任何支持的语言中使用。 有关创建自定义绑定的详细信息,请参阅创建自定义输入和输出绑定。