Connector trigger for Azure Functions (Preview)

Use o gatilho Connector para executar uma função quando ocorre um evento em um serviço como Office 365, SharePoint, Dataverse, SMTP, Salesforce e muitos outros. O gatilho recebe eventos de um conector gerenciado no Azure Connector Namespace. Para explorar os conectores gerenciados disponíveis, veja a referência de conectores.

Para informações sobre a instalação da extensão, tipos de binding suportados, autenticação de callback e configuração em toda a app, veja a visão geral da extensão Connector.

Importante

O gatilho do Conector está atualmente em pré-visualização pública. Recursos, nomes de configuração e conectores suportados podem mudar antes da disponibilidade geral (GA). O uso desse recurso está sujeito aos Termos Suplementares de Uso para Prévias do Microsoft Azure.

Note

O gatilho Connector atualmente não é suportado para essa linguagem.

Examples

Os exemplos Office 365 Outlook e SharePoint Online usam cargas úteis fortemente tipadas do SDK Azure Connectors. Para operações de conector que ainda não possuem payloads fortemente tipados, vincule para string receber a carga útil JSON bruta. Esses exemplos registram intencionalmente apenas informações básicas de carga útil para manter o foco em como definir funções acionadas pelo Connector. Substitua o registro pela lógica de processamento da sua aplicação.

Office 365 Outlook

O exemplo a seguir é executado quando um novo e-mail chega na caixa de correio Office 365 Outlook configurada:

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

O Office365OnNewEmailTriggerPayload tipo é definido no Azure.Connectors.Sdk.Office365.Models namespace.

Para o exemplo completo de código, incluindo infraestrutura e registro de gatilhos, veja Office 365 Outlook gatilhos para .NET.

SharePoint Online

O exemplo a seguir é executado quando um arquivo é criado na biblioteca de documentos SharePoint Online configurada:

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

O SharePointOnlineOnNewFileItemsTriggerPayload tipo é definido no Azure.Connectors.Sdk.SharePointOnline.Models namespace.

Para o exemplo completo de código, incluindo infraestrutura e registro de gatilhos, veja SharePoint Online gatilhos para .NET.

Conector sem uma carga útil fortemente tipada

Alguns eventos de conector ainda não possuem uma carga útil .NET fortemente tipada. O exemplo a seguir é executado quando uma nova mensagem é adicionada a um chat ou canal do Microsoft Teams e vincula a carga útil astring:

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

Para identificar operações de conectores que ainda não possuem payloads fortemente tipados, veja Operations to Azure Functions signature mapeping.

Attributes

Em um aplicativo worker isolado .NET, aplique [ConnectorTrigger] ao parâmetro de função que recebe a carga útil do evento:

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

O ConnectorTrigger atributo não possui propriedades configuráveis. Configure o conector, operação, parâmetros operacionais, função de destino e autenticação de retorno de chamada na configuração do gatilho no Azure Connector Namespace.

Examples

A extensão do conector Node.js fornece contextos tipados para as operações Office 365 Outlook, SharePoint Online e Microsoft Teams mostradas nesta seção. Esses exemplos registram intencionalmente apenas informações básicas de carga útil para manter o foco em como definir funções acionadas pelo Connector. Substitua o registro pela lógica de processamento da sua aplicação.

Office 365 Outlook

O exemplo a seguir é executado quando um novo e-mail chega na caixa de correio Office 365 Outlook configurada:

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

O EmailTriggerContext tipo expõe as mensagens como um array tipado emails .

Para o exemplo completo de código, incluindo infraestrutura e registro de gatilhos, veja Office 365 Outlook gatilhos para o TypeScript.

SharePoint Online

O exemplo a seguir é executado quando um arquivo é criado na biblioteca de documentos SharePoint Online configurada:

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

O FileTriggerContext tipo expõe os metadados do arquivo como um array tipado files .

Para o exemplo completo de código, incluindo infraestrutura e registro de gatilhos, veja SharePoint Online triggers para TypeScript.

Equipes da Microsoft

