Connector trigger for Azure Functions (Preview)

Użyj wyzwalacza Connector, aby uruchomić funkcję, gdy wystąpi zdarzenie w usłudze takiej jak Office 365, SharePoint, Dataverse, SMTP, Salesforce i wiele innych. Wyzwalacz otrzymuje zdarzenia z zarządzanego złącza w przestrzeni nazw Azure Connector. Aby poznać dostępne złącza zarządzane, zobacz odniesienie do złączy.

Aby uzyskać informacje o instalacji rozszerzenia, obsługiwanych typach wiązań, uwierzytelnianiu callback oraz konfiguracji całej aplikacji, zobacz przegląd rozszerzenia Connector.

Important

Wyzwalacz Connector jest obecnie dostępny w publicznym podglądzie. Funkcje, nazwy konfiguracji i obsługiwane złącza mogą się zmieniać przed ogólną dostępnością (GA). Korzystanie z tej funkcji podlega Dodatkowym Warunkom Użytkowania Microsoft Azure Previews.

Note

Obecnie wyzwalacz Connector nie jest obsługiwany dla tego języka.

Examples

Przykłady Office 365 Outlook i SharePoint Online wykorzystują silnie typowane payloady z Azure Connectors SDK. Dla operacji łączących, które nie mają jeszcze silnie typowanych ładunków, przypisz się do string otrzymania surowego ładunku JSON. Te przykłady celowo rejestrują jedynie podstawowe informacje o ładunku, aby skupić się na definiowaniu funkcji wyzwalanych przez Connector. Zastąp logowanie logiką przetwarzania aplikacji.

Office 365 Outlook

Poniższy przykład pojawia się, gdy nowy e-mail pojawia się w skonfigurowanej skrzynce 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);
    }
}

Typ Office365OnNewEmailTriggerPayload jest definiowany w Azure.Connectors.Sdk.Office365.Models przestrzeni nazw.

Pełny przykład kodu, w tym infrastruktura i rejestracja wyzwalaczy, znajduje się w Office 365 Outlook wyzwalaczach dla .NET.

SharePoint Online

Poniższy przykład uruchamia się, gdy plik zostanie utworzony w skonfigurowanej bibliotece dokumentów 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);
    }
}

Typ SharePointOnlineOnNewFileItemsTriggerPayload jest definiowany w Azure.Connectors.Sdk.SharePointOnline.Models przestrzeni nazw.

Pełny przykład kodu, w tym infrastruktura i rejestracja wyzwalaczy, znajduje się w artykule SharePoint Online triggers for .NET.

Złącze bez silnie typowanego ładunku

Niektóre zdarzenia łączące nie mają jeszcze silnie wpisanego ładunku .NET. Poniższy przykład uruchamia się, gdy nowa wiadomość zostaje dodana do czatu lub kanału Microsoft Teams i wiąże ładunek dostring:

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);
    }
}

Aby zidentyfikować operacje łączące, które nie mają jeszcze silnie typowanych ładunków, zobacz mapowanie sygnatur Operacje na Azure Functions.

Attributes

W izolowanej aplikacji roboczej .NET należy zastosować [ConnectorTrigger] parametr funkcji otrzymujący payload zdarzenia:

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

Atrybut nie ConnectorTrigger posiada konfigurowalnych właściwości. Konfiguruj konektor, operację, parametry operacyjne, funkcję docelową oraz uwierzytelnianie callback w konfiguracji trigger w przestrzeni nazw Azure Connector.

Examples

Rozszerzenie Node.js connector zapewnia typowane konteksty dla operacji Office 365 Outlook, SharePoint Online oraz Microsoft Teams pokazane w tej sekcji. Te przykłady celowo rejestrują jedynie podstawowe informacje o ładunku, aby skupić się na definiowaniu funkcji wyzwalanych przez Connector. Zastąp logowanie logiką przetwarzania aplikacji.

Office 365 Outlook

Poniższy przykład pojawia się, gdy nowy e-mail pojawia się w skonfigurowanej skrzynce 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).`,
        );
    },
});

Typ EmailTriggerContext ten wyświetla wiadomości jako tablicę typową emails .

Pełny przykład kodu, w tym infrastruktura i rejestracja wyzwalaczy, znajduje się w Office 365 Outlook wyzwalaczach dla TypeScript.

SharePoint Online

Poniższy przykład uruchamia się, gdy plik zostanie utworzony w skonfigurowanej bibliotece dokumentów 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).`,
        );
    },
});

Typ FileTriggerContext ten ujawnia metadane pliku jako typowaną tablicę files .

Pełny przykład kodu, w tym infrastruktura i rejestracja wyzwalaczy, znajduje się w artykule SharePoint Online triggers for TypeScript.

Microsoft Teams

