Connector trigger for Azure Functions (Preview)

當 Office 365、SharePoint、Dataverse、SMTP、Salesforce 等服務發生事件時,請使用 Connector 觸發器執行函式。 觸發器會從 Azure 連接器命名空間中的受管理連接器接收事件。 欲探索可用的管理連接器,請參閱 連接器參考資料。

關於安裝擴充功能、支援的綁定類型、回調驗證及應用程式整體設定,請參閱 Connector 擴充功能概覽。

Important

Connector 觸發器目前處於公開預覽階段。 功能、設定名稱及支援的連接器在正式開放(GA)前可能會變更。 使用此功能須遵守 Microsoft Azure 預覽版補充使用條款。

Note

Connector 觸發器目前尚未支援此語言。

Examples

Office 365 Outlook 與 SharePoint Online 範例使用來自 Azure Connectors SDK 的強型別有效載荷。 對於尚未有強型別有效載荷的連接器操作,請綁定 以 string 接收原始 JSON 有效載荷。 這些範例刻意只記錄基本的有效載荷資訊,以專注於如何定義連接器觸發函式。 用你應用程式的處理邏輯取代日誌。

Office 365 Outlook

以下範例在新郵件抵達已設定的Office 365 Outlook信箱時執行:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Connector;
using Microsoft.Extensions.Logging;
using Azure.Connectors.Sdk.Office365.Models;

namespace Office365App;

public class O365Functions
{
    private readonly ILogger<O365Functions> _logger;

    public O365Functions(ILogger<O365Functions> logger)
    {
        _logger = logger;
    }

    [Function("OnNewEmail")]
    public void OnNewEmail(
        [ConnectorTrigger] Office365OnNewEmailTriggerPayload payload)
    {
        var messageCount = payload.Body?.Value?.Count ?? 0;
        _logger.LogInformation(
            "Received {MessageCount} new email message(s).",
            messageCount);
    }
}

該 Office365OnNewEmailTriggerPayload 型別定義於 Azure.Connectors.Sdk.Office365.Models 命名空間中。

完整程式碼範例,包括基礎設施與觸發器註冊,請參見.NET Office 365 Outlook觸發器。

SharePoint 在線

以下範例在已設定的 SharePoint Online 文件庫中建立檔案時執行:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Connector;
using Microsoft.Extensions.Logging;
using Azure.Connectors.Sdk.SharePointOnline.Models;

namespace SharePointApp;

public class SharePointFunctions
{
    private readonly ILogger<SharePointFunctions> _logger;

    public SharePointFunctions(ILogger<SharePointFunctions> logger)
    {
        _logger = logger;
    }

    [Function("OnNewFile")]
    public void OnNewFile(
        [ConnectorTrigger] SharePointOnlineOnNewFileItemsTriggerPayload payload)
    {
        var fileCount = payload.Body?.Value?.Count ?? 0;
        _logger.LogInformation(
            "Received {FileCount} new SharePoint file(s).",
            fileCount);
    }
}

該 SharePointOnlineOnNewFileItemsTriggerPayload 型別定義於 Azure.Connectors.Sdk.SharePointOnline.Models 命名空間中。

完整程式碼範例,包括基礎設施與觸發器註冊,請參閱 SharePoint Online 對 .NET 的觸發器。

無強型別有效載荷的連接器

有些連接器事件尚未有強型別的 .NET 有效載荷。 以下範例當新增訊息加入 Microsoft Teams 聊天或頻道並綁定該載荷時string執行:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Connector;
using Microsoft.Extensions.Logging;

namespace TeamsApp;

public class TeamsFunctions
{
    private readonly ILogger<TeamsFunctions> _logger;

    public TeamsFunctions(ILogger<TeamsFunctions> logger)
    {
        _logger = logger;
    }

    [Function("OnNewTeamsMessage")]
    public void OnNewTeamsMessage([ConnectorTrigger] string payload)
    {
        _logger.LogInformation("Received a new Teams message: {Payload}", payload);
    }
}

要辨識尚未有強型別有效載荷的連接器操作,請參見 Operations to Azure Functions signature mapping。

Attributes

在 .NET 孤立的工作者應用程式中,對接收事件有效載荷的函式參數進行套用[ConnectorTrigger]:

[Function("OnConnectorEvent")]
public void Run([ConnectorTrigger] string payload)
{
    // Process the raw JSON payload.
}

該 ConnectorTrigger 屬性沒有可設定的屬性。 在 Azure 連接器命名空間的觸發設定中,設定連接器、操作、操作參數、目的函式及回調認證。

Examples

Node.js 連接器擴充功能為本節所示的 Office 365 Outlook、SharePoint Online 及 Microsoft Teams 操作提供類型上下文。 這些範例刻意只記錄基本的有效載荷資訊,以專注於如何定義連接器觸發函式。 用你應用程式的處理邏輯取代日誌。