O exemplo a seguir ocorre quando uma nova mensagem é adicionada a um canal do 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).`,
        );
    },
});

O ChannelMessageTriggerContext tipo expõe as mensagens como um array tipado messages .

Para o exemplo completo de código, incluindo infraestrutura e registro de gatilhos, veja Microsoft Teams triggers para TypeScript.

Registration

Use a função genérica connectorTrigger para uma operação que não tenha um registro específico do conector:

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

O registro genérico define o tipo de item como unknownpadrão. Valide a carga útil antes de acessar propriedades específicas da operação. Configure o conector, operação, parâmetros operacionais, função de destino e autenticação de retorno de chamada na configuração do gatilho no Azure Connector Namespace.

Examples

A extensão do conector Node.js fornece contextos específicos do conector para as operações Office 365 Outlook, SharePoint Online e Microsoft Teams mostradas nesta seção. Esses exemplos registram intencionalmente apenas informações básicas de carga útil para manter o foco em como definir funções acionadas pelo Connector. Substitua o registro pela lógica de processamento da sua aplicação.

Office 365 Outlook

O exemplo a seguir é executado quando um novo e-mail chega na caixa de correio Office 365 Outlook configurada:

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

O contexto do handler expõe as mensagens através do emails array.

SharePoint Online

O exemplo a seguir é executado quando um arquivo é criado na biblioteca de documentos SharePoint Online configurada:

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

O contexto do handler expõe os metadados do arquivo através do files array.

Equipes da Microsoft

O exemplo a seguir ocorre quando uma nova mensagem é adicionada a um canal do 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).`,
        );
    },
});

O contexto do handler expõe as mensagens através do messages array.

Registration

Use a função genérica connectorTrigger para uma operação que não tenha um registro específico do conector:

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

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

O registro genérico normaliza o envelope de retorno, mas não valida a forma específica da carga útil da operação. Valide a carga útil antes de acessar propriedades específicas da operação. Configure o conector, operação, parâmetros operacionais, função de destino e autenticação de retorno de chamada na configuração do gatilho no Azure Connector Namespace.

Examples

O exemplo Office 365 Outlook usa uma carga útil fortemente tipada registrada pela extensão do conector Python. Os exemplos do SharePoint Online e do Microsoft Teams se vinculam e str analisam o JSON bruto porque essas operações atualmente não possuem conversores Python digitados registrados. Esses exemplos registram intencionalmente apenas informações básicas de carga útil para manter o foco em como definir funções acionadas pelo Connector. Substitua o registro pela lógica de processamento da sua aplicação.

Office 365 Outlook

O exemplo a seguir é executado quando um novo e-mail chega na caixa de correio Office 365 Outlook configurada:

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

O ClientReceiveMessage tipo é fornecido por azurefunctions-extensions-connectors e representa as Office 365 Outlook mensagens do lote.

Para o exemplo completo de código, incluindo infraestrutura e registro de gatilhos, veja Office 365 Outlook gatilhos para Python.

SharePoint Online

O exemplo a seguir é executado quando um arquivo é criado na biblioteca de documentos SharePoint Online configurada:

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

Para o exemplo completo de código, incluindo infraestrutura e registro de gatilhos, veja SharePoint Online gatilhos para Python.

Conector sem uma carga útil fortemente tipada

O exemplo a seguir é executado quando uma nova mensagem é adicionada a um canal do Microsoft Teams e vincula a carga útil astr:

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

Para identificar operações de conector que ainda não possuem payloads Python fortemente digitados, veja Operations to Azure Functions signature mapeping.

Para o exemplo completo de código, incluindo infraestrutura e registro de gatilhos, veja Microsoft Teams triggers para Python.

Decoradores

Aplique connector_trigger à função que recebe a carga útil do evento:

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

O arg_name valor identifica o parâmetro da função que recebe a carga útil. Configure o conector, operação, parâmetros operacionais, função de destino e autenticação de retorno de chamada na configuração do gatilho no Azure Connector Namespace.

Configurar o gatilho

Uma configuração de gatilho no Azure Connector Namespace associa um evento de serviço externo ao callback da função de destino.

Valores de configuração de gatilho