Poniższy przykład pojawia się, gdy do kanału Microsoft Teams dodaje się nową wiadomość:

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).`,
        );
    },
});

Typ ChannelMessageTriggerContext ten wyświetla wiadomości jako tablicę typową messages .

Pełny przykład kodu, w tym infrastruktura i rejestracja wyzwalaczy, znajduje się w Microsoft Teams triggers for TypeScript.

Registration

Użyj funkcji generycznej connectorTrigger dla operacji, która nie ma rejestracji specyficznej dla konektora:

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));
    },
});

Rejestracja generyczna domyślnie przypisuje typ przedmiotu do .unknown Zweryfikowaj ładunek przed uzyskaniem dostępu do właściwości specyficznych dla operacji. Konfiguruj konektor, operację, parametry operacyjne, funkcję docelową oraz uwierzytelnianie callback w konfiguracji trigger w przestrzeni nazw Azure Connector.

Examples

Rozszerzenie Node.js connector dostarcza kontekstów specyficznych dla konektorów dla operacji Office 365 Outlook, SharePoint Online oraz Microsoft Teams pokazane w tej sekcji. Te przykłady celowo rejestrują jedynie podstawowe informacje o ładunku, aby skupić się na definiowaniu funkcji wyzwalanych przez Connector. Zastąp logowanie logiką przetwarzania aplikacji.

Office 365 Outlook

Poniższy przykład pojawia się, gdy nowy e-mail pojawia się w skonfigurowanej skrzynce 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).`,
        );
    },
});

Kontekst obsługi obsługiwa udostępnia wiadomości przez tablicę emails .

SharePoint Online

Poniższy przykład uruchamia się, gdy plik zostanie utworzony w skonfigurowanej bibliotece dokumentów 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).`,
        );
    },
});

Kontekst handlera udostępnia metadane pliku przez tablicę files .

Microsoft Teams

Poniższy przykład pojawia się, gdy do kanału Microsoft Teams dodaje się nową wiadomość:

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).`,
        );
    },
});

Kontekst obsługi obsługiwa udostępnia wiadomości przez tablicę messages .

Registration

Użyj funkcji generycznej connectorTrigger dla operacji, która nie ma rejestracji specyficznej dla konektora:

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

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

Ogólna rejestracja normalizuje obwiednię callback, ale nie waliduje specyficznego dla operacji kształtu ładunku. Zweryfikowaj ładunek przed uzyskaniem dostępu do właściwości specyficznych dla operacji. Konfiguruj konektor, operację, parametry operacyjne, funkcję docelową oraz uwierzytelnianie callback w konfiguracji trigger w przestrzeni nazw Azure Connector.

Examples

Przykład Office 365 Outlook wykorzystuje silnie typowany ładunek zarejestrowany przez rozszerzenie Python connector. Przykłady SharePoint Online i Microsoft Teams wiążą się z str surowym JSON, ponieważ te operacje nie mają obecnie zarejestrowanych konwerterów Python z typem. Te przykłady celowo rejestrują jedynie podstawowe informacje o ładunku, aby skupić się na definiowaniu funkcji wyzwalanych przez Connector. Zastąp logowanie logiką przetwarzania aplikacji.

Office 365 Outlook

Poniższy przykład pojawia się, gdy nowy e-mail pojawia się w skonfigurowanej skrzynce 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),
    )

Typ ClientReceiveMessage jest dostarczany przez azurefunctions-extensions-connectors i reprezentuje Office 365 Outlook wiadomości w partii.

Pełny przykład kodu, w tym infrastrukturę i rejestrację wyzwalaczy, można znaleźć w Office 365 Outlook wyzwalaczach dla Python.

SharePoint Online

Poniższy przykład uruchamia się, gdy plik zostanie utworzony w skonfigurowanej bibliotece dokumentów 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),
    )

Pełny przykładowy kod, w tym infrastrukturę i rejestrację wyzwalaczy, można znaleźć w artykule SharePoint Online triggers for Python.

Złącze bez silnie typowanego ładunku

Poniższy przykład uruchamia się, gdy nowa wiadomość zostaje dodana do kanału Microsoft Teams i wiąże ładunek do :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),
    )

Aby zidentyfikować operacje łączące, które nie mają jeszcze silnie typowanych payloadów Python, zobacz mapowanie sygnatur Operacje do Azure Functions.

Pełny przykład kodu, w tym infrastruktura i rejestracja wyzwalaczy, znajduje się w Microsoft Teams triggers for Python.

Decorators

Zastosowanie connector_trigger do funkcji, która otrzymuje ładunek zdarzenia:

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

Wartość ta arg_name identyfikuje parametr funkcji, który otrzymuje ładunek danych. Konfiguruj konektor, operację, parametry operacyjne, funkcję docelową oraz uwierzytelnianie callback w konfiguracji trigger w przestrzeni nazw Azure Connector.

Konfigurowanie wyzwalacza

Konfiguracja wyzwalacza w przestrzeni nazw Azure Connector kojarzy zewnętrzne zdarzenie usługi z callbackiem funkcji docelowej.

Wartości konfiguracji wyzwalacza

