创建触发器和绑定
触发器定义函数的调用方式,一个函数必须刚好有一个触发器。 触发器具有关联的数据,这些数据通常作为函数的有效负载提供。
绑定到函数是一种以声明方式将另一个资源连接到函数的方法;绑定可以作为输入绑定、输出绑定或两者同时连接。 绑定中的数据作为参数提供给函数。
可根据需要,混合搭配不同的绑定。 绑定是可选项,一个函数可以有一个或多个输入和/或输出绑定。
使用触发器和绑定可以避免对其他服务进行硬编码访问。 函数接收函数参数中的数据(例如,队列消息内容)。 使用函数的返回值发送数据(例如,用于创建队列消息)。
在本地开发函数时,你需要考虑触发器和绑定行为。 对于 HTTP 触发器,您可以在本地计算机上调用 HTTP 终结点,使用 http://localhost/。 对于非 HTTP 触发的函数,有几个在本地运行的选项:
- 在本地开发过程中对绑定进行测试的最简单方法是,使用面向实时 Azure 服务的连接字符串。 可以通过在 local.settings.json 文件中的
Values数组中添加相应的连接字符串设置来将实时服务设置为目标。 执行此作时,测试期间的本地执行使用实时服务数据。 因此,请考虑设置单独的服务以在开发和测试期间使用,然后在生产期间切换到其他服务。 - 对于基于存储的触发器,在使用 Azure 存储绑定(队列存储、Blob 存储和表存储)测试函数时,可以使用本地 Azurite 模拟器 ,而无需连接到远程存储服务。
- 可以使用特殊的管理员终结点手动运行非 HTTP 触发器函数。 有关详细信息,请参阅 手动运行非 HTTP 触发的函数。
触发器和绑定的定义
触发器和绑定根据开发语言和运行时模型以不同的方式定义。
| 语言 | 通过…配置触发器和绑定 |
|---|---|
| C# 类库 | 使用 C# 特性修饰方法和参数(进程内或独立工作器) |
| Java | 使用 Java 注释修饰方法和参数 |
| JavaScript/TypeScript | v4 编程模型:使用 @azure/functions在代码中定义输入/输出;v3:在每个函数的function.json中配置 |
| Python | v2 编程模型:使用修饰器定义输入/输出;v1:在 function.json 中配置 |
| PowerShell | 在 function.json 中配置 |
注释
在新式模型中(Node.js v4 和 Python v2),可在代码中创作触发器和绑定配置,运行时将生成相应的 function.json。 旧模型(Node.js v3、Python v1、PowerShell)直接使用 function.json 。 不能在同一函数应用中混合编程模型。
对于依赖于 function.json 的语言(例如,Node.js v3、Python v1 和 PowerShell),门户提供了一个用于在 集成 选项卡中添加绑定的 UI。还可以直接在函数的 “代码 + 测试 ”选项卡中的门户中编辑文件。 对于代码优先模型(如 Node.js v4 和 Python v2),请在本地项目中的代码中配置绑定;门户反映配置,但可能不支持直接编辑。
在 .NET 和 Java 中,参数类型定义了输入数据的数据类型。 例如,使用 string 绑定到队列触发器的文本,使用字节数组以二进制形式读取,使用自定义类型反序列化为对象。 由于 .NET 类库函数和 Java 函数不依赖 function.json 进行绑定定义,因此无法在门户中创建和编辑它们。 门户中的 C# 编辑基于 C# 脚本,后者使用 function.json 而非特性。
对于动态类型的语言(如 JavaScript(使用 v3 模型)或 PowerShell,请使用 dataTypefunction.json 文件中的属性。 例如,要以二进制格式读取 HTTP 请求的内容,将 dataType 设置为 binary:
{
"dataType": "binary",
"type": "httpTrigger",
"name": "req",
"direction": "in"
}
dataType 的其他选项是 stream 和 string。
绑定方向
所有触发器和绑定在 function.json 文件中都有一个方向属性:
- 对于触发器,方向始终为
in - 输入和输出绑定使用
in和out - 某些绑定支持特殊方向
inout。 如果使用inout,则只能通过门户中的“集成”选项卡访问高级编辑器。
使用类库中的特性来配置触发器和绑定时,方向在特性构造函数中提供或推断自参数类型。
Azure Functions 触发器和绑定示例
假设你希望在收到 HTTP 请求时将消息写入 Azure 队列存储。 可以使用 HTTP 触发器和存储队列输出绑定来实现此目标。 配置方法取决于语言和编程语言模型。
下面是此方案的旧 function.json 文件(适用于 Node.js v3、Python v1 或 PowerShell)。
{
"disabled": false,
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"name": "req",
"authLevel": "function",
"methods": ["get","post"]
},
{
"type": "queue",
"direction": "out",
"name": "outqueue",
"queueName": "outqueue",
"connection": "AzureWebJobsStorage"
}
]
}
数组中的 bindings 第一个元素是 HTTP 触发器。
type 和 direction 属性标识该触发器。 该 name 属性标识接收 HTTP 请求的函数参数,并 methods 列出支持的 HTTP 谓词。
数组中的 bindings 第二个元素是存储队列输出绑定元素。
type 和 direction 属性标识该绑定。 该 name 属性指定函数如何提供新的队列消息、 queueName 标识队列,并 connection 引用保存存储连接字符串的应用设置。
注释
通过disabledfunction.json 中的属性禁用函数是一种遗留行为。 首选使用应用设置 AzureWebJobs.<FunctionName>.Disabled=true。
C#(独立工作器)示例
此示例演示一个 HTTP 触发的函数,该函数使用属性定义的输出绑定将消息写入存储队列。 有关详细信息,请参阅 C# 独立作业者指南。
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
public static class HttpToQueue
{
[Function("HttpToQueue")]
public static MultiResponse Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
{
var message = "Processed request";
return new MultiResponse
{
Messages = new[] { message },
HttpResponse = req.CreateResponse(System.Net.HttpStatusCode.OK)
};
}
}
public class MultiResponse
{
[QueueOutput("outqueue", Connection = "AzureWebJobsStorage")]
public string[] Messages { get; set; }
public HttpResponseData HttpResponse { get; set; }
}
Node.js(v4 编程模型)示例
在 v4 Node.js 编程模型中,可以在代码中使用 @azure/functions 配置输入和输出。 有关详细信息,请参阅 Node.js 开发人员指南(v4)。
import { app, output } from "@azure/functions";
const queueOutput = output.storageQueue({
queueName: "outqueue",
connection: "AzureWebJobsStorage"
});
app.http("HttpToQueue", {
methods: ["GET", "POST"],
authLevel: "function",
extraOutputs: [queueOutput],
handler: async (request, context) => {
const body = await request.text();
context.extraOutputs.set(queueOutput, body || "Processed request");
return { status: 200, body: "Queued" };
}
});
Python (v2 编程模型) 示例
在 v2 Python 编程模型中,可以使用修饰器来定义绑定。 运行时会为你生成 function.json 。 有关详细信息,请访问 Python 开发人员指南 。
import azure.functions as func
app = func.FunctionApp()
@app.route(route="HttpToQueue", auth_level=func.AuthLevel.FUNCTION)
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
def HttpToQueue(req: func.HttpRequest, msg: func.Out[str]) -> func.HttpResponse:
body = req.get_body().decode("utf-8") if req.get_body() else "Processed request"
msg.set(body)
return func.HttpResponse("Queued", status_code=200)
注释
在 Node.js v4 和 Python v2 中,运行时会从代码生成 function.json 。 避免直接在门户中编辑这些模型的 function.json 文件;请在代码中进行更改并重新发布。