Office 365 Outlook

以下範例在新郵件抵達已設定的Office 365 Outlook信箱時執行:

import { InvocationContext } from '@azure/functions';
import {
    connectors,
    EmailTriggerContext,
} from '@azure/functions-extensions-connectors';

connectors.office365.onNewEmail('OnNewEmail', {
    handler: async (
        context: EmailTriggerContext,
        invocationContext: InvocationContext,
    ) => {
        invocationContext.log(
            `Received ${context.emails.length} new email message(s).`,
        );
    },
});

該 EmailTriggerContext 型別會將訊息暴露為型別陣 emails 列。

完整程式碼範例,包括基礎設施與觸發器註冊,請參見 TypeScript 的Office 365 Outlook觸發器。

SharePoint 在線

以下範例在已設定的 SharePoint Online 文件庫中建立檔案時執行:

import { InvocationContext } from '@azure/functions';
import {
    connectors,
    FileTriggerContext,
} from '@azure/functions-extensions-connectors';

connectors.sharepoint.onNewFile('OnSharepointNewFile', {
    handler: async (
        context: FileTriggerContext,
        invocationContext: InvocationContext,
    ) => {
        invocationContext.log(
            `Received ${context.files.length} new SharePoint file(s).`,
        );
    },
});

該 FileTriggerContext 型別會以型 files 別陣列的形式暴露檔案元資料。

完整程式碼範例,包括基礎設施與觸發器註冊,請參閱 TypeScript 的 SharePoint Online 觸發器。

Microsoft 團隊

以下範例在新增訊息至 Microsoft Teams 頻道時執行:

import { InvocationContext } from '@azure/functions';
import {
    ChannelMessageTriggerContext,
    connectors,
} from '@azure/functions-extensions-connectors';

connectors.teams.onNewChannelMessage('OnNewChannelMessage', {
    handler: async (
        context: ChannelMessageTriggerContext,
        invocationContext: InvocationContext,
    ) => {
        invocationContext.log(
            `Received ${context.messages.length} new Teams message(s).`,
        );
    },
});

該 ChannelMessageTriggerContext 型別會將訊息暴露為型別陣 messages 列。

完整程式碼範例,包括基礎架構與觸發器註冊,請參閱 Microsoft Teams 的 TypeScript 觸發器。

Registration

對於沒有連接器特定配準的操作,使用通用 connectorTrigger 函數:

import { InvocationContext } from '@azure/functions';
import {
    connectorTrigger,
    ConnectorTriggerContext,
} from '@azure/functions-extensions-connectors';

connectorTrigger('OnConnectorEvent', {
    handler: async (
        context: ConnectorTriggerContext,
        invocationContext: InvocationContext,
    ) => {
        invocationContext.log(JSON.stringify(context.rawPayload));
    },
});

通用註冊預設項目類型為 unknown。 在存取操作專屬屬性前,先驗證有效載荷。 在 Azure 連接器命名空間的觸發設定中,設定連接器、操作、操作參數、目的函式及回調認證。

Examples

Node.js 連接器擴充功能提供本節所示Office 365 Outlook、SharePoint線上及Microsoft Teams操作的連接器專屬上下文。 這些範例刻意只記錄基本的有效載荷資訊,以專注於如何定義連接器觸發函式。 用你應用程式的處理邏輯取代日誌。

Office 365 Outlook

以下範例在新郵件抵達已設定的Office 365 Outlook信箱時執行:

const {
    connectors,
} = require('@azure/functions-extensions-connectors');

connectors.office365.onNewEmail('OnNewEmail', {
    handler: async (context, invocationContext) => {
        invocationContext.log(
            `Received ${context.emails.length} new email message(s).`,
        );
    },
});

處理器上下文透過陣列暴露訊息 emails 。

SharePoint 在線

以下範例在已設定的 SharePoint Online 文件庫中建立檔案時執行:

const {
    connectors,
} = require('@azure/functions-extensions-connectors');

connectors.sharepoint.onNewFile('OnSharepointNewFile', {
    handler: async (context, invocationContext) => {
        invocationContext.log(
            `Received ${context.files.length} new SharePoint file(s).`,
        );
    },
});

處理器上下文透過陣列暴露檔案元資料 files 。

Microsoft 團隊

以下範例在新增訊息至 Microsoft Teams 頻道時執行:

const {
    connectors,
} = require('@azure/functions-extensions-connectors');

connectors.teams.onNewChannelMessage('OnNewChannelMessage', {
    handler: async (context, invocationContext) => {
        invocationContext.log(
            `Received ${context.messages.length} new Teams message(s).`,
        );
    },
});