Wartość konfiguracji Description
Połączenie Autoryzowane połączenie złącza zarządzanego, takie jak Office 365 Outlook lub SharePoint Online.
Nazwa operacji Działanie wyzwalacza złącza, takie jak OnNewEmailV3 lub GetOnNewFileItems.
Parameters Wartości wymagane przez operację, takie jak folder Outlook lub strona SharePoint i biblioteka dokumentów.
Adres URL wywołania zwrotnego Rozszerzenie Connector, będące urządzeniem webhook dla funkcji docelowej. Zobacz Uwierzytelnij odwołania.
Nazwa funkcji Zarejestrowana nazwa funkcji w kodzie aplikacji.
Authentication Konfiguracja uwierzytelniania używana do wywoływania aplikacji funkcyjnej.

Wartość functionName stringu zapytania w URL-owym callback konfiguracji wyzwalającej musi odpowiadać zarejestrowanej nazwie funkcji. Poprawne nazwy funkcji zawierają od 1 do 128 liter, cyfr, podkreśleń lub łączników.

Nazwa operacji jest definiowana przez zarządzany konektor. Wybierasz nazwę funkcji w kodzie, a konfiguracja wyzwalacza przypisuje operację do tej funkcji. Przykłady w tym artykule wykorzystują następujące odwzorowania:

Zdarzenie łącznika Nazwa operacji Nazwa funkcji
Nowy Office 365 Outlook mail OnNewEmailV3 OnNewEmail
Nowy plik SharePoint Online GetOnNewFileItems OnNewFile
Nowy czat lub wiadomość kanałowa Microsoft Teams WebhookNewMessageTrigger OnNewTeamsMessage
Zdarzenie łącznika Nazwa operacji Nazwa funkcji
Nowy Office 365 Outlook mail OnNewEmailV3 OnNewEmail
Nowy plik SharePoint Online GetOnNewFileItems OnSharepointNewFile
Nowa wiadomość kanału Microsoft Teams WebhookNewMessageTrigger OnNewChannelMessage

Stwórz konfigurację wyzwalacza

Stwórz konfigurację wyzwalacza za pomocą Azure CLI lub portalu Connector Namespace.

Zanim utworzysz konfigurację wyzwalacza, stwórz autoryzowane połączenie zarządzanego łącznika w przestrzeni nazw łącznika i wdroż aplikację funkcyjną zawierającą funkcję docelową.

Poniższy przykład Bash wykorzystuje Azure CLI oraz jq do utworzenia Office 365 Outlook wyzwalacza nowej wiadomości e-mailowej. Zamień wartości zastępcze dla zasobów i połączenia:

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

Wartość ta --parameters jest specyficzna dla działania złącza. W tym przykładzie wybiera folderPath folder Outlook do monitorowania. URL callback nie zawiera klucza systemowego. Obiekt notificationDetails.authentication dodaje klucz jako sekret zapytania w ciągu zapytania, gdy Connector Namespace wywołuje tę funkcję.

Użycie

Wyzwalacz wiąże ciało żądania JSON z dowolnym typem wiązania .NET obsługiwanym przez rozszerzenie.

Operacje łączące mogą zwracać jedno zdarzenie lub partię zdarzeń. Użyj modelu ładunku specyficznego dla operacji, ponieważ jego kształt odzwierciedla kontrakt odpowiedzi dla tej operacji łączącej.

Użycie

Rejestracja generyczna otrzymuje .ConnectorTriggerContext<T> Jego własność zawiera znormalizowaną kopertę callback, payloaditems zawiera elementy zdarzenia i rawPayload zachowuje oryginalne ciało żądania. Rejestracje specyficzne dla złącza zapewniają nazwane tablice typowe, takie jak emails, files, lub messages.

Dla operacji bez rejestracji specyficznej dla konektora, typ elementu domyślnie wynosi .unknown Zweryfikuj ładunek przed uzyskaniem dostępu do właściwości specyficznych dla operacji.

Użycie

Wyzwalacz może powiązać ciało żądania z str, dict, lub bytes. Gdy azurefunctions-extensions-connectors rejestruje konwerter dla adnotacji SDK funkcji, pracownik zamiast tego deserializuje ciało żądania do obsługiwanego typu specyficznego dla operacji.

Operacje łączące mogą zwracać jedno zdarzenie lub partię zdarzeń. Użyj typowej lub kolekcjowej adnotacji zidentyfikowanej dla operacji w mapowaniu sygnatury operacji.

Rozszerzenie akceptuje HTTP POST i PUT żądania o tym typie application/json treści. Niepuste ciało żądania musi zawierać prawidłowy JSON. Rozszerzenie odrzuca ciała żądań większe niż 10 MB.

Metadata

Obecnie wyzwalacz Connector nie ujawnia nagłówków callback ani innych metadanych żądań jako dane wiążące. Rozszerzenie definiuje pusty kontrakt danych wiązania, dzięki czemu funkcja otrzymuje tylko ciało żądania JSON w typie wiązania wspieranym przez wybrany język.

Następne kroki