Chiamate audio/video da un'app personalizzata a una riunione di Teams
Livello: intermedio
In questa esercitazione si apprenderà come usare Servizi di comunicazione di Azure in un'applicazione React personalizzata per consentire a un utente di effettuare una chiamata audio/video in una riunione di Microsoft Teams. Verranno fornite informazioni sui diversi blocchi predefiniti che possono essere usati per rendere possibile questo scenario ed essere forniti passaggi pratici per illustrare i diversi servizi Cloud Microsoft coinvolti.
Cosa si creerà in questa esercitazione
Panoramica della soluzione dell'applicazione
Prerequisiti
- Node LTS - Node LTS viene usato per questo progetto
- git
- Visual Studio Code o un altro IDE preferito.
- estensione Funzioni di Azure per VS Code
- Azure Functions Core Tools
- Sottoscrizione di Azure
- Tenant per sviluppatori di Microsoft 365
- Account GitHub
- Visual Studio se si usa la versione C# dell'esercitazione. Visual Studio Code può essere usato anche se preferito.
Le tecnologie usate in questa esercitazione includono
- React
- Servizi di comunicazione di Azure
- Funzioni di Azure
- Microsoft Graph
- Microsoft Teams
Creare una risorsa Servizi di comunicazione di Azure
In questo esercizio si creerà una risorsa Servizi di comunicazione di Azure (ACS) nella portale di Azure.
Per iniziare, eseguire le attività seguenti:
Visitare il portale di Azure nel browser e accedere.
Digitare servizi di comunicazione nella barra di ricerca nella parte superiore della pagina e selezionare Servizi di comunicazione dalle opzioni visualizzate.
Selezionare Crea sulla barra degli strumenti.
Eseguire le attività seguenti:
- Seleziona la tua sottoscrizione di Azure.
- Selezionare il gruppo di risorse da usare (crearne uno nuovo se non esiste).
- Immettere un nome di risorsa ACS. Deve essere un valore univoco.
- Selezionare un percorso dati.
Selezionare Rivedi e crea seguito da Crea.
Dopo aver creato la risorsa ACS, passarvi e selezionare Impostazioni -> Identità e token di accesso utente.
Selezionare la casella di controllo VoIP (Voice and video calling).
Selezionare Genera.
Copiare i valori del token Identity e User Access in un file locale. I valori saranno necessari più avanti in questo esercizio.
Selezionare Impostazioni -> Chiavi e copiare il valore chiave primaria stringa di connessione nel file locale in cui sono stati copiati i valori di identità utente e token.
Per eseguire l'applicazione è necessario un collegamento alla riunione di Teams. Passare a Microsoft Teams, accedere con il tenant per sviluppatori di Microsoft 365 e selezionare l'opzione Calendario a sinistra.
Suggerimento
Se attualmente non si ha un account Microsoft 365, è possibile iscriversi per l'abbonamento a Microsoft 365 Developer Program . È gratuito per 90 giorni e si rinnova continuamente purché venga usato per l'attività di sviluppo. Se si ha una sottoscrizione di Visual Studio Enterprise o Professional, entrambi i programmi includono una sottoscrizione per sviluppatori Microsoft 365 gratuita, attiva per la vita della sottoscrizione di Visual Studio.
Selezionare una data/ora nel calendario, aggiungere un titolo per la riunione, invitare un utente dal tenant per sviluppatori di Microsoft 365 e selezionare Salva.
Selezionare la nuova riunione aggiunta nel calendario e copiare il collegamento alla riunione di Teams visualizzato nello stesso file in cui è stata archiviata l'identità utente, il token e stringa di connessione ACS.
Ora che la risorsa ACS è configurata e si dispone di un collegamento di partecipazione alle riunioni di Teams, è possibile ottenere l'applicazione React in esecuzione.
Integrare Servizi di comunicazione di Azure Chiamata in un'app React
In questo esercizio si aggiungerà la chiamata all'interfaccia utente ACS composita in un'app React per abilitare l'esecuzione di chiamate audio/video da un'app personalizzata in una riunione di Microsoft Teams.
Visitare GitHub e accedere. Se non si ha già un account GitHub, è possibile selezionare l'opzione Iscrizione per crearne una.
Visitare il repository GitHub di Microsoft Cloud.
Selezionare l'opzione Fork per aggiungere il repository all'organizzazione o all'account GitHub desiderato.
Eseguire il comando seguente per clonare questo repository nel computer. Sostituire <YOUR_ORG_NAME> con il nome dell'organizzazione o dell'account GitHub.
git clone https://github.com/<YOUR_ORG_NAME>/MicrosoftCloud
Aprire la cartella del progetto samples/acs-to-teams-meeting in Visual Studio Code.
Espandere la cartella client/react .
Aprire il file package.json in VS Code e notare che sono inclusi i pacchetti ACS seguenti:
@azure/communication-common @azure/communication-react
Verificare di avere installato npm 10 o versione successiva aprendo una finestra del terminale ed eseguendo il comando seguente:
npm --version
Suggerimento
Se non è installato npm 10 o versione successiva, è possibile aggiornare npm alla versione più recente eseguendo
npm install -g npm
.Aprire una finestra del terminale ed eseguire il
npm install
comando nella cartella react per installare le dipendenze dell'applicazione.Aprire App.tsx e esaminare le importazioni all'inizio del file. Questi gestiscono l'importazione di simboli di sicurezza e audio/videochiamata ACS che verranno usati nell'app.
import { AzureCommunicationTokenCredential, CommunicationUserIdentifier } from '@azure/communication-common'; import { CallComposite, fromFlatCommunicationIdentifier, useAzureCommunicationCallAdapter } from '@azure/communication-react'; import React, { useState, useMemo, useEffect } from 'react'; import './App.css';
Nota
Si noterà come il
CallComposite
componente viene usato più avanti in questo esercizio. Fornisce la funzionalità principale dell'interfaccia utente per Servizi di comunicazione di Azure per abilitare l'esecuzione di una chiamata audio/video dall'app in una riunione di Microsoft Teams.Individuare il
App
componente ed eseguire le attività seguenti:- Esaminare le
useState
definizioni nel componente. - Sostituire le
userId
useState
virgolette vuote della funzione con il valore di identità utente ACS copiato nell'esercizio precedente. - Sostituire le
token
useState
virgolette vuote della funzione con il valore del token ACS copiato nell'esercizio precedente. - Sostituire le
teamsMeetingLink
useState
virgolette vuote della funzione con il valore del collegamento alla riunione di Teams copiato nell'esercizio precedente.
// Replace '' with the ACS user identity value const [userId, setUserId] = useState<string>(''); // Replace '' with the ACS token value const [token, setToken] = useState<string>(''); // Replace '' with the Teams meeting link value const [teamsMeetingLink, setTeamsMeetingLink] = useState<string>('');
Nota
Più avanti in questa esercitazione si vedrà come recuperare i
userId
valori ,token
eteamsMeetingLink
in modo dinamico.- Esaminare le
Dedicare qualche istante all'esplorazione delle
useMemo
funzioni nelApp
componente.- La
credential
useMemo
funzione crea una nuovaAzureCommunicationTokenCredential
istanza dopo che il token ha un valore. - La
callAdapterArgs
useMemo
funzione restituisce un oggetto con gli argomenti utilizzati per effettuare una chiamata audio/video. Si noti che usa iuserId
valori ,credential
eteamsMeetingLink
negli argomenti di chiamata ACS.
const credential = useMemo(() => { if (token) { return new AzureCommunicationTokenCredential(token) } return; }, [token]); const callAdapterArgs = useMemo(() => { if (userId && credential && displayName && teamsMeetingLink) { return { userId: fromFlatCommunicationIdentifier(userId) as CommunicationUserIdentifier, displayName, credential, locator: { meetingLink: teamsMeetingLink }, } } return {}; }, [userId, credential, displayName, teamsMeetingLink]);
Nota
useMemo
viene usato in questo scenario perché si vuole che l'oggetto e gli argomenti dell'adattatoreAzureCommunicationTokenCredential
di chiamata vengano creati una sola volta quando vengono passati i parametri necessari. Visualizza altri dettagli su useMemo qui.- La
credentials
Quando ecallAdapterArgs
sono pronti, la riga seguente gestisce la creazione di un adattatore di chiamata ACS usando l'hookuseAzureCommunicationCallAdapter
React fornito da ACS. L'oggettocallAdapter
verrà usato più avanti nell'interfaccia utente che chiama il componente composito.const callAdapter = useAzureCommunicationCallAdapter(callAdapterArgs);
Nota
Poiché
useAzureCommunicationCallAdapter
è un hook React, non assegnerà un valore acallAdapter
finché ilcallAdapterArgs
valore non è valido.In precedenza è stata assegnata l'identità utente, il token e il collegamento alla riunione di Teams ai valori di stato nel
App
componente. Questa operazione funziona correttamente per il momento, ma in un esercizio successivo si vedrà come recuperare dinamicamente tali valori. Poiché i valori sono stati impostati in precedenza, impostare come commento il codice nellauseEffect
funzione come illustrato di seguito. Dopo aver eseguito il Funzioni di Azure negli esercizi successivi, si rivisiterà questo codice.useEffect(() => { /* Commenting out for now const init = async () => { setMessage('Getting ACS user'); //Call Azure Function to get the ACS user identity and token let res = await fetch(process.env.REACT_APP_ACS_USER_FUNCTION as string); let user = await res.json(); setUserId(user.userId); setToken(user.token); setMessage('Getting Teams meeting link...'); //Call Azure Function to get the meeting link res = await fetch(process.env.REACT_APP_TEAMS_MEETING_FUNCTION as string); let link = await res.text(); setTeamsMeetingLink(link); setMessage(''); console.log('Teams meeting link', link); } init(); */ }, []);
Individuare il codice JSX seguente. Usa il
CallComposite
simbolo importato per eseguire il rendering dell'interfaccia utente usata per effettuare una chiamata audio/video dall'app React in una riunione di Teams. L'oggettocallAdapter
esaminato in precedenza viene passato alla relativaadapter
proprietà per fornire gli argomenti necessari.if (callAdapter) { return ( <div> <h1>Contact Customer Service</h1> <div className="wrapper"> <CallComposite adapter={callAdapter} /> </div> </div> ); }
Salvare il file prima di continuare.
Eseguire
npm start
nella finestra del terminale per eseguire l'applicazione. Assicurarsi di eseguire il comando all'interno della cartella react .Dopo la compilazione delle applicazioni dovrebbe essere visualizzata un'interfaccia utente chiamante. Abilita la selezione del microfono e della fotocamera e avvia la chiamata. Dovresti vedere che sei posizionato in una sala d'attesa. Se si partecipa alla riunione configurata in precedenza in Microsoft Teams, è possibile consentire all'ospite di partecipare alla riunione.
Premere CTRL+C per arrestare l'applicazione. Ora che l'esecuzione è stata eseguita correttamente, verrà illustrato come ottenere dinamicamente l'identità utente e il token ACS e creare automaticamente una riunione di Microsoft Teams e restituire l'URL di partecipazione usando Microsoft Graph.
Creare dinamicamente una riunione di Microsoft Teams con Microsoft Graph
In questo esercizio si automatizzerà il processo di creazione di un collegamento alla riunione di Microsoft Teams e il passaggio al servizio contenitore di Azure usando Funzioni di Azure e Microsoft Graph.
È necessario creare un'app Microsoft Entra ID per l'autenticazione dell'app Daemon. In questo passaggio l'autenticazione verrà gestita in background con le credenziali dell'app e un'app Microsoft Entra ID userà le autorizzazioni dell'applicazione per effettuare chiamate all'API Microsoft Graph. Microsoft Graph verrà usato per creare dinamicamente una riunione di Microsoft Teams e restituire l'URL della riunione di Teams.
Per creare un'app Microsoft Entra ID, seguire questa procedura:
- Passare a portale di Azure e selezionare Microsoft Entra ID.Go to portale di Azure and select Microsoft Entra ID.
- Selezionare la scheda Registrazione app seguita da + Nuova registrazione.
- Compilare i dettagli del modulo di registrazione dell'app come illustrato di seguito e selezionare Registra:
- Nome: App di interoperabilità di Teams ACS
- Tipi di account supportati: account in qualsiasi directory organizzativa (qualsiasi directory ID Di Microsoft Entra - Multi-tenant) e account Microsoft personali (ad esempio Skype, Xbox)
- URI di reindirizzamento: lasciare vuoto questo campo
- Dopo aver registrato l'app, passare a Autorizzazioni API e selezionare + Aggiungi un'autorizzazione.
- Selezionare Microsoft Graph seguito dalle autorizzazioni dell'applicazione.
- Selezionare l'autorizzazione
Calendars.ReadWrite
e quindi selezionare Aggiungi. - Dopo aver aggiunto le autorizzazioni, selezionare Concedi consenso amministratore per <YOUR_ORGANIZATION_NAME>.
- Passare alla scheda Certificati e segreti , selezionare + Nuovo segreto client e quindi selezionare Aggiungi.
- Copiare il valore del segreto in un file locale. Il valore verrà usato più avanti in questo esercizio.
- Passare alla scheda Panoramica e copiare i
Application (client) ID
valori eDirectory (tenant) ID
nello stesso file locale usato nel passaggio precedente.
Creazione di un file local.settings.json
samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions.sln
Aprire in Visual Studio o aprire la cartella GraphACSFunctions in Visual Studio Code.Passare al
GraphACSFunctions
progetto e creare unlocal.settings.json
file con i valori seguenti:{ "IsEncrypted": false, "Values": { "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "TENANT_ID": "", "CLIENT_ID": "", "CLIENT_SECRET": "", "USER_ID": "", "ACS_CONNECTION_STRING": "" }, "Host": { "LocalHttpPort": 7071, "CORS": "*", "CORSCredentials": false }, "watchDirectories": [ "Shared" ] }
- Usare i valori copiati nel file locale in un esercizio precedente per aggiornare i
TENANT_ID
valori eCLIENT_ID
CLIENT_SECRET
. - Definire
USER_ID
con l'ID utente che si vuole creare una riunione di Microsoft Teams.
È possibile ottenere l'ID utente dal portale di Azure.
- Accedere con l'account amministratore del tenant per sviluppatori di Microsoft 365.
- Seleziona Microsoft Entra ID
- Passare alla scheda Utenti sulla barra laterale.
- Cercare il nome utente e selezionarlo per visualizzare i dettagli dell'utente.
- All'interno dei dettagli dell'utente rappresenta
Object ID
l'oggettoUser ID
. Copiare ilObject ID
valore e usarlo per ilUSER_ID
valore in local.settings.json.
Nota
ACS_CONNECTION_STRING
verrà usato nell'esercizio successivo in modo che non sia necessario aggiornarlo ancora.- Usare i valori copiati nel file locale in un esercizio precedente per aggiornare i
Aprire
GraphACSFunctions.sln
la cartella acs-to-teams-meeting/server/csharp e notare che include i pacchetti Microsoft Graph e Identity seguenti:<PackageReference Include="Azure.Communication.Identity" Version="1.3.1" /> <PackageReference Include="Azure.Identity" Version="1.11.2" /> <PackageReference Include="Microsoft.Graph" Version="5.51.0" />
Passare a Program.cs e prendere nota del codice seguente nel
ConfigureServices
metodo :var host = new HostBuilder() .ConfigureFunctionsWebApplication() .ConfigureServices(services => { services.AddApplicationInsightsTelemetryWorkerService(); services.ConfigureFunctionsApplicationInsights(); services.AddSingleton(static p => { var config = p.GetRequiredService<IConfiguration>(); var clientSecretCredential = new ClientSecretCredential( config.GetValue<string>("TENANT_ID"), config.GetValue<string>("CLIENT_ID"), config.GetValue<string>("CLIENT_SECRET") ); return new GraphServiceClient( clientSecretCredential, ["https://graph.microsoft.com/.default"] ); }); ... services.AddSingleton<IGraphService, GraphService>(); }) .Build(); }
- Questo codice crea un
GraphServiceClient
oggetto che può essere usato per chiamare Microsoft Graph da Funzioni di Azure. Si tratta di un singleton e può essere inserito in altre classi. - È possibile effettuare chiamate all'API Microsoft Graph con autorizzazioni solo app (ad esempio Calendars.ReadWrite) passando un
ClientSecretCredential
valore alGraphServiceClient
costruttore.ClientSecretCredential
usa iTenant Id
valori eClient Id
Client Secret
dell'app Microsoft Entra ID.
- Questo codice crea un
Aprire Servizi/GraphService.cs.
Per esplorare il
CreateMeetingEventAsync
metodo, dedicare qualche istante:using System; using System.Threading.Tasks; using Microsoft.Graph; using Microsoft.Extensions.Configuration; namespace GraphACSFunctions.Services; public class GraphService : IGraphService { private readonly GraphServiceClient _graphServiceClient; private readonly IConfiguration _configuration; public GraphService(GraphServiceClient graphServiceClient, IConfiguration configuration) { _graphServiceClient = graphServiceClient; _configuration = configuration; } public async Task<string> CreateMeetingAsync() { var userId = _configuration.GetValue<string>("USER_ID"); var newMeeting = await _graphServiceClient .Users[userId] .Calendar .Events .PostAsync(new() { Subject = "Customer Service Meeting", Start = new() { DateTime = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss"), TimeZone = "UTC" }, End = new() { DateTime = DateTime.UtcNow.AddHours(1).ToString("yyyy-MM-ddTHH:mm:ss"), TimeZone = "UTC" }, IsOnlineMeeting = true }); return newMeeting.OnlineMeeting.JoinUrl; } }
Aprire TeamsMeetingFunctions.cs ed esaminare il costruttore. L'oggetto
GraphServiceClient
esaminato in precedenza viene inserito e assegnato al_graphService
campo.private readonly IGraphService _graphService; public TeamsMeetingFunction(IGraphService graphService) => _graphService = graphService;
Individuare il
Run
metodo :[Function("HttpTriggerTeamsUrl")] public async Task<HttpResponseData> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req, ILogger log) { var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteStringAsync(await _graphService.CreateMeetingAsync()); return response; }
- Definisce un nome di
HttpTriggerTeamsUrl
funzione che può essere chiamato con una richiesta HTTP GET. _graphService.CreateMeetingAsync()
Chiama , che crea un nuovo evento e restituisce l'URL di join.
- Definisce un nome di
Eseguire il programma premendo F5 in Visual Studio o selezionando Debug -> Avvia debug dal menu. Questa azione avvia il progetto Funzioni di Azure e rende disponibile la
ACSTokenFunction
chiamata.
Nota
Se si usa VS Code, è possibile aprire una finestra del terminale nella cartella GraphACSFunctions ed eseguire func start
. Si presuppone che nel computer sia installato Funzioni di Azure Core Tools.
Chiamata della funzione di Azure da React
Ora che la
httpTriggerTeamsUrl
funzione è pronta per l'uso, è possibile chiamarla dall'app React.Espandere la cartella client/react .
Aggiungere un file con estensione env nella cartella con i valori seguenti:
REACT_APP_TEAMS_MEETING_FUNCTION=http://localhost:7071/api/httpTriggerTeamsUrl REACT_APP_ACS_USER_FUNCTION=http://localhost:7071/api/httpTriggerAcsToken
Questi valori verranno passati a React durante la compilazione in modo che sia possibile modificarli facilmente in base alle esigenze durante il processo di compilazione.
Aprire il file client/react/App.tsx in VS Code.
Individuare la
teamsMeetingLink
variabile di stato nel componente. Rimuovere il collegamento hardcoded teams e sostituirlo con virgolette vuote:const [teamsMeetingLink, setTeamsMeetingLink] = useState<string>('');
Individuare la
useEffect
funzione e modificarla in modo che sia simile alla seguente. Questa operazione gestisce la chiamata alla funzione di Azure esaminata in precedenza, che crea una riunione di Teams e restituisce il collegamento di partecipazione alla riunione:useEffect(() => { const init = async () => { /* Commenting out for now setMessage('Getting ACS user'); //Call Azure Function to get the ACS user identity and token const res = await fetch(process.env.REACT_APP_ACS_USER_FUNCTION as string); const user = await res.json(); setUserId(user.userId); setToken(user.token); */ setMessage('Getting Teams meeting link...'); //Call Azure Function to get the meeting link const resTeams = await fetch(process.env.REACT_APP_TEAMS_MEETING_FUNCTION as string); const link = await resTeams.text(); setTeamsMeetingLink(link); setMessage(''); console.log('Teams meeting link', link); } init(); }, []);
Salvare il file prima di continuare.
Aprire una finestra del terminale,
cd
nella cartella *react ed eseguirenpm start
per compilare ed eseguire l'applicazione.Dopo la compilazione e il caricamento dell'applicazione, verrà visualizzata l'interfaccia utente chiamante ACS e sarà quindi possibile chiamare la riunione di Teams creata dinamicamente da Microsoft Graph.
Arrestare il processo del terminale immettendo CTRL+C nella finestra del terminale.
Arrestare il progetto di Funzioni di Azure.
Nota
Visitare la documentazione di Servizi di comunicazione di Azure per altre informazioni sull'estensione delle riunioni di Microsoft Teams in altri modi.
Creare dinamicamente un'identità e un token Servizi di comunicazione di Azure
In questo esercizio si apprenderà come recuperare dinamicamente i valori di identità utente e token da Servizi di comunicazione di Azure usando Funzioni di Azure. Una volta recuperati, i valori verranno passati al composito dell'interfaccia utente ACS per consentire l'esecuzione di una chiamata da parte di un cliente.
Aprire local.settings.json e aggiornare il
ACS_CONNECTION_STRING
valore con il stringa di connessione ACS salvato in un esercizio precedente.Aprire Startup.cs in Visual Studio ed esplorare la seconda
AddSingleton()
chiamata nelConfigureServices()
metodo .var host = new HostBuilder() .ConfigureFunctionsWebApplication() .ConfigureServices(services => { ... services.AddSingleton(static p => { var config = p.GetRequiredService<IConfiguration>(); var connectionString = config.GetValue<string>("ACS_CONNECTION_STRING"); return new CommunicationIdentityClient(connectionString); }); ... }) .Build(); }
La
AddSingleton()
chiamata crea unCommunicationIdentityClient
oggetto utilizzando ilACS_CONNECTION_STRING
valore di local.settings.json.Aprire ACSTokenFunction.cs e individuare il costruttore e le definizioni dei campi.
Viene definito un campo denominato
Scopes
che include l'ambitoCommunicationTokenScope.VoIP
. Questo ambito viene usato per creare il token di accesso per la videochiamata.private static readonly CommunicationTokenScope[] Scopes = [ CommunicationTokenScope.VoIP, ];
L'istanza
CommunicationIdentityClient
singleton creata in Startup.cs viene inserita nel costruttore e assegnata al_tokenClient
campo.private readonly CommunicationIdentityClient _tokenClient; public ACSTokenFunction(CommunicationIdentityClient tokenClient) { _tokenClient = tokenClient; }
Esplorare il
Run()
metodo in ACSTokenFunction.cs:[Function("HttpTriggerAcsToken")] public async Task<HttpResponseData> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req, ILogger log) { var user = await _tokenClient.CreateUserAsync(); var userToken = await _tokenClient.GetTokenAsync(user, Scopes); var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteAsJsonAsync( new { userId = user.Value.Id, userToken.Value.Token, userToken.Value.ExpiresOn } ); return response; }
- Definisce una funzione denominata di
HttpTriggerAcsToken
che può essere chiamata con una richiesta HTTP GET. - Un nuovo utente ACS viene creato chiamando il
_tokenClient.CreateUserAsync()
metodo . - Un token di accesso usato per le videochiamate viene creato chiamando il
_tokenClient. GetTokenAsync()
metodo . - L'ID utente e il token vengono restituiti dalla funzione come oggetto JSON.
- Definisce una funzione denominata di
Eseguire il programma premendo F5 in Visual Studio o selezionando Debug -> Avvia debug dal menu. Verrà avviato il progetto Funzioni di Azure e reso disponibile per la
ACSTokenFunction
chiamata.Nota
Se si usa VS Code, è possibile aprire una finestra del terminale nella cartella GraphACSFunctions ed eseguire
func start
. Si presuppone che nel computer sia installato Funzioni di Azure Core Tools.Ora che l'Funzioni di Azure è in esecuzione in locale, il client deve essere in grado di chiamarli per ottenere i valori dell'identità utente e del token ACS.
Aprire il file samples/acs-to-teams-meeting/client/react/App.tsx nell'editor.
Individuare le
userId
variabili di stato etoken
nel componente. Rimuovere i valori hardcoded e sostituirli con virgolette vuote:const [userId, setUserId] = useState<string>(''); const [token, setToken] = useState<string>('');
Individuare la
useEffect
funzione e modificarla in modo che sia simile alla seguente per abilitare la chiamata alla funzione di Azure per recuperare un'identità utente e un token ACS:useEffect(() => { const init = async () => { setMessage('Getting ACS user'); //Call Azure Function to get the ACS user identity and token let res = await fetch(process.env.REACT_APP_ACS_USER_FUNCTION as string); let user = await res.json(); setUserId(user.userId); setToken(user.token); setMessage('Getting Teams meeting link...'); //Call Azure Function to get the meeting link res = await fetch(process.env.REACT_APP_TEAMS_MEETING_FUNCTION as string); let link = await res.text(); setTeamsMeetingLink(link); setMessage(''); console.log('Teams meeting link', link); } init(); }, []);
Salvare il file prima di continuare.
Aprire una finestra del terminale ed eseguire
npm start
nellareact
cartella . Dopo la compilazione e il caricamento, verrà visualizzata l'interfaccia utente chiamante ACS ed è possibile chiamare la riunione di Teams creata dinamicamente da Microsoft Graph.Arrestare l'app React premendo CTRL+C nella finestra del terminale.
Arrestare il progetto di Funzioni di Azure.
Eseguire il commit delle modifiche Git ed eseguirne il push nel repository GitHub usando Visual Studio Code:
- Selezionare l'icona Controllo del codice sorgente (terza giù nella barra degli strumenti di Visual Studio Code).
- Immettere un messaggio di commit e selezionare Commit.
- Selezionare Sincronizza modifiche.
Distribuire l'app in app Funzioni di Azure e Azure Container
Importante
Oltre ai prerequisiti elencati per questa esercitazione, è anche necessario installare gli strumenti seguenti nel computer per completare questo esercizio.
- Interfaccia della riga di comando di Azure
- Se si usa VS Code, installare l'estensione Funzioni di Azure
In questo esercizio si apprenderà come distribuire le funzioni Microsoft Graph e ACS descritte negli esercizi precedenti in Funzioni di Azure. Si creerà anche un'immagine del contenitore e la si distribuirà in App Contenitore di Azure.
Distribuire in Funzioni di Azure
Nota
Questa sezione usa Visual Studio per pubblicare le funzioni C# in Azure. Se si preferisce usare Visual Studio Code, è possibile seguire le istruzioni della guida introduttiva Creare una funzione C# in Azure con Visual Studio Code .
Aprire il
samples/acs-video-to-teams-meeting/server/csharp/GraphACSFunctions.sln
progetto in Visual Studio.Fare clic con il pulsante destro del mouse sul
GraphACSFunctions
progetto e scegliere Pubblica.Selezionare Azure nella sezione di destinazione e quindi fare clic su Avanti.
Selezionare App per le funzioni di Azure (Windows) e quindi fare clic su Avanti.
Selezionare la sottoscrizione e quindi + Crea nuovo.
Immettere le informazioni seguenti:
- Nome funzione: è necessario un nome univoco globale. Esempio: acsFunctions<YOUR_LAST_NAME>.
- Sottoscrizione: selezionare la propria sottoscrizione.
- Gruppo di risorse: selezionare un gruppo di risorse creato in precedenza in questa esercitazione oppure crearne uno nuovo.
- Piano di hosting: piano a consumo.
- Località: selezionare l'area in cui si vuole eseguire la distribuzione.
- Archiviazione di Azure: crearne uno nuovo. È anche possibile selezionare un account di archiviazione esistente.
- Azure Insights: crearne uno nuovo. È anche possibile selezionare un account di archiviazione esistente.
Nota
È necessario un nome univoco globale. È possibile rendere il nome più univoco aggiungendo un numero o il cognome alla fine del nome.
Dopo aver creato l'app per le funzioni di Azure, verrà visualizzata una schermata di conferma. Assicurarsi che l'opzione Esegui dal pacchetto sia selezionata e quindi selezionare Fine.
Selezionare Pubblica per distribuire la funzione in Azure.
Dopo aver distribuito la funzione in Azure, passare al portale di Azure e selezionare l'app per le funzioni creata.
Copiare l'URL per la funzione distribuita. Il valore verrà usato più avanti in questo esercizio.
Selezionare Impostazioni -> Configurazione nel menu a sinistra.
Selezionare + Nuovo pulsante di impostazione dell'applicazione e aggiungere le chiavi e i valori seguenti nelle impostazioni dell'applicazione. È possibile recuperare questi valori da
local.settings.json
nelGraphACSFunctions
progetto.# Retrieve these values from local.settings.json TENANT_ID: <YOUR_VALUE> CLIENT_ID: <YOUR_VALUE> CLIENT_SECRET: <YOUR_VALUE> USER_ID: <YOUR_VALUE> ACS_CONNECTION_STRING: <YOUR_VALUE>
Selezionare il pulsante Salva per salvare le impostazioni.
Infine, è necessario abilitare CORS (Condivisione risorse tra le origini) per l'app per le funzioni per rendere le API dell'app per le funzioni accessibili dall'esterno del dominio. Selezionare Impostazioni -> CORS nel menu a sinistra.
Immettere
*
(accessibile da qualsiasi dominio) nella casella di testo Origini consentite e quindi selezionare il pulsante Salva .
Eseguire la distribuzione in App Azure Container
La prima attività che verrà eseguita consiste nel creare una nuova risorsa Registro Azure Container (ACR). Dopo aver creato il Registro di sistema, si creerà un'immagine ed eseguirà il push nel Registro di sistema.
Aprire una finestra di comando ed eseguire il comando seguente per accedere alla sottoscrizione di Azure:
az login
Aggiungere le variabili della shell seguenti sostituendo i valori per i segnaposto in base alle esigenze. Aggiungere il <GITHUB_USERNAME> come valore minuscolo e sostituire il dominio Funzioni di Azure per il< valore AZURE_FUNCTIONS_DOMAIN> (includere
https://
nel valore di dominio).GITHUB_USERNAME="<YOUR_GITHUB_USERNAME>" RESOURCE_GROUP="<YOUR_RESOURCE_GROUP_NAME>" ACR_NAME="aca"$GITHUB_USERNAME AZURE_FUNCTIONS_DOMAIN="<YOUR_AZURE_FUNCTIONS_URL>"
Creare una nuova risorsa Registro Azure Container eseguendo il comando seguente:
az acr create \ --resource-group $RESOURCE_GROUP \ --name $ACR_NAME \ --sku Basic \ --admin-enabled true
Aprire il file client/react/Dockerfile nell'editor e notare che vengono eseguite le attività seguenti:
- L'applicazione React viene compilata e assegnata alla fase di compilazione .
- Il server nginx è configurato e l'output della fase di compilazione viene copiato nell'immagine del server nginx.
Compilare l'immagine del contenitore in Azure eseguendo il comando seguente dalla radice della cartella client/react . Sostituire <YOUR_FUNCTIONS_DOMAIN> con il dominio Funzioni di Azure copiato in un file locale in precedenza in questo esercizio.
az acr build --registry $ACR_NAME --image acs-to-teams-meeting \ --build-arg REACT_APP_ACS_USER_FUNCTION=$AZURE_FUNCTIONS_DOMAIN/api/httpTriggerAcsToken \ --build-arg REACT_APP_TEAMS_MEETING_FUNCTION=$AZURE_FUNCTIONS_DOMAIN/api/httpTriggerTeamsUrl .
Eseguire il comando seguente per elencare le immagini nel Registro di sistema. Verrà visualizzata la nuova immagine elencata.
az acr repository list --name $ACR_NAME --output table
Dopo aver distribuito l'immagine, è necessario creare un'app contenitore di Azure in grado di eseguire il contenitore.
Visitare il portale di Azure nel browser e accedere.
Digitare app contenitore nella barra di ricerca superiore e selezionare App contenitore nelle opzioni visualizzate.
Selezionare Crea sulla barra degli strumenti.
Nota
Anche se si usa il portale di Azure, è anche possibile creare un'app contenitore usando l'interfaccia della riga di comando di Azure. Per altre informazioni, vedere Avvio rapido: Distribuire la prima app contenitore. Verrà illustrato un esempio di come usare l'interfaccia della riga di comando di Azure anche alla fine di questo esercizio.
Eseguire le attività seguenti:
- Selezionare la propria sottoscrizione.
- Selezionare il gruppo di risorse da usare (crearne uno nuovo, se necessario). Se si vuole, è possibile usare lo stesso gruppo di risorse usato per la risorsa ACS. Copiare il nome del gruppo di risorse nello stesso file locale in cui è stato archiviato il dominio Funzioni di Azure.
- Immettere il nome di un'app contenitore acs-to-teams-meeting.
- Scegliere un'area.
- Selezionare Crea nuovo nella sezione Ambiente app contenitore.
- Immettere un nome ambiente acs-to-teams-meeting-env.
- Selezionare il pulsante Crea.
- Selezionare Avanti: Impostazioni >app .
Immettere i valori seguenti nella schermata Crea app contenitore:
- Deselezionare la casella di controllo Usa immagine di avvio rapido.
- Nome: acs-to-teams-meeting
- Origine immagine: Registro Azure Container
- Registro di sistema>: <YOUR_ACR_REGISTRY_NAME.azurecr.io
- Immagine: acs-to-teams-meeting
- Tag immagine: latest
- CPU e memoria: 0,25 core CPU, -.5 Gi di memoria
Nella sezione Impostazioni ingresso applicazione seguire questa procedura:
- Seleziona la casella di controllo Abilitato.
- Selezionare il pulsante di opzione Accetta traffico da qualsiasi posizione .
Verrà creato un punto di ingresso (ingresso) per l'applicazione React e verrà chiamato da qualsiasi posizione. App Azure Container reindirizza tutto il traffico a HTTPS.
- Porta di destinazione: 80
Selezionare Rivedi e crea. Al termine della convalida, selezionare il pulsante Crea .
Se viene visualizzato un errore, potrebbe essere dovuto all'ambiente delle app contenitore inattivo per troppo tempo. La soluzione più semplice consiste nell'eseguire di nuovo il processo di creazione dell'app contenitore. In alternativa, è possibile eseguire il comando seguente per creare l'app contenitore usando l'interfaccia della riga di comando di Azure:
az containerapp create --name acs-to-teams-meeting --resource-group $RESOURCE_GROUP \ --location westus --image acs-to-teams-meeting \ --cpu 0.25 --memory 0.5 --environment-name acs-to-teams-meeting-env \ --ingress-enabled true --ingress-target-port 80 --ingress-type External \ --ingress-protocol Https --ingress-traffic Anywhere
Al termine della distribuzione dell'app contenitore, passare a esso nel portale di Azure e selezionare l'URL dell'applicazione nella schermata Panoramica per visualizzare l'applicazione in esecuzione nel contenitore nginx.
Complimenti.
Questa esercitazione è stata completata
Hai un problema con questa sezione? In caso di problemi, fornisci feedback per contribuire al miglioramento della sezione.