Valor de configuração Description
Conexão A conexão gerenciada autorizada, como Office 365 Outlook ou SharePoint Online.
Nome da operação A operação de gatilho do conector, como OnNewEmailV3 ou GetOnNewFileItems.
Parameters Valores exigidos pela operação, como uma pasta do Outlook ou um site SharePoint e biblioteca de documentos.
URL de Callback O endpoint webhook da extensão Connector para a função de destino. Veja Autenticar callbacks.
Nome da função O nome da função registrada no código do seu app.
Authentication A configuração de autenticação usada para chamar o aplicativo de funções.

O functionName valor da string de consulta na URL de callback da configuração do gatilho deve corresponder ao nome da função registrada. Nomes válidos de funções contêm de 1 a 128 letras, números, sublinhados ou hífens.

O nome da operação é definido pelo conector gerenciado. Você escolhe o nome da função no seu código, e a configuração do gatilho mapeia a operação para essa função. Os exemplos neste artigo usam estes mapeamentos:

Evento de conector Nome da operação Nome da função
Novo e-mail Office 365 Outlook OnNewEmailV3 OnNewEmail
Novo arquivo SharePoint Online GetOnNewFileItems OnNewFile
Nova mensagem de chat ou canal do Microsoft Teams WebhookNewMessageTrigger OnNewTeamsMessage
Evento de conector Nome da operação Nome da função
Novo e-mail Office 365 Outlook OnNewEmailV3 OnNewEmail
Novo arquivo SharePoint Online GetOnNewFileItems OnSharepointNewFile
Nova mensagem do canal do Microsoft Teams WebhookNewMessageTrigger OnNewChannelMessage

Criar uma configuração de gatilho

Crie uma configuração de gatilho usando o CLI do Azure ou o portal Connector Namespace.

Antes de criar a configuração do gatilho, crie uma conexão gerenciada autorizada no namespace do seu conector e implante o aplicativo de função que contém a função de destino.

O exemplo a seguir no Bash usa CLI do Azure e jq para criar um gatilho Office 365 Outlook novo e-mail. Substitua os valores provisórios para seus recursos e conexão:

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

O --parameters valor é específico para a operação do conector. Neste exemplo, folderPath seleciona a pasta Outlook para monitorar. A URL de retorno não contém a chave do sistema. O notificationDetails.authentication objeto adiciona a chave como um segredo de query string quando o Espaço de Nomes do Conector invoca a função.

Usage

O gatilho vincula o corpo da requisição JSON a qualquer um dos tipos de binding .NET suportados pela extensão.

Operações de conectores podem retornar um evento ou um lote de eventos. Use o modelo de carga útil específica da operação porque sua forma representa o contrato de resposta para aquela operação do conector.

Usage

O registro genérico recebe um ConnectorTriggerContext<T>. Sua payload propriedade contém o envelope de callback normalizado, items contém os itens do evento e rawPayload preserva o corpo original da solicitação. Registros específicos de conectores fornecem arrays tipados nomeados, como emails, files, ou messages.

Para uma operação sem registro específico do conector, o tipo de item é padrão para unknown. Valide a carga útil antes de acessar propriedades específicas da operação.

Usage

O gatilho pode vincular o corpo do pedido a str, dict, ou bytes. Quando azurefunctions-extensions-connectors registra um conversor para a anotação do SDK da função, o trabalhador desserializa o corpo da solicitação no tipo específico de operação suportado.

Operações de conectores podem retornar um evento ou um lote de eventos. Use o tipo ou anotação de coleção identificada para a operação no mapeamento de assinatura da operação.

A extensão aceita HTTP POST e PUT solicitações com o tipo de application/json conteúdo. Um corpo de requisição não vazio deve conter JSON válido. A extensão rejeita corpos de solicitação maiores que 10 MB.

Metadata

O gatilho Connector atualmente não expõe cabeçalhos de callback ou outros metadados de requisições como dados de vinculação. A extensão define um contrato de dados de vinculação vazio, então a função recebe apenas o corpo da solicitação JSON em um tipo de vinculação suportado pela linguagem selecionada.

Próximas Etapas