本文介绍有关函数触发器和绑定的高级概念。
触发器会导致函数运行。 触发器定义如何调用函数,并且函数必须只有一个触发器。 触发器还可以将数据传入函数,就像使用方法调用一样。
绑定到函数是一种以声明方式将函数连接到其他资源的方法。 绑定将数据传入函数(输入绑定),或者允许使用绑定参数将数据从函数(输出绑定)中写出。 函数触发器本质上是一种特殊的输入绑定类型。
可以混合和匹配绑定,以适应函数的特定方案。 绑定是可选的,一个函数可能具有一个或多个输入和/或输出绑定。
使用触发器和绑定可以避免对其他服务进行硬编码访问。 函数接收函数参数中的数据(例如,队列消息内容)。 使用函数的返回值发送数据(例如,用于创建队列消息)。
请考虑以下示例,了解如何实现函数:
| 示例方案 | 触发器 | 输入绑定 | 输出绑定 | 
|---|---|---|---|
| 新的队列消息到达,该消息运行函数以写入另一个队列。 | 队列* | 没有 | 队列* | 
| 计划作业读取 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 中创作,但可以从任何受支持的语言使用它们。 有关创建自定义绑定的详细信息,请参阅 创建自定义输入和输出绑定。