创建触发器和绑定

已完成

触发器定义函数的调用方式,一个函数必须刚好有一个触发器。 触发器具有关联的数据,这些数据通常作为函数的有效负载提供。

绑定到函数是一种以声明方式将另一个资源连接到函数的方法;绑定可以作为输入绑定输出绑定或两者同时连接。 绑定中的数据作为参数提供给函数。

可根据需要,混合搭配不同的绑定。 绑定是可选项,一个函数可以有一个或多个输入和/或输出绑定。

使用触发器和绑定可以避免对其他服务进行硬编码访问。 函数接收函数参数中的数据(例如,队列消息内容)。 使用函数的返回值发送数据(例如,用于创建队列消息)。

在本地开发函数时,你需要考虑触发器和绑定行为。 对于 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 的其他选项是 streamstring

绑定方向

所有触发器和绑定在 function.json 文件中都有一个方向属性:

  • 对于触发器,方向始终为 in
  • 输入和输出绑定使用 inout
  • 某些绑定支持特殊方向 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 触发器。 typedirection 属性标识该触发器。 该 name 属性标识接收 HTTP 请求的函数参数,并 methods 列出支持的 HTTP 谓词。

数组中的 bindings 第二个元素是存储队列输出绑定元素。 typedirection 属性标识该绑定。 该 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 文件;请在代码中进行更改并重新发布。