處理器上下文透過陣列暴露訊息 messages 。

Registration

對於沒有連接器特定配準的操作,使用通用 connectorTrigger 函數:

const {
    connectorTrigger,
} = require('@azure/functions-extensions-connectors');

connectorTrigger('OnConnectorEvent', {
    handler: async (context, invocationContext) => {
        invocationContext.log(JSON.stringify(context.rawPayload));
    },
});

通用註冊會正規化回調包絡,但不會驗證操作特定的有效載荷形狀。 在存取操作專屬屬性前,先驗證有效載荷。 在 Azure 連接器命名空間的觸發設定中,設定連接器、操作、操作參數、目的函式及回調認證。

Examples

Office 365 Outlook範例使用強型別有效載荷,並由 Python 連接器延伸線所標記。 SharePoint Online 和 Microsoft Teams 的範例會綁定str並解析原始 JSON,因為這些操作目前沒有註冊型別的 Python 轉換器。 這些範例刻意只記錄基本的有效載荷資訊,以專注於如何定義連接器觸發函式。 用你應用程式的處理邏輯取代日誌。

Office 365 Outlook

以下範例在新郵件抵達已設定的Office 365 Outlook信箱時執行:

import logging
from typing import List

import azure.functions as func
import azurefunctions.extensions.connectors.office365 as office365

app = func.FunctionApp()


@app.function_name(name="OnNewEmail")
@app.connector_trigger(arg_name="emails")
def on_new_email(
    emails: List[office365.ClientReceiveMessage],
) -> None:
    logging.info(
        "Received %s new email message(s).",
        len(emails),
    )

該ClientReceiveMessage型別由 提供azurefunctions-extensions-connectors,並代表批次中的Office 365 Outlook訊息。

完整程式碼範例,包括基礎設施與觸發器註冊,請參見Office 365 Outlook Python 觸發器。

SharePoint 在線

以下範例在已設定的 SharePoint Online 文件庫中建立檔案時執行:

import json
import logging

import azure.functions as func

app = func.FunctionApp()


@app.function_name(name="OnSharepointNewFile")
@app.connector_trigger(arg_name="payload")
def on_sharepoint_new_file(payload: str) -> None:
    data = json.loads(payload)
    files = data.get("body", {}).get("value", [])
    logging.info(
        "Received %s new SharePoint file(s).",
        len(files),
    )

完整程式碼範例,包括基礎架構與觸發器註冊,請參閱 SharePoint Online 的 Python 觸發器。

無強型別有效載荷的連接器

以下範例在新增訊息至 Microsoft Teams 通道並綁定有效載荷str時執行:

import json
import logging

import azure.functions as func

app = func.FunctionApp()


@app.function_name(name="OnNewChannelMessage")
@app.connector_trigger(arg_name="payload")
def on_new_channel_message(payload: str) -> None:
    data = json.loads(payload)
    messages = data.get("body", {}).get("value", [])
    logging.info(
        "Received %s new Teams message(s).",
        len(messages),
    )

要辨識尚未有強型別 Python payloads 的連接器操作,請參見 Operations to Azure Functions signature mapping。

完整程式碼範例,包括基礎設施與觸發器註冊,請參閱 Microsoft Teams 的 Python 觸發器。

Decorators

對接收事件有效載荷的函式進行應用 connector_trigger :

import azure.functions as func

app = func.FunctionApp()


@app.function_name(name="OnConnectorEvent")
@app.connector_trigger(arg_name="payload")
def on_connector_event(payload: str) -> None:
    # Process the raw JSON payload.
    pass

該 arg_name 值識別接收有效載荷的函數參數。 在 Azure 連接器命名空間的觸發設定中,設定連接器、操作、操作參數、目的函式及回調認證。

設定觸發程序

Azure Connector 命名空間中的觸發設定會將外部服務事件與目的地函式回撥關聯起來。

觸發設定值

設定值 Description
連線 授權的管理連接器連接,例如 Office 365 Outlook 或 SharePoint Online。
作業名稱 連接器觸發操作,例如 OnNewEmailV3 或 GetOnNewFileItems。
Parameters 操作所需的數值,例如 Outlook 資料夾或 SharePoint 網站與文件庫。
回呼 URL Connector 擴充 webhook 端點用於目的地函式。 請參見認證回撥。
函式名稱 你應用程式代碼中註冊的功能名稱。
Authentication 用來呼叫函式應用程式的驗證設定。

functionName觸發設定回調 URL 中的查詢字串值必須與註冊函式名稱相符。 有效的函式名稱包含 1 到 128 個字母、數字、底線或連字號。

操作名稱由管理連接器定義。 你在程式碼中選擇函式名稱,觸發設定會將操作映射到該函式。 本文範例使用以下映射:

連接器事件 作業名稱 函式名稱
新Office 365 Outlook電子郵件 OnNewEmailV3 OnNewEmail
新的 SharePoint Online 檔案 GetOnNewFileItems OnNewFile
新的 Microsoft Teams 聊天或頻道訊息 WebhookNewMessageTrigger OnNewTeamsMessage
連接器事件 作業名稱 函式名稱
新Office 365 Outlook電子郵件 OnNewEmailV3 OnNewEmail
新的 SharePoint Online 檔案 GetOnNewFileItems OnSharepointNewFile
新的 Microsoft Teams 頻道訊息 WebhookNewMessageTrigger OnNewChannelMessage

建立觸發設定

請使用 Azure CLI 或 Connector Namespace 入口建立觸發設定。

在建立觸發器設定前,先在你的連接器命名空間建立一個授權的受管理連接器連線,並部署包含目標函式的函式應用程式。

以下 Bash 範例使用 Azure CLI 和 jq 來建立Office 365 Outlook的新郵件觸發器。 替換資源和連線的佔位值:

resourceGroup="<RESOURCE_GROUP>"
namespaceName="<CONNECTOR_NAMESPACE>"
functionAppName="<FUNCTION_APP>"
functionName="OnNewEmail"
triggerName="<TRIGGER_NAME>"
connectionName="<CONNECTION_NAME>"
connectorName="office365"
operationName="OnNewEmailV3"
subscriptionId=$(az account show --query id --output tsv)

connectorKey=$(az functionapp keys list \
    --resource-group "$resourceGroup" \
    --name "$functionAppName" \
    --query "systemKeys.connector_extension" \
    --output tsv)

callbackUrl="https://${functionAppName}.azurewebsites.net/runtime/webhooks/connector?functionName=${functionName}"

notificationFile=$(mktemp)
trap 'rm -f "$notificationFile"' EXIT

jq -n \
    --arg callbackUrl "$callbackUrl" \
    --arg connectorKey "$connectorKey" \
    '{
        callbackUrl: $callbackUrl,
        authentication: {
            type: "QueryString",
            name: "code",
            value: $connectorKey
        }
    }' > "$notificationFile"

az connector-namespace trigger create \
    --resource-group "$resourceGroup" \
    --namespace "$namespaceName" \
    --name "$triggerName" \
    --connection-details "{connectionName:${connectionName},connectorName:${connectorName}}" \
    --operation-name "$operationName" \
    --parameters "[{name:folderPath,value:'Inbox'}]" \
    --notification-details "@$notificationFile" \
    --description "${connectorName} ${operationName} -> ${functionName}" \
    --metadata "{destinationType:functionApp,functionAppName:${functionAppName},functionAppResourceGroup:${resourceGroup},functionAppSubscriptionId:${subscriptionId},functionName:${functionName},recurrenceFrequency:Minute,recurrenceInterval:'5'}"

rm -f "$notificationFile"
trap - EXIT

該 --parameters 值是針對連接器操作而定的。 在這個例子中,folderPath選擇要監控的 Outlook 資料夾。 回調網址不包含系統金鑰。 當 Connector 命名空間呼叫函式時,物件 notificationDetails.authentication 會將該金鑰加入查詢字串祕密。

用法

觸發器會將 JSON 請求實體綁定到擴充套件支援的任何 .NET 綁定類型。

連接器操作可以回傳一個事件或一組事件。 使用操作專用有效載荷模型,因為其形狀代表該連接器操作的回應合約。

用法

通用註冊會獲得一個 ConnectorTriggerContext<T>。 其 payload 屬性包含正規化回調包絡、 items 事件項目,並 rawPayload 保留原始請求主體。 連接器專用的配準提供命名型別陣列,例如 emails、 files或 messages。

對於沒有連接器特定配值的操作,項目類型預設為 unknown。 在存取操作特定屬性前,先驗證有效載荷。

用法

觸發器可以將請求實體綁定於 str、 dict或 bytes。 當 azurefunctions-extensions-connectors 註冊函式的 SDK 註解轉換器時,工作者會將請求實體反序列化為支援的操作特定類型。

連接器操作可以回傳一個事件或一組事件。 在 操作簽名映射中,使用該操作所識別的類型或集合註解。

擴充功能接受 HTTP POST 及 PUT 內容 application/json 類型的請求。 非空請求主體必須包含有效的 JSON。 擴充功能會拒絕超過 10 MB 的請求實體。

後設資料

Connector 觸發器目前不會將回調標頭或其他請求元資料作為綁定資料暴露。 該擴充定義了一個 空的綁定資料合約,因此函式只會接收所選語言支援的綁定型態中的 JSON 請求主體。

